ROS2 简述

ROS2 是ROS1的一次巨大更新。

ROS1 是2007年诞生的,在活跃的开源社区的支持下,功能不断丰富,代码数量不断庞大,但是其整体设计其实并不太科学,缺乏安全性、实时性、鲁棒性并不太符合工业和具体的行业应用。

ROS的领导团队意识到了这个问题,但是ROS1已经积重难返,一些重要涉及底层的修改,会使ROS1更加不稳定,而且会不可避免遇到大量ROS1 包代码兼容性问题。与其缝缝补补,不如重新创建一个更加科学稳定的ROS2。

目前ROS1 的Noetic 将于2025年停止支持,为了ROS1 现存的大量代码库,目前现存项目保持在ROS1 是可行的,但是未来迁移ROS2无疑是必然的,所以现在学习迁移使用ROS2有必要的。

ROS2像ROS1一样每年发布一版,由于经过测试humble与Ubuntu 22.04 还不够稳定,Galactic 将要停止支持,故选用foxy版本+ubuntu20.04。目前ROS2的核心功能呢已经完善,部分第三方包还在适配中。

image-20220811121548836

特点

ROS2的更新是全方位的,所以这里只简述在笔者目前了解的情况。

Api

ROS2的底层是用C语言写的,名字叫rcl库,而在写上层程序中调用的rclcpp和rclpy是在rcl库上进行一次包装,这样带来的好处是让cpp和python程序的调用api更加统一相似,同时对ros2进行功能更新时,直接更新rcl库,再新增cpp 和python的支持。

Language

CPP

默认使用cpp 11, cpp1A4,cpp17标准,比ROS1默认使用的cpp98标准更加现代化的。支持更多安全和效率的特性。

python

彻底放弃python2.全面拥抱python3。

Node

更加规范化的Node编写标准,必须创建一个从 Node 对象继承的类(例如:cpp 中的 rclcpp::Node,Python 中的 rclpy.node.Node)。便于团队开发。

Launch

不同于ROS1广泛的xml格式的launch文件,ROS2建议使用python文件写launch文件,提供了启动中更多的灵活度。

通信

ROS2不再有ROS1中的master主节点,ROS1中的子节点需要先向主节点注册沟通后才能互相交流,是中心化架构。而ROS2采用分布式节点方式,节点间可以相互发现,不需要任何主节点。避免了因为主节点崩溃而导致整个系统崩溃,同时让ROS2在多机分布式部署更加灵活。

同时ROS1中的服务请求是Block阻塞的,客户端在得到响应前会处于stop the world (卡住)状态。

而ROS2的服务设计为Asyn异步的,客户端在接受服务端响应中不会被卡住。不过如果想的话也能使用阻塞模式。

具体使用中的区别

只列举了常用部分

ROS1ROS2introduction
catkin_makecolcon build编译
roslaunch ros2 launch 启动
rostopic listros2 topic list 
rostopic echo ros2 topic echo  
rosrun ros2 run  
rosrun rqt_graph rqt_graphrqt_graph 
rosrun rqt_tf_tree rqt_tf_treeros2 run tf2_tools view_frames.pyros2 这边会在终端路径保存一个pdf文件,不能直接查看
rvizrviz2 

ROS2 foxy安装

安装流程可见官网:https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

安装 ROS 2 包

更新软件库

ROS 2软件包构建在频繁更新的Ubuntu系统上。在安装新软件包之前,始终建议您确保系统是最新的。

建议安装完整版ROS 包含ROS base rviz 教程等软件

后续开发可能需要的包:

环境配置

配置环境

执行以下命令来配置终端环境,每次打开终端均要执行此项命令

或者使用一劳永逸,每次打开终端自动配置

安装 Gazebo

gazebo是ROS提供的一个功能强大的仿真平台

只需安装Gazebo 11和相关的ROS 支持包:

为了导航,可以安装下列包

编译

进入源码包

colcon提供了很多的参数选项 常用参数:

  1. --symlink-install :使用符号链接而不是复制文件,如 以动态链接库为例,会在install目录中使用符号链接,指向build目录下生成的库文件(如 *.so). 没有该选项,则两个目录都会有该库文件

  2. --packages-select :只编译指定包,如 colcon build --packages-select autoware_map_msgs vector_map_msgs

  3. --packages-ignore : 忽略指定包,同上

  4. --continue-on-error :在编译出错之后继续编译其他模块

  5. --cmake-args ,--ament-cmake-args, --catkin-cmake-args :传递参数给对应的package

     

和ROS1不同的是,ROS2在修改完任何文件后,请重新编译 colcon build

软件包配置

在创建好的软件包中可见

image-20220811150149772

修改CMakeLists.txt的project()内的包名,和package.xml的name,可以修改该软件包的名字。

同时为了能使用软件包里文件夹的文件,需要在cmakelist中进行install

image-20220811150829750

image-20220811150802102