ROS编程深入理解(Python)
参考
- 官方的wiki http://wiki.ros.org/cn/ROS/Tutorials/
- 中文ROS教程社区 https://www.ncnynl.com/
- 之前没有详细看官方的wiki,而是选择看网上的课程,现在看来是错误的,不过也是一个学习的过程。
ROS构建工作空间
这部分因为之前的ROS编程已经很详细了,这里记录一些简单的理解
- 整体围绕软件包开发,也就是pkg
- 创建软件包有很多细节,主要是处理依赖的问题,还有保证自己的软件包的完整性,我理解这是一种规范,这样别人使用的时候也很方便。
- 构建工作空间可以自定义名称,每次修改需要编译
- 记得source
- 当你发现你没地方输命令的时候,开新的终端 Ctrl + alt + T 快捷键
ROS基本命令
节点
roscore |
这是最核心的命令,相当于启动一台机器,深入理解就是,启动rosmaster,这个是方便节点之间通信的,详细请看我的ROS通信那篇文章。
rosnode list |
这个命令是用来查看当前启动的节点
rosnode info /节点名 |
这个命令当然是用来看节点一些服务、配置等
rosrun turtlesim turtlesim_node __name:=my_turtle |
ROS中节点是不能重名的,原因是显而易见的,上面是自定义节点名的方法
rosnode ping 节点名 |
这个用来测试节点的通信情况,当然和操作系统的差不多
话题
roscore |
上面就启动了可以用键盘控制的小海龟
rosrun rqt_graph rqt_graph |
此时启动ros的一个节点图展示窗口,就可以看到他们之间的关系
rostopic -h |
上面命令用来查看话题命令的帮助,当然基本上所有你不懂的命令,都可以用这个-h,包括linux中的,这是一个通用做法。
rostopic list |
可以查看当前运行的话题,我们可以知道,通常用于移动通信的话题是/cmd_vel,如果启动了小海龟,就可以看到
rostopic echo /turtle1/cmd_vel |
这是一个等待的程序,当话题有信息的时候,就会输出,例如
linear: |
当然此时我们在计算图即rqt_grah中就可以看到有,话题被新的节点订阅
rostopic list -v |
为了查看更详细的信息使用上面的命令,当然还有其他命令,-h自行查看,输出大概是下面的样子
Published topics: |
消息
刚才看到了话题通信,那么这些通信的到底是什么呢?是一种数据结构,具体的类型可以查看。
rostopic type /turtle1/cmd_vel |
上面查看节点的类型信息,但是还不是很详细
rosmsg show geometry_msgs/Twist |
这样我们就可以看到具体的数据类型的定义,海龟移动的类型是这样的:
geometry_msgs/Vector3 linear |
我们知道了类型和结构,就可以用ros中的命令来控制海龟移动,而不是用键盘。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' |
这样我们就可以看到海龟在移动,原理就是利用了消息通信
但是我们还是要分析一下参数
rostopic pub # 发布命令 |
yaml是一种用来表式数据结构的标记语言
但是上面的命令只能让它动一次,要想连续移动需要给更多参数
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]' |
此时在rqt_graph中,我们可以看到有新的节点传给/turtlesim这个节点数据,而且我们还可以查看这种位置的变化
rostopic echo /turtle1/pose |
这个是获取了/turtlesim的pose话题不断输出位置
rostopic hz /turtle1/pose |
先查看一下,当前话题报告的速率,一般大约是60hz
rostopic type /turtle1/cmd_vel | rosmsg show |
当然Linux的管道一样可以在ros的命令中使用,ros和Linux结合的非常好的
rosrun rqt_plot rqt_plot |
此时,我们想分析一下当前的运动轨迹,则可以使用上面的命令,输出的是一个不断更新的pose状态波动图,用来分析机器人的轨迹
服务
服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)
rosservice -h |
新命令的第一课,
rosservice list |
先查看一下所有的服务,选一个感兴趣的我们深入研究一下,比如clear
rosservice type /clear |
返回的是 std_srvs/Empty,表示该服务不需要参数,我们可以直接使用,那我们就试试
rosservice call /clear |
此时你会发现小海龟的轨迹没了,我们再来看看其他服务比如spawn
rosservice type /spawn | rossrv show |
返回的是数据结构,我们根据数据结构可以定义命令,来创建新的海龟这是这个方法的意思
rosservice call /spawn 2 2 0.2 "myturtle" |
参数
又来了新命令,根据标题我们就知道命令是干嘛用的,传递参数
rosparam -h |
当然我们同样可以用list看一下有哪些参数
rosparam list |
通过参数,可以知道我们能够改变的内容,比如改变颜色
rosparam set /turtlesim/background_r 150 |
这样我们就改变了参数,但是这样并不会导致界面变化,需要刷新一下
rosservice call /clear |
当然我们可以set就可以get,同样的方法即可获取对应参数的具体值
rosparam get /turtlesim/background_g |
这样我们想想是不是有这样一个服务器,管理着所有的参数,确实是有的,这样我们就可以查看参数
rosparam get / |
得到了参数后,我们可以用命令存储和载入
rosparam dump params.yaml #写入文件 |
载入的时候,需要指定命名空间,我们新建了一个命名空间copy_turtle,这样我们就可以获取其中的值了。
日志
rqt_console连接到了ROS的日志框架,以显示节点的输出信息。
rosrun rqt_console rqt_console |
执行上面的命令,启动了两个日志控制窗口,用于管理日志,就是记录当前的变化,状态、报错之类的。
当然还有记录了日志的级别
Fatal (致命) |
launch文件
这里我们要详细的了解一下,launch文件具体发挥的作用和使用方法
这里首先要创建一个自己的工作空间,然后到其目录下,如果不会创建,还是去看ROS编程那个文章
roscd 自己的功能空间名 |
然后创建一个launch目录
mkdir launch |
launch文件并不是必须写道launch文件夹中,只是通用做法,系统会自动查找
touch turtlemimic.launch |
这样我们就可以创建一个launch文件,文件的内容先放置如下
<launch> |
我们要仔细来看一下这个launch文件的内容的具体含义
<launch> 表示是lacunch文件 |
接下来就要尝试去启动
roslaunch 项目名 文件名.launch |
如果是在工作空间中直接创建的,则可以直接使用
roslaunch 文件名.launch |
在启动的新终端中
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]' |
当前就实现了一个模仿的模型,也可以使用rqt_graph来看到计算图
编辑文件
rosed 包名 文件名 |
相当于快速打开该文件的vim,因此需要vim支持,安装即可
通过在输入指令时,通过按tab键获取更多内容选择
创建ROS消息服务
msg(消息)
msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
存放在msg文件夹下
msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的类型为:
- int8, int16, int32, int64 (以及 uint*)
- float32, float64
- string
- time, duration
- 其他msg文件
- variable-length array[] 和 fixed-length array[C]
ROS中还有一个特殊的数据类型:Header,它含有时间戳和ROS中广泛使用的坐标帧信息。在msg文件的第一行经常可以看到Header header。
下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息的类型:
Header header |
在软件包中定义新的消息,在软件包中创建msg目录,执行
roscd 你的软件包 |
此时创建了一个简单的msg文件,但是需要被编译转换,则需要在package.xml中添加
<build_depend>message_generation</build_depend> |
srv(服务)
一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
简单理解,srv和msg就是数据结构,用于不同的场景,方便信息交互
srv常见的文件样例, — 号之前是请求,Sum是响应:
int64 A |
… 开始的部分已经很详细了,接下来还是需要跟着wiki继续完成,去练习,只要要点我才会记录。