本章主要介绍了ROS开发时常常使用的工具,分别是:
这六个工具是我们开发常常用到的工具,gazebo是一种最常用的ROS仿真工具,也是目前仿真ROS效果最好的工具;RViz是可视化工具,是将接收到的信息呈现出来;rqt则是非常好用的数据流可视化工具,有了它我们可以直观的看到消息的通信架构和流通路径;rosbag则是对软件包进行操作的一个命令,此外还提供代码API,对包进行操作编写。rosbridge是一个沟通ROS和外界的功能包,moveit!是目前为止应用最广泛的开源操作软件。好好学习本章,熟练使用这几款工具对于我们的ROS学习和开发都有极大的好处,可以事半功倍。
ROS中的工具就是帮助我们完成一系列的操作,使得我们的工作更加轻松高效。ROS工具的功能大概有以下几个方向:仿真、调试、可视化。本节课我们要学习的Gazebo就是实现了仿真的功能,而调试与可视化由Rviz、rqt来实现,我们下节再依次介绍。
对于Gazebo,大家可能并不陌生,因为我们在前面的学习过程中已经数次用到这个仿真环境,无论是在topic通信还是在service通信中,我们的demo都是在Gazebo中实现。
Gazebo是一个机器人仿真工具,模拟器,也是一个独立的开源机器人仿真平台。当今市面上还有其他的仿真工具例如V—Rep、Webots等等。但是Gazebo不仅开源,也是是兼容ROS最好的仿真工具。
Gazebo的功能很强大,最大的优点是对ROS的支持很好,因为Gazebo和ROS都由OSRF(Open Source Robotics Foundation)开源机器人组织来维护,Gazebo支持很多开源的物理引擎比如最典型的ODE。可以进行机器人的运动学、动力学仿真,能够模拟机器人常用的传感器(如激光雷达、摄像头、IMU等),也可以加载自定义的环境和场景。
仿真不仅仅只是做出一个很酷的3D场景,更重要的是给机器人一个逼近现实的虚拟物理环境,比如光照条件、物理距离等等。设定好具体的参数,让机器人完成我们设定的目标任务。比如一些有危险因素的测试,就可以让机器人在仿真的环境中去完成,例如无人车在交通环境复杂的交通要道的效果,我们就可以在仿真的环境下测试各种情况无人车的反应与效果,如车辆的性能、驾驶的策略、车流人流的行为模式等,又或者各种不可控因素如雨雪天气,突发事故,车辆故障等,从而收集结果参数指标信息等等,只有更大程度的逼近现实,才能得出车辆的真实效果。直到无人车在仿真条件下做到万无一失,才能放心的投放到真实环境中去使用,这即避免了危险因素对实验者的威胁,也节约了时间和资源,这就是仿真的意义。
通常一些不依赖于具体硬件的算法和场景都可以在Gazebo上仿真,例如图像识别、传感器数据融合处理、路径规划、SLAM等任务完全可以在Gazebo上仿真实现,大大减轻了对硬件的依赖。
和我们前面的实例测试一样,我们打开教材的模拟场景,输入roslaunch robot_sim_demo robot_spawn_launch
虽然Gazebo目前的功能还称不上强大,同时还存在着一些BUG,但是对于我们的入门学习也已经是足够了,随着版本的更新,Gazebo也在越来越强大。
本节课介绍的是我们在ROS开发中非常常用的一个工具,基本上的调试和开发都离不开这个工具——RViz(the Robit Visualization tool)机器人可视化工具,可视化的作用是直观的,它极大的方便了监控和调试等操作。
依然打开教材的模拟场景,输入roslaunch robot_sim_demo robot_spawn_launch
,之后在命令行打开新的终端直接输入$ rviz
打开工具。
和Gazebo一样,也会显示出一个3D环境,不过操作上有所不同,具体操作如下:
RViz的插件种类繁多功能强大,非常适合我们开发调试ROS程序。
虽然从界面上来看,RViz和Gazebo非常相似,但实际上两者有着很大的不同,Gazebo实现的是仿真,提供一个虚拟的世界,RViz实现的是可视化,呈现接收到的信息。左侧的插件相当于是一个个的subscriber,RViz接收信息,并且显示。所以RViz和Gazebo有本质的差异。
RViz和Gazebo是我们常用的ROS工具,更好的利用这些工具是我们ROS进阶的基础。具体的操作和使用可以参考我们的官方演示视频,跟着视频去实战演练,熟悉这两个工具。
rqt是一个基于qt开发的可视化工具,拥有扩展性好、灵活易用、跨平台等特点,主要作用和RViz一致都是可视化,但是和RViz相比,rqt要高级一个层次,。
rqt_graph是来显示通信架构,也就是我们上一章所讲的内容节点、主题等等,当前有哪些Node和topic在运行,消息的流向是怎样,都能通过这个语句显示出来。此命令由于能显示系统的全貌,所以非常的常用。
rqt_plot将一些参数,尤其是动态参数以曲线的形式绘制出来。当我们在开发时查看机器人的原始数据,我们就能利用rqt_plot将这些原始数据用曲线绘制出来,非常的直观,利于我们分析数据。
rqt_console里存在一些过滤器,我们可以利用它方便的查到我们需要的日志。
roslaunch robot_sim_demo robot_spawn_launch
rqt_graph
,显示出了当前环境下运行的Node和topic,十分直观的看到通信结构以及消息流向。注意在椭圆形的代表节点,矩形代表topic。rqt_plot
,显示出曲线坐标窗口,在上方输入框里添加或者删除topic,比如我们查看速度,可以在框里设置好topic后,移动机器人,就可以看到自动绘制的线速度或者角速度曲线。rqt_console
,显示日志的输出,配合rqt_logger_level
查看日志的级别。rqt_graph这个功能是强大的,它使得我们初学者可以直观的看到ROS的通信架构和信息流,方便我们理解的同时,也使得我们能够最快的纠错等等。rqt_plot绘制数据曲线图,也是极大的帮助我们了解数据的变化态势,理解数据流的作用,用曲线来显示我们的操作,精确直观。rqt_console配合rqt_logger_level,查看日志,对于查找错误和DeBug都有很大帮助。
rosbag是一个这是一套用于记录和回放ROS主题的工具。它旨在提高性能,并避免消息的反序列化和重新排序。rosbag package提供了命令行工具和代码API,可以用C++或者python来编写包。而且rosbag命令行工具和代码API是稳定的,始终保持向后的兼容性。
rosbag对软件包来操作,一个包是ROS用于存储ROS消息数据的文件格式,rosbag命令可以记录、回放和操作包。指令列表如下:
命令 | 作用 |
---|---|
cheak |
确定一个包是否可以在当前系统中进行,或者是否可以迁移。 |
decompress |
压缩一个或多个包文件。 |
filter |
解压一个或多个包文件。 |
fix |
在包文件中修复消息,以便在当前系统中播放。 |
help |
获取相关命令指示帮助信息 |
info |
总结一个或多个包文件的内容。 |
play |
以一种时间同步的方式回放一个或多个包文件的内容。 |
record |
用指定主题的内容记录一个包文件。 |
reindex |
重新索引一个或多个包文件。 |
一、bag基本操作指令
$rosbag record -a
-all 保存所有的话题
$rosbag record -O w /turtle1/cmd_vel
接收话题 /turtle1/cmd_vel 的数据包,并命名为w.bag
$rosbag info
显示包的详细信息
$rosbag play
播放bag包
$rosbag play -r 2
以2Hz的频率播放bag 包
二、bag_to_pcd
(1)从bag包转pcd
$ rosrun pcl_ros bag_to_pcd
$ rosrun pcl_ros bag_to_pcd data.bag /velodyne_points ./wtj
从data.bag中提取/velodyne_points 话题数据到wtj 文件夹中。
(2) 通过发布,订阅实时转
检查topic:rosbag info XXX.bag
发送message: $ rosbag play XXX.bag
订阅需要的话题:$rosrun pcl_ros pointcloud_to_pcd input:=/velodyne_points
在当前目录下将话题实时转为pcd文件。
(3)显示生成的pcd文件
$pcl_viewer 1513648255448748.pcd
5.5 Rosbridge
Rosbridge是一个用在ROS系统和其他系统之间的一个功能包,就像是它的名字一样,起到一个"桥梁"的作用,使得ros系统和其他系统能够进行交互.Rosbridge为非ROS程序提供了一个JSON API,有许多与Rosbridge进行交互的前端,包括一个用于Web浏览器交互的WebSocket服务器。Rosbridge_suite是一个包含Rosbridge的元程序包,用于Rosbridge的各种前端程序包(如WebSocket程序包)和帮助程序包。
Rosbridge主要包含两部分内容:协议(Potocol)和实现(Implementation)
协议
Rosbridge Protocol提供了非ROS程序与ROS通信的具体的格式规范,规范基于JSON格式,包括订阅topic,发布message,调用server,设置参数,压缩消息等等.例如订阅topic的格式规范如下:
{ "op": "subscribe",
"topic": "/cmd_vel",
"type": "geometry_msgs/Twist"
}
此规范与所用的编程语言和传输方式无关,任何可以发送JSON格式的语音和传输方式都可以Rosbridge protocol进行交流,并且与ROS进行交互.
实现
Rosbridge_suite元程序包是实现Rosbridge Protocol并提供WebSocket传输层的包的集合。
这些软件包包括:
Rosbridge_library : 核心rosbridge软件包。Rosbridge_library负责获取JSON字符串并将命令发送到ROS,反过来接收处理ROS发过来的信息,将之转换为JSON字符串,并将结果转交给非ROS程序。
rosapi : 通过服务调用来访问某些ROS操作,这些服务通常为ROS客户端库保留的服务.这些操作包括获取和设置参数,获取主题列表等等。
+
rosbridge_server : 虽然Rosbridge_library提供JSON到ROS转换,但它将传输层留给其他人。Rosbridge_server提供了一个WebSocket连接,所以浏览器可以与ROS“交谈”。Roslibjs是一个浏览器的JavaScript库,可以通过rosbridge_server与ROS进行交流。
源码
安装
Rosbridge是基于ROS的,首先要确保自己正确的安装完成了ROS之后可以启动终端执行命令:
sudo apt-get install ros-
中间的为自己的ROS版本,依照自己的版本进行安装.
使用
关于更深入的使用,可以参考本课程的视频课程,简单的入门使用可以参考链接如下:
参考链接
2012年,一款叫做moveit!的移动操作软件诞生了,moveit!最初在Willow Garage由Sachin Chitta,Ioan Sucan,Gil E. Jones,Acorn Pooley,Suat Gedikli,Dave Hershberger开发,它融合了研究者在运动规划、操纵、3D感知、运动学、控制和导航方面的最新进展,为操作者提供了一个易于使用的平台,使用它可以开发先进的机器人应用,也被广泛应用于工业,商业,研发和其他领域。由于以上特性,moveit!一跃成为在机器人上最广泛使用的开源操作软件,截止2017年,已经被用于超过65台机器人。
moveit!的使用通过为用户提供接口来调用它,包括C++、Python、GUI三种接口。ROS中的move_group
节点充当整合器,整合多个独立组件,提供ROS风格的Action和service。move_group
通过ROS topic和action与机器人通讯,获取机器人的位置、节点等状态,获取数据再传递给机器人的控制器。
move_group
节点获取到节点状态信息或者机器人变换信息时候,会通过控制器的接口去处理这些信息,比如进行坐标转换、规划场景、3D感知。另外,move_group
的结构比较容易扩展,不仅具有独立的能力如抓放,运动规划,也可扩展自公共类,但实际作为独立的插件运行。moveit!系统结构图如下:
官网链接