Ubuntu和ROS相关的学习记录
- 0. 开始之前
- 1. 相关Ubuntu指令
- 2. Ubuntu安装(20.04)
- 3. ROS安装(Noetic对应的版本)
- 4. Ubuntu相关软件软件安装
- 1. Vs code安装
- 5. Gazebo相关
- 1 bingda_tutorial的例子
- 2 宇树四足机器人的例子
- 3 Gazebo ROS_control的例子
- 4 Gazebo自己写控制器的例子
- 5 宇树机器人GO2相关的教程
- 6. 其他
- 1 把自己代码同步到github的方法:
0. 开始之前
在开始之前强烈推荐赵虚左老师的教程及其课件(来自此网页)
1. 相关Ubuntu指令
- 无法复制文件
在被复制文件夹中:右键,Open in terminal,输入:
sudo chown -R 你的用户名 .ls -l查看权限是否由“root”改为了“你的用户名”
- 单独编译功能包
在catkin_ws下,输入:
catkin_make --pkg src中的包的名字- 更新软件
sudo apt-get updateCtrl+H显示隐藏文件
有关上网的教程(因为我是ROS1,所以未验证,以后试一试,来自于up主的视频、文档、博客主页)
我试了一下,最后花了很长时间才下载下来,下载了以后解压,在文件目录下右键打开终端,输入:
/.cfwProfiles的设置跟windows的一样,打开后还没完,在ubuntu进行如下设置才能用:
- 虚拟机如何使用主机的VPN?
参考如何虚拟机共享主机VPN连接
- 怎么打开bachrc?
sudo gedit ~/.bashrc- 如何新建ROS包,继而在ROS包里新建节点?
(如果没有创建工作空间可通过以下方法创建工作空间并编译:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make)
cd ~/catkin_ws/srccatkin_create_pkg your_package_name std_msgs rospy roscpp- 一个小例子展示如何新建包,创建节点,发布和读取内容
创建名为“my_package”的包:
cd ~/catkin_ws/src catkin_create_pkg my_package_name std_msgs rospy roscpp新建文件,文件架构如下:
my_package/ ├── src/ │ ├── publisher_node.cpp │ ├── subscriber_node.cpp ├── CMakeLists.txtpublisher_node.cpp中的代码:
#include<ros/ros.h>#include<std_msgs/String.h>intmain(intargc,char**argv){ros::init(argc,argv,"publisher_node");ros::NodeHandle nh;ros::Publisher pub=nh.advertise<std_msgs::String>("chatter",10);ros::Raterate(1);while(ros::ok()){std_msgs::String msg;msg.data="Hello from Publisher!";pub.publish(msg);rate.sleep();}return0;}subscriber_node.cpp中的代码:
#include<ros/ros.h>#include<std_msgs/String.h>voidcallback(conststd_msgs::String::ConstPtr&msg){ROS_INFO("Subscriber received: %s",msg->data.c_str());}intmain(intargc,char**argv){ros::init(argc,argv,"subscriber_node");ros::NodeHandle nh;ros::Subscriber sub=nh.subscribe("chatter",10,callback);ros::spin();return0;}在my_package/CmakeList.txt中加入如下代码:
add_executable(publisher_node src/publisher_node.cpp)target_link_libraries(publisher_node ${catkin_LIBRARIES})add_executable(subscriber_node src/subscriber_node.cpp)target_link_libraries(subscriber_node ${catkin_LIBRARIES})编译:
cd~/catkin_ws catkin_make因为刚编译完,所以要更新一下:
source devel/setup.bash打开一个终端,运行ROS:
roscore再打开一个终端,运行publisher_node节点:
rosrun my_package publisher_node再打开一个终端,运行subscriber_node节点:
rosrun my_package subscriber_node此时运行subscriber_node节点的终端会显示:
- 一些指令:
显示ros的topic:
rostopic list查看话题消息内容:
rostopic echo /my_topic- 如何用命令行在Ubuntu里安装软件?
(参考在 Ubuntu 上安装.deb软件包有几种方法)
sudo dpkg -i /安装包的路径/package.deb比如
sudo dpkg -i ~/Downloads/QQ_3.2.16_250401_amd64_01.deb或者在安装包目录下:
sudo apt install./package.deb如何截图?
Alt+PrintScreen(截取当前窗口)或者PrintScreen(截取全屏)或者Shift+PrintScreen(截取自定义区域)
截图保存在/home/Pictures中可以用ubuntu自带Shotwell 图形工具裁剪图片
双系统重装windows以后,启动界面没有Ubuntu了,怎么办?
参考网页双系统Ubuntu如何扩容?
参考博客,亲测可用。
2. Ubuntu安装(20.04)
- Thinkpad T480 Win10 64位安装Ubuntu20.04(只记录要点)
(参考Windows 和 Ubuntu 双系统的安装和卸载和Win10 安装 Ubuntu 20.04 双系统完美避坑教程 (非虚拟机))(卸载参考Win10 + Ubuntu 双系统完美避坑删除 Ubuntu 教程,这个教程卸载后要自己修复下windows的引导,我用的WePE)
1.1 启动盘我用的软件是balenaEtcher,启动盘制作和Ubuntu镜像下载不再赘述
1.2 C盘压缩出大约30G,D盘压缩出大约20G。
我的是GPT分区(在磁盘管理中,右键要安装Ubuntu系统的磁盘,选择“属性-卷”,我的是“GUID分区表(GPT)“,此为GPT分区),设置电脑bios为uefi启动,这个原来就是uefi
1.3 设置优盘启动,进入安装界面后,我直接选英文,不联网,勾选”Normal installation“,选择”Something else“,然后分区。
分区要注意:
选中未分配的分区,点+号,分500 Mb用于efi系统分区(Use as: EFI System Partition);
分10,000 Mb用于交换空间swap area(Use as: swap area);
分大概20G用于根分区("Use as: Ext4 journaling file system"不用改,保持默认,Mount point(挂载点): / );
最后的空间都给home("Use as: Ext4 journaling file system"不用改,保持默认,Mount point: /home )
最后一步很重要,否则没有引导:Device for boot loader installation(安装启动引导区设备):选500 Mb的efi系统分区
1.4 在设置里添加中文输入法,参考在Ubuntu20.04中安装中文输入法
1.5 自带的火狐浏览器不能播放b站等网页视频(参考ubuntu系统无法播放B站视频或一直加载和ubuntu20.04自带的火狐浏览器无法播放B站等其他视频怎么办)
在终端中输入:
sudo apt-get update sudo apt-get install -y ffmpeg然后关了浏览器重开一下就行了
1.6 时间同步问题
(参考Windows 和 Ubuntu 双系统的安装和卸载)
在终端中输入:
sudo apt install ntpdate sudo ntpdate time.windows.com sudo hwclock--localtime--systohc- ThinkBook 16P Win11 64位安装Ubuntu20.04(只记录要点)
2.1 启动盘我用的软件是balenaEtcher,启动盘制作和Ubuntu镜像下载不再赘述。
2.2 我的配置是2个1T的固态,C盘和D盘各500G,E盘是1T。
我在E盘压缩出大约700G(右击E盘-压缩卷-输入700,000(为了省事我就直接输入700,000了,反正空间够用))。
我的是GPT分区(在磁盘管理中,右键要安装Ubuntu系统的磁盘,选择“属性-卷”,我的是“GUID分区表(GPT)“,此为GPT分区),设置电脑bios为uefi启动,这个原来就是uefi。
还要关闭Bitlocker(否则进入Windows时提示输入BitLocker 恢复密钥,恢复密钥从这个网站找,我随便输了一个就进系统登录界面了,然后重新登陆)。
Win11关闭Bitlocker的方法:设置-隐私和安全性-设备加密,关闭设备加密即可。
2.3 插入启动优盘后重启进入BIOS,在BIOS中关闭安全启动(快速启动没找到先不管他),设置优盘启动。
2.4 进入安装界面后,我直接选英文,连了网,勾选”Normal installation“,取消勾选”Download updates while installing Ubuntu“ ,选择”Something else“,然后分区,分区要注意:
选中第二个固态,也就是nvme1下的“free space”,即未分配的分区,点+号,分2,000 Mb用于efi系统分区(Use as: EFI System Partition);
分68,000 Mb用于交换空间(Use as: swap area);
分130,000 Mb用于根分区("Use as: Ext4 journaling file system"不用改,保持默认,Mount point(挂载点): / );
最后的空间都给home("Use as: Ext4 journaling file system"不用改,保持默认,Mount point: /home )
最后一步很重要,否则没有引导:Device for boot loader installation(安装启动引导区设备):选2,000 Mb的efi系统分区,我这里的分区名字为:/dev/nvme1n1p3 efi。
选择时区:shanghai。
中文输入法等问题参考Thinkad的安装。
- DELL Precision 7920 Win11 64位安装Ubuntu24.04(只记录要点)
分区要注意下,看这个视频即可,很全。
3. ROS安装(Noetic对应的版本)
按照这个教程来就行:ROS入门教程-安装并配置ROS环境(Noetic版本),但是这个教程里的第一步的清华源有点问题,换成ROS安装里的中国科技大学镜像源就好了:
sudo sh-c './etc/lsb-release&&echo"deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main">/etc/apt/sources.list.d/ros-latest.list'rosdep init或rosdep update大概率会遇到问题:ERROR: cannot download default sources list,参考:彻底解决ROS安装中 rosdep ERROR: cannot download default sources list的问题
我第二次安装的时候有点问题,卸载ROS:
//先卸载ros包sudo apt-get purge ros-*//删除ros相关依赖和配置sudo apt-get autoremove(参考:ROS的卸载与安装)
(其他内容参考(换阿里的镜像等):ROS安装)
4. Ubuntu相关软件软件安装
1. Vs code安装
下载地址
在软件包目录下打开终端
sudo dpkg -i code_1.99.0-1743632463_amd64.deb5. Gazebo相关
1 bingda_tutorial的例子
1.参考网页
2.相关包:
models、bingda_tutorials(在home/catkin_ws/src下打开终端,输入:
git clone https://gitee.com/bingda-robot/bingda_tutorials可以直接把文件下载到里面)
相关资料:urdf相关资料、xacro相关资料、 element
3.启动
按照:
roslaunch 包的名称 launch文件的名称启动Gazebo
输入:
roslaunch bingda_tutorials simulation_robot.launch启动带有模型的Gazebo
输入:
rostopic list查看topic
输入:
rostopic info /com_vel查看com_vel topic
另外打开一个终端,输入:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py打开控制器。
如果提示报错,找不到这个文件,参照网页
输入:
sudo apt-get install ros-noetic-teleop-twist-keyboard再输入:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py即可打开控制器。
2 宇树四足机器人的例子
2.1 LCM库安装
LCM(Lightweight Communications and Marshalling)是一组用于消息传递和数据编组的库和工具,其基于UDP传输的属性,传输速度较快,其目标是高带宽和低延迟的实时系统。它提供了一种发布/订阅消息传递模型以及带有各种编程语言C++、Java、python等应用程序绑定的自动编组/解组代码生成,LCM通过将消息封装在不同的Channel中进行通信,这点类似于ROS中的Topic。
网址:
1.GitHub - lcm-proj/lcm: Lightweight Communications and Marshalling
2.LCM Documentation — LCM documentation
3.LCM库的简单使用-腾讯云开发者社区-腾讯云
安装编译依赖:
sudo apt-get install build-essential autoconf automake autopoint libglib2.0-dev libtool openjdk-8-jdk python-devGitHub上下载releases,我下载的是V1.5.0版本:
将下载的压缩包解压到主目录:
进入 lcm-1.5.0打开终端输入:
mkdir build cd build cmake..make sudo make install上面完成了LCM的安装。然后告诉系统lib的库所在位置:
exportLCM_INSTALL_DIR=/usr/local/lib sudo sh-c"echo $LCM_INSTALL_DIR> /etc/ld.so.conf.d/lcm.conf"sudo ldconfig配置pkgconfig:
exportPKG_CONFIG_PATH=$PKG_CONFIG_PATH:$LCM_INSTALL_DIR/pkgconfig以上步骤都完成后:输入指令lcm-tester以测试是否已经安装 LCM。 若终端显示的内容与下图类似,则表示已经安装 LCM。
pthread库:一个多线程库。
运行 getconf GNU_LIBPTHREAD_VERSION 命令以测试是否已经安装pthread库。若可以显示版本信息,则说明 pthread 库已经安装。
到宇树Github下载这三个文件:
1.unitree_guide
2.unitree_ros
3.unitree_legged_msgs
下载完成后的目录结构如下:
编译:
打开一个终端,并将工作路经切换至包含 unitree_guide 工程的 ros 工作空间的根目录下(本文假设该路经为 ~/catkin_ws ),并在终端输入下列命令开始编译该工程: catkin_make
编译通过后,显示如下:进度条100%
如果出现报错,就安装对应的包。
报错:
报错1
比如出现这个报错:Could not find the required component ‘move base msgs’. The followingCMake eror indicates that you either need to install the package with the same name orchange your environment so that it can be found.
原因:此报错是由于move_base_msgs缺失引起的,使用如下命令安装这个功能包:
sudo apt-get install ros-noetic-navigation报错2:
pip3 install pyyaml报错3:
AttributeError: module ‘em’ has no attribute ‘RAW_OPT’
解决办法:
pip3 install empy==3.3.4其他类似报错参考:开源四足机器人代码踩坑指南
运行 Gazebo 仿真环境
在同一个终端中,执行下列命令:
source./devel/setup.bash然后执行下列命令来打开 Gazebo 仿真环境:
roslaunch unitree_guide gazeboSim.launch出现报错:
解决方法:
pip3 install rospkg正确运行后,会跳出 Gazebo 仿真器窗口,并且 Go1 机器人会躺在仿真环境中的地面上。要想让机器人动起来,还需要启动控制器。
启动控制器:
在devel/lib/unitree_guide/下输入:
./junior_ctrl(参考unitree_guide配置、自主导航ROS仿真和开源四足机器人代码踩坑指南)
我还遇到了其他在编译中报错的情况:CMake Error at unitree_ros/unitree_controller/CMakeLists.txt:41 (target_link_libraries): Target "joint_state_listener" of type EXECUTABLE may not be linked into another target. One may link only to INTERFACE, OBJECT, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set.
其实是因为我在catkin_ws这个空间下自己写了其他的例子,里面有joint_state_listener这个节点,在之前已经被编译为可执行文件了,所以报这个错,跟宇树的冲突了(通过grep -rnw . -e 'target_link_libraries(.*joint_state_listener'找的位置),重新建一个工作空间(unitree_ws)就好了。
因为是新建了工作空间,在启动控制器前设置一下环境:
echo "source ~/unitree_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc3 Gazebo ROS_control的例子
(参考网页,例子源码)
- 安装功能包
sudo apt-get install ros-noetic-ros-control ros-noetic-ros-controllers- 使用roslaunch启动控制器
刚下载了人家的代码,启动前要编译和更新一下
cd~/catkin_ws catkin_make source devel/setup.bash启动ROS
roscore启动环境
roslaunch rrbot_gazebo rrbot_world.launch启动关节控制器
roslaunch rrbot_control rrbot_control.launch报错:RLException: [rrbot_control.launch] is neither a launch file in package [rrbot_control] nor is [rrbot_control] a launch file name
The traceback for the exception was written to the log file
(参考网页)在src文件夹下输入
wstool init在catkin_ws下输入
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc再运行下面命令,可以找到rotors包,就说明没有问题了
rospack find rrbot_control再次启动关节控制器
roslaunch rrbot_control rrbot_control.launch发送命令测试
rostopic pub -1 /rrbot/joint1_position_controller/command std_msgs/Float64 "data: 1.5"4 Gazebo自己写控制器的例子
(参考:网页中接口的定义,接着“2 Gazebo ROS_control的例子“继续下面的流程)
我一直在找怎么样能把控制量直接传给gazebo里的驱动器,其实很简单,用"effort_controllers/JointEffortController"接受力矩指令,直接输出力指令就行了(PID闭环在这里无效)。
修改rrbot_control.yaml为:
rrbot:#Publish all joint states-----------------------------------joint_state_controller:type:joint_state_controller/JointStateController publish_rate:50#Position Controllers---------------------------------------joint1_position_controller:type:effort_controllers/JointEffortController joint:joint1 pid:{p:0,i:0,d:0}joint2_position_controller:type:effort_controllers/JointEffortController joint:joint2 pid:{p:0,i:0,d:0}在catkin_ws/src下新建一个包(test_states)做测试:
cd ~/catkin_ws/src catkin_create_pkg test_states std_msgs rospy roscpp sensor_msgs在catkin_ws/src/test_states/src下新建display_states.cpp:
#include<ros/ros.h>#include<sensor_msgs/JointState.h>#include<std_msgs/Float64.h>// 全局Publisher(避免在回调中重复创建)ros::Publisher effort_pub;voidjointStateCallback(constsensor_msgs::JointState::ConstPtr&msg){/* for (size_t i = 0; i < msg->name.size(); ++i) { ROS_INFO("Joint %s: position = %f", msg->name[i].c_str(), msg->position[i]); } */// C++ 示例std_msgs::Float64 cmd;cmd.data=10*(1.5-msg->position[1]);// 力矩值,自己写了个简单的p控制effort_pub.publish(cmd);// 可选:打印当前关节状态ROS_INFO_THROTTLE(1.0,"Received joint states, sending effort command: %.2f",cmd.data);}intmain(intargc,char**argv){ros::init(argc,argv,"joint_state_listener");ros::NodeHandle nh;// 初始化Publisher(只在main中创建一次)effort_pub=nh.advertise<std_msgs::Float64>("/rrbot/joint2_position_controller/command",10);ros::Subscriber sub=nh.subscribe("/rrbot/joint_states",10,jointStateCallback);ROS_INFO("Node started, waiting for joint states...");ros::spin();return0;}在test_states/CmakeList.txt中加入如下代码:
find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs)add_executable(joint_state_listener src/display_states.cpp)target_link_libraries(joint_state_listener ${catkin_LIBRARIES})编译:
cd~/catkin_ws catkin_make因为刚编译完,所以要更新一下:
source devel/setup.bash接着,启动ROS
roscore启动环境
roslaunch rrbot_gazebo rrbot_world.launch启动关节控制器
roslaunch rrbot_control rrbot_control.launch启动刚才写的joint_state_listener节点
rosrun test_states joint_state_listener结果如下图所示:
5 宇树机器人GO2相关的教程
参考在宇树机器人a1的代码中将a1替换为go2的模型、GO2官方仿真项目源码英文、中文、Go2 SDK 开发指南。
安装mujoco的时候一定要装3.2.7,否则编译unitree_mujoco的时候会报错:error: ‘const mjData’ {aka ‘const struct mjData_’} has no member named ‘solver_nisland’; did you mean ‘solver_niter’?
安装3.2.7的方法:
下载源码到opt文件夹中:
git clone https://github.com/deepmind/mujoco.git然后切换到 3.2.7 版本:
cd mujoco git checkout tags/3.2.7然后:
mkdir build && cd build cmake .. make -j4 sudo make install其他操作跟GO2官方仿真项目源码一致。
6. 其他
1 把自己代码同步到github的方法:
- 安装git.
- 配置git用户名和邮箱
如果是ubuntu,直接在终端中输入(如果是windows,随便找个文件夹右键Git Bash Here):
git config--global user.name"用户名"//设置全局的 Git 用户名git config--global user.email"邮箱地址"//设置全局的 Git 用户邮箱。查看是否成功:
git config--list- 在github中创建一个新的仓库
- 通过ssh连接github
生成密钥:
ssh-keygen-t rsa-C"邮箱地址"//按下三次回车,生成公钥和私钥两个文件在.ssh下新建名为config的文件,写入:
Host github.com HostName ssh.github.com User git Port443PreferredAuthentications publickey IdentityFile~/.ssh/id_rsa将id_rsa.pub的公钥文件的所有内容复制,进入github设置里找到配置ssh的选项
settings -> SSH and GPG keys
自己设置个名字,输入刚才复制的密钥,然后Add SSH key
- 进入vscode工作区,选中需要添加到仓库里的文件夹,右击终端打开,在终端里输入以下命令:
touch README.md//新建一个README文档git init//仓库初始化git add README.md//添加readme.md文件git add.git commit-m"first commit"//提交git branch-M main//构建分支git remote add origin git@github.com:github的用户名/仓库名字//连接到远程仓库git push-u origin main//推送- 代码有更新以后,源代码管理那里会有变化
点击:
Source control -> changes -> … (右上角的more actions) -> Stage All Changes
然后:
Source control -> changes -> … -> Commit All
然后:
Source control -> changes -> … -> Push to… -> 选择自己的仓库
大功告成!
参考:
[1] vscode如何连接github/gitee远程仓库详细步骤
[2] Visual Studio Code结合Git与GitHub的完整步骤
[3] Git本地仓库和GitHub远程库的关联步骤
[4] VSCode中使用github