写在前面:前面两篇写作风格不太统一,有的是摘抄原书,有的加入自己理解。这里说明下,本学习笔记主要是读书笔记,因为我看过好几遍了,且用了挺久的ROS,所以如果没有读者一定基础,可能会无法明白笔记中的一些限定和共识内容。如果有疑问,欢迎评论留言交流。大家有觉得需要特别强调或者自己对某一部分有更好的理解方式,也欢迎评论补充。
接下来我打算:我比较熟悉的部分,可能只写一些关键知识点;不熟悉(平常用的少的)可能会更贴近书上内容,全面一些。
0 launch启动文件
这个太重要了,也不太难。说几个重要的地方吧
如果下面标签不够,参考 http://wiki.ros.org/roslaunch/ML 进一步学习
0.1 node标签
使用示例如下,这段命令相当于终端运行 rosrun pkg type
<node name="node-name" pkg="package-name" type="executable-name" />
有个参数说明下,应该还比较常用,args是node的输入参数,我在想如果多个参数怎么输入?其他的参见课本吧
0.2 arg param rosparam使用参见如下链接
https://zhuanlan.zhihu.com/p/127354732zhuanlan.zhihu.com0.3 重映射
我们使用别人的功能包时,其接口不一定跟我们的一样,这时候就要用<remap>标签,而不需要修改功能包的原接口,比如:
<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />
这样j就可以把 /turtlebot/cmd_vel 重映射为 /cmd_vel了
0.4 嵌套复用
这里主要是为了将各个模块写到一个launch文件中,也就是说在launch文件了启动launch文件。有一点要注意,launch文件启动顺序不可控,虽然看着好像是按照代码顺序启动,但是启动时间和时间间隔都不可控。如果想按时间间隔控制启动,那么可以编写.sh文件来控制启动顺序和时间间隔。
launch嵌套示例
<include file="$(dirname)/other.launch" />
.sh文件示例
#!/bin/bash
# Start the simulation environment
roslaunch shape_comp simulation_env.launch &
sleep 3
rosrun shape_comp shape_pose_init.py &
sleep 5
# Object Point cloud extraction
rosrun my_pcl point_extract &
sleep 1
......
exit 0
说明:第一行格式说明必须要有;各行代码末尾&符号要有
1 TF功能包
简单说下它的优点,TF可以在分布式系统中进行操作,也就是说一个机器人系统中所有坐标变换关系,对于所有节点组件都是可用的。下面介绍两个部分:一是常用tf工具,二是介绍将一个TF变换发布出去和如何接听一个TF变换并作出相应操作
1.1 常用工具
tf_monitor 打印TF树中所有坐标系的发布状态,或者查看指定坐标系间的发布状态
tf_monitor
tf_monitor <source_frame> <target_frame>
tf_echo 查看指定坐标系之间的变换关系
tf_echo <source_frame> <target_frame>
static_transform_publisher 发布两个坐标系之间的静态坐标变换
static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
上面设置的偏移参数和旋转参数啥意思?后面参数的发布频率以ms为单位
上面命令还可以在launch文件使用,示例如下:
<launch>
<node pkg="tf" type="static_transform_publisher" name="link_broadcaster"
args="1 0 0 0 0 0 1 link1_parent link1 100" />
</launch>
view_frames 可视化的调试工具,可以生成 PDF,显示整棵TF树的信息
rosrun tf view_frames
evince frames.pdf
1.2 监听和发布 TF
本例程使用的是一个小乌龟B跟踪另一个小乌龟A,这里大体说一下广播器和监听器,具体的看原书代码。
创建TF广播器:通过订阅器订阅小乌龟A的pose信息,在回调函数里创建TF广播器,广播当前的位姿。这里广播使用消息类型是tf::StampedTransform,不仅包含位姿、时间戳,还指定了源坐标系和目标坐标系。
创建TF监听器:这里创建了 tf::TransformListener 类型的监听器,它会自动接收TF树的消息,并且缓存10秒。接收TF后就可以用监听器的接口查询相应的坐标变换。这里面还按照乌龟速度话题格式定义发布器,发布乌龟B运动速度信息。
总结下:这个其实挺有用的,以后若用到,可以多读两遍源代码,然后编写自己的发布器和监听器。
2 Qt工具
ROS提供的Qt架构的后台图形工具套件 rqt_common_plugins,使用如下命令安装
sudo apt-get install ros-kinetic-rqt
sudo apt-get install ros-kinetic-rqt-common-plugins
2.1 日志输出工具
图形化显示ROS系统运行状态中的所有日志消息,包括 info 、warn 、error
rqt_console
2.2 计算图可视化工具
图形化显示当前系统中的计算图
rqt_graph
2.3 数据绘图工具
二维数值曲线绘制工具,可以选择话题等在图中进行描绘
rqt_plot
2.4 参数动态配置工具
可在不重启系统下,动态配置ROS系统中的参数,需要在代码中设置参数的相关属性
rosrun rqt_reconfigure rqt_reconfigure
3 Rviz三维可视化
rviz不仅可以显示默认数据类型,也可以通过编写插件添加显示其他形式数据类型。
rviz默认支持显示的数据类型如下:
4 Gazebo仿真环境
除了比较常见的特点,说两点个人感觉特别的
- TCP/IP传输:gazebo的后台仿真处理和前台图形显示可以通过网络通信实现远程方针,这样就可以在Amazon等云端运行
- 终端工具:使用gazebo提供的命令行工具在终端实现仿真控制
另外两种创建仿真环境的方法:
- 直接插入:这需要下载模型放到 ~/.gazebo/models,下载地址: https://bitbucket.org/osrf/gazebo_models/downloads/
- Building Editor:这个使用自带的编辑模型创建仿真环境,初步感觉这个可能类似Ansys的建模功能有点鸡肋。不过这个可能适合画地图做SLAM。如果是其他物理模型,还是Solidworks建的好。
5. rosbag数据记录和回放
先介绍一下,这个功能包rosbag就是为何调试测试方便而设立的。它的工作流程就是收集系统运行时的消息数据,然后离线状态回放。
这个比较有用,至于为何感觉有用,我也是结合以前做的一点工作想起来的。结合以前工作举个使用场景。比如我们启动搭建的仿真环境,然后采集一系列的数据,然后耗费很长时间处理数据,并把结果发布为一个话题,就叫 /topic 吧,然后后面又有一系列的操作要用这个话题,可我们一运行发现后面用这个话题的代码有问题,这就要停止。然后修改好代码后,我们是不是又要重复前面一系列复杂的工作,然后再去调试这段代码呢?
当然不是,rosbag可以省时省力。在第一次运行时,你把 /topic 记录,然后后面修改代码后,直接回放,再去调试使用这个话题的后面代码即可。
当然这只是限于调试,一个完整成熟的系统一般还是要处理实时信息。
记录数据代码:
mkdir ~/bagfiles
cd ~/bagfiles # 创建存放数据的文件夹
rosbag record -a # 记录所有发布消息,其他选项可以查看help
回访数据代码:
rosbag info <your bagfile> # 查看包的信息,包括存储的话题名称
rosbag play <your bagfile> # 回放数据