一、ROS的优点
1.1 分布式计算
现代机器人系统往往需要多个计算机同时运行多个进程,即使只有一台计算机,通常仍将程序划分为独立运行且相互协作的小的模块来完成复杂的控制任务,单计算机或者多计算机不同进程间的通信问题是上述例子中的主要挑战。ROS 为实现上述通信提供两种相对简单、完备的机制。
1.2 软件复用
随着机器人研究的快速推进,诞生了一批应对导航、路径规划、建图等通用任务的算法。当然,任何一个算法实用的前提是其能够应用于新的领域,且不必重复实现。事实上,如何将现有算法快速移植到不同系统一直是一个挑战,ROS 通过以下两种方法解决这个问题:(1)ROS 标准包(Standard Packages)提供稳定、可调式的各类重要机器人算法实现。(2)ROS通信接口正在成为机器人软件互操作的 事实标准 ,也就是说绝大部分最新的硬件驱动和最前沿的算法实现都可以在ROS中找到。
ROS 不仅是一个函数库,除包含客户端库(Client Libraries)外,还包含一个中心服务器(Central Server)、一系列命令行工具、图形化界面工具以及编译环境。
二、入门概述
- 每个程序包由一个清单文件(文件名为 package.xml)定义。该文件定义关于包的一些细节,包括其名称、版本、维护者和依赖关系。
- 节点管理器:ROS 中实现通信的关键部分就是 ROS 节点管理器,启动节点管理器用:roscore。ROS程序的运行实例被称为节点。
注意:大多数 ROS 节点在启动时连接到节点管理器上,如果运行中连接中断,则不会尝试重新连接。因此,如果 roscore被终止,当前运行的其他节点将无法建立新的连接,即使稍后重启 roscore 也无济于事。
- 常用基本操作
功能 | 使用 |
查看软件包列表和定位软件包 | rospack list |
要找到一个软件包的目录 | rospack find package-name (支持tab补全) |
要查看软件包目录下的文件 | rosls package-name |
“访问”某软件包目录 | roscd package-name |
启动节点 | rosrun package-name executable-name |
查看节点列表 | rosnode list |
查看节点 | rosnode info node-name |
终止节点 | rosnode kill node-name |
查看节点之间的连接关系 | rqt_graph |
获取当前活跃的话题 | rostopic list |
打印消息内容 | rostopic echo topic-name |
查看话题 | rostopic info topic-name (包括话题的消息类型、话题的订阅和发布者) |
查看消息类型 | rosmsg show message-type-name |
- rosout 节点是一个特殊的节点,通过 roscore 自动启动。其作用有点类似于控制台程序中使用的标准输出(即 std:: cout)
- 节点名并不一定与对应可执行文件名称相同
- 终止和重启节点通常不会对其他节点有较大影响
- rosnode info:输出包括话题列表、服务列表以及和与其他节点的所有连接
- 终止和重启节点通常不会对其他节点有较大影响
- 基于话题和消息的通信机制是多对多的,ROS 为更加直接的一对一通信提供了一种称“服务”的机制
三、编写ROS程序
3.1 创建工作空间
mkdir -p ~/catkin_ws/src //一定要创建src文件夹
cd ~/catkin_ws
catkin_make //不需要用catkin_init_workspace
3.1 创建功能包
cd ~/catkin_ws/src
catkin_create_pkg package-name [depend1][depend2][depend3]
3.2 hello_world
#include <ros/ros.h>
int main ( int argc , char ** argv )
{
ros::init ( argc , argv , " hello _ros " ) ;
ros::NodeHandle nh ;
ROS_INFO_STREAM( " Hello , ROS! " ) ;
}
3.3 编译
- find_package(catkin REQUIRED COMPONENTS package-names)
- add_executable(executable-name source-files)
- target_link_libraries(executable-name ${catkin_LIBRARIES})
- source devel/setup.bash(可以写在bash.rc文件中)
3.4 发布消息
- 创建发布者对象
ros::Publisher pub = node_handle.advertise<message_type>(topic_name, queue_size);
最后的参数queue_size是一个整数,表示这个发布者发布的消息序列的大小。 - 发布消息
pub.publish(msg); - 控制消息发布频率
ros::Rate rate(hz)