这段时间准备学习ROS,写个博客记录下,方便查阅。
这些知识大部分都是ROS官网教程的复现。
1、创建ROS工作空间
运行命令:
mkdir -p ~/catkin_ws/src (创建一个文件夹)
cd ~/catkin_ws/ (进入文件夹)
catkin_make (创建工作空间)
#如果是python用catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
2、准备工作
安装ros-tutorials程序包:sudo apt-get install ros-“noetic”-ros-tutorials
3、创建ROS程序包
运行命令:
cd ~/catkin_ws/src(进入文件)
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp(创建一个名为beginner_tutorials的程序包,这个程序包依赖std_msgs,rospy,roscpp这三个包)
4、了解ROS
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。
4.1ROS节点
roscore:运行行所有ROS程序前首先要运行的命令,给我的感觉就像是一个启动器。
rosnode:运行的节点。比如上一篇博客测试ROS用的那几行命令:1、roscore;2、rosrun turtlesim turtlesim_node;3、rosrun turtlesim turtle_teleop_key。每一个命令产生一个节点,如下图。
rosrun:使用包名直接运行一个包内的节点。还是以上篇博客测试用的命令举例,第二个命令运行turtlesim包里面的turtlesim_node节点。第三行命令运行turtlesim包中的turtle_teleop_key节点。
4.2ROS话题
通过以下两行命令安装rqt_graph,以便创建一个显示当前系统运行情况的动态图形。
sudo apt-get install ros-“noetic”-rqt
sudo apt-get install ros-“noetic”-rqt-common-plugins
运行命令:rosrun rqt_graph rqt_graph得到当前系统运行情况的动态图。
我运行着在上篇博客里面的测试例子。动态图显示有“/teteop_turle”和“/turtlesim”两个节点正在通过“/turtle1/cmd_vel”这个话题,进行交互。
通过命令rostopic echo + 话题名 可以显示这个话题发布的消息。
运行rostopic echo /turtle1/cmd_vel
我运行了上面命令,然后换到能控制乌龟移动的终端,按下方向键,在输入上面命令的终端中就即时显示出信息,这个信息就是/turtle1/cmd_vel话题上发布的信息。
我们再建立一个终端,然后运行rosrun rqt_graph rqt_graph
看到增加了一个新的节点“/turtlesim”,这就是刚才我们即时显示话题信息的节点。
再增加一个新的终端。输入rostopic list -v,显示发布和订阅的话题及其类型的详细信息。
rostopic type 命令用来查看所发布话题的消息类型
输入rostopic type /turtle1/cmd_vel
目前我也不知道这是个啥消息类型.。。。
输入rosmsg show geometry_msgs/Twist就可以查看这个消息类型的详情。
两个容器linear和angular,每个容器有3个元素,分别存储x,y,z,x,y,z的类型是float64。额,这个看得懂。
可以通过rostopic pub把数据发布到当前某个正在广播的话题上。
输入命令rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’,那个乌龟就会动,表示画乌龟的那个终端接受到了这个信息。
把上述命令改成rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’,就会以1HZ的速度发布信息到话题上,乌龟就会一直动。
OK,把刚才那个rqt_graph终端Ctrl+c中断,重新输入rosrun rqt_graph rqt_graph.得到一个看起来比以前更复杂的系统运行流程图。
现在的节点变成了4个。一个运行左边乌龟窗口的节点,一个输入上下左右控制乌龟的节点。一个输出显示当前话题信息的节点,一个不断给乌龟发布信息让乌龟转圈的节点(PS:按照我的理解roscore应该也算一个节点吧,rosnode list上也可以看到,但是没显示上去,可能是“系统节点”吧,感觉我们现在这个看运行图的终端也是个节点,但是也没显示)
通过rostopic hz查看数据发布的频率。
同样的,把显示运行图的终端Ctrl+c中断,然后输入rostopic hz /turtle1/pose(为什么是“/turtle1/pose”,猜测可能是因为产生的话题是“/turtle1/cmd_vel”,上级目录就是"/turtle1",估计系统底层方面的东西,不懂不懂,先放着,以后再弄清楚)
一直运行,伤不起,Ctrl+C结束。可以看到,正在以62HZ左右的频率发布数据。
运行rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。
rosrun rqt_plot rqt_plot
在左上角那个位置输入turtle1/pose/x,点右边的加号。
然后输入turtle1/pose/y,点右边的加号,就能出现如下效果。
4.3ROS服务和参数
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)(PS:学了上面的内容我还以为ROS只用上述节点+话题方式通信呢.)
关于ROS服务的各种命令:
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
输入rosservice list 。
clear(清除),kill(终止),reset(重置),spawn(再生),这几个可以直译看出大概作用,其他的…慢慢学吧。。
rosservice type clear
空类型
rosservice type kill
kill类型?这是个啥类型?额,先不纠结这个问题。先记下,以后解答。。
rosservice call clear
小乌龟轨迹清空(PS:疑惑,这个clear是只针对这个节点还是针对ROS里面所启用的所有节点?用上面rosrun rqt_plot rqt_plot实验下)
前面画的东西也没清除啊,感觉似乎rosservice call clear针对的是特定的某个或者某些节点,懵逼中,希望大佬解惑。
通过rosservice type spawn| rossrv show了解详细信息。学到个新的办法,上面的rosservice type不能得到详细信息,这个在后面加| rossrv show能得到详细信息,等会可以看下上面的KILL类型。
kill类型包含一个string类型,应该是kill +x,终止x。
spawn类型包含x,y,theta,name,画—下面还有个name,为了区分下,第一个name叫n1,第二个name叫n2,个人理解,是指在n2窗口上的位置为x,y的地方,再生一个朝向为theta的名字为n1的乌龟。看了文档,对n2没做啥描述,懵。(后面学到了,那三条短线是为了分隔请求跟响应的,请求什么东西,然后谁来响应,最初的理解感觉也不算太错,哪个窗口来响应)
rosservice call spawn 2 2 0.2 “”
生成了一只新的乌龟,没写名字,名字自动为turtle2.
感觉可以开个终端,想办法让这只新乌龟也转起来。
依照刚学过的方法,不断给这只新乌龟发送信息,这只新乌龟就开始动起来了
rostopic pub /turtle2/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。
使用方法:
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
通过rosparam get语句得到background_r参数是69
再通过set语句进行更改:rosparam set /turtlesim/background_r 150,再运行rosservice call clear语句,旁边的窗口背景就变色了。
再通过get语句,现在的background_r 是150
rosparam get /可以得到所有参数
通过rosparam dump params.yaml语句,可以把所有参数信息保存在params.yaml中,然后再通过rosparam load params.yaml xxx把params.yaml中的信息加载在xxx空间上。
5、rqt_console 和 roslaunch的使用
5.1rqt_console和rqt_logger_level的使用
rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
输入rosrun qt_console qt_console
再创建一个终端输入:rosrun rqt_logger_level rqt_logger_level
经过了n久的实验跟操作,有点懵,因为console窗口只显示WARN信息,INFO信息没显示(跟绝ros官网教程里面默认是显示info信息的)。经过多次实验,rqt_logger_level这个窗口形同虚设,可能我什么地方没弄对吧,希望有大佬解答。
日志等级按以下优先顺序排列:
Fatal
Error
Warn
Info
Debug
Fatal是最高优先级,Debug是最低优先级。通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。比如,将日志等级设为Warn时,你会得到Warn、Error和Fatal这三个等级的所有日志消息。(我实验可能出了点问题,这个日志等级形同虚设)
5.2使用roslaunch
roslaunch可以用来启动定义在launch文件中的多个节点。
执行roscd beginner_tutorials
出现问题,设置当前终端下的ROS_PACKAGE_PATH环境变量:
export ROS_PACKAGE_PATH=~/“noetic”_workspace/sandbox:$ROS_PACKAGE_PATH
然后再roscd beginner_tutorials
唉!直接cd进去吧。
mkdir launch(创建文件夹)
cd launch(进入文件夹)
sudo gedit turtlemimic.launch(创建文件)
复制粘贴以下内容(括号内内容删去):
<launch>(表明这是一个launch文件)
(创建了两个节点分组,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为sim。这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。)
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
(启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就会使turtlesim2模仿turtlesim1)
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
通过roslaunch命令来启动launch文件:
roslaunch beginner_tutorials turtlemimic.launch
报错,通过百度,得知是因为setup.bash文件没有进一步说明包的来源
进入devel目录下,运行:source setup.bash
返回先前的目录运行roslaunch beginner_tutorials turtlemimic.launch,出现两个乌龟窗口。现在roscd可以运行了,猜测刚才的无法使用roscd和rqt_logger_level都是因为setup.bash文件没有进一步说明包的来源造成的,目前roscd得到验证,等会试试rqt_logger_level。
新建一个终端,输入:rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’
两个窗口都在运动。
运行rosrun rqt_graph rqt_graph
可以看到正在运行的这些节点之间的关系。
运行的窗口太多,看着太麻烦,把除roscore之外的窗口全部关闭。
6、使用rosed编辑ROS中的文件
rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
运行rosed roscpp Logger.msg测试下
没安装VIM编辑器,运行sudo apt install vim 安装VIMM编辑器
VIM用着不是很趁手,换个编辑器。
6.1下载vscode
下载地址:https://code.visualstudio.com/Download#
下载完成后建立一个共享文件夹,因为我们的是虚拟机,把下载后的文件放到共享文件夹中(PS:其实也可以直接在虚拟机上的浏览器上下载。。)
设备->共享文件夹
进入/mnt文件,创建一个文件,跟这个共享文件链接起来
命令是:sudo mount -t vboxsf 共享文件夹名称 /mnt/要链接起来的文件夹名称
我把默认的win10_ubuntu共享文件夹改成了win10_ubuntu_share
进入共享文件夹。
sudo dpkg -i code_1.48.2-1598353430_amd64.deb(后面这一串就是刚才下的vscode安装包)
安装完成后,修改成rosed的默认编辑器:
export EDITOR=‘code -w’
现在测试下完成没。
运行rosed roscpp Logger.msg
打开了vscode的界面,不是VIM,结束。