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的核心功能呢已经完善,部分第三方包还在适配中。
ROS2的更新是全方位的,所以这里只简述在笔者目前了解的情况。
ROS2的底层是用C语言写的,名字叫rcl库,而在写上层程序中调用的rclcpp和rclpy是在rcl库上进行一次包装,这样带来的好处是让cpp和python程序的调用api更加统一相似,同时对ros2进行功能更新时,直接更新rcl库,再新增cpp 和python的支持。
默认使用cpp 11, cpp1A4,cpp17标准,比ROS1默认使用的cpp98标准更加现代化的。支持更多安全和效率的特性。
彻底放弃python2.全面拥抱python3。
更加规范化的Node编写标准,必须创建一个从 Node 对象继承的类(例如:cpp 中的 rclcpp::Node,Python 中的 rclpy.node.Node)。便于团队开发。
不同于ROS1广泛的xml格式的launch文件,ROS2建议使用python文件写launch文件,提供了启动中更多的灵活度。
ROS2不再有ROS1中的master主节点,ROS1中的子节点需要先向主节点注册沟通后才能互相交流,是中心化架构。而ROS2采用分布式节点方式,节点间可以相互发现,不需要任何主节点。避免了因为主节点崩溃而导致整个系统崩溃,同时让ROS2在多机分布式部署更加灵活。
同时ROS1中的服务请求是Block阻塞的,客户端在得到响应前会处于stop the world (卡住)状态。
而ROS2的服务设计为Asyn异步的,客户端在接受服务端响应中不会被卡住。不过如果想的话也能使用阻塞模式。
只列举了常用部分
ROS1 | ROS2 | introduction |
---|---|---|
catkin_make | colcon build | 编译 |
roslaunch | ros2 launch | 启动 |
rostopic list | ros2 topic list | |
rostopic echo | ros2 topic echo | |
rosrun | ros2 run | |
rosrun rqt_graph rqt_graph | rqt_graph | |
rosrun rqt_tf_tree rqt_tf_tree | ros2 run tf2_tools view_frames.py | ros2 这边会在终端路径保存一个pdf文件,不能直接查看 |
rviz | rviz2 |
安装流程可见官网:https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html
更新软件库
sudo apt update
ROS 2软件包构建在频繁更新的Ubuntu系统上。在安装新软件包之前,始终建议您确保系统是最新的。
xxxxxxxxxx
sudo apt upgrade
建议安装完整版ROS 包含ROS base rviz 教程等软件
xxxxxxxxxx
sudo apt install ros-foxy-desktop
xxxxxxxxxx
sudo apt install ros-foxy-ros-base
后续开发可能需要的包:
xxxxxxxxxx
sudo apt install ros-foxy-turtlesim
sudo apt install ros-foxy-xacro
sudo apt install python3-pip
sudo apt install python3-colcon-common-extensions
sudo apt install python3-vcstool
sudo apt-get install ros-foxy-joint-state-publisher-gui
执行以下命令来配置终端环境,每次打开终端均要执行此项命令
xxxxxxxxxx
source /opt/ros/foxy/setup.bash
或者使用一劳永逸,每次打开终端自动配置
xxxxxxxxxx
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
gazebo是ROS提供的一个功能强大的仿真平台
只需安装Gazebo 11和相关的ROS 支持包:
xxxxxxxxxx
sudo apt install gazebo11 ros-foxy-gazebo-ros-pkgs
为了导航,可以安装下列包
xxxxxxxxxx
sudo apt install ros-foxy-cartographer
sudo apt install ros-foxy-cartographer-ros
sudo apt install ros-foxy-navigation2
sudo apt install ros-foxy-nav2-bringup
sudo apt install ros-foxy-gazebo-ros2-control
sudo apt install ros-foxy-ros2-control ros-foxy-ros2-controllers
进入源码包
xxxxxxxxxx
cd ~s/yahboomcar_ws
colcon build --symlink-install
echo 'source ~/yahboomcar_ws/install/setup.bash' >> ~/.bashrc
colcon提供了很多的参数选项 常用参数:
--symlink-install :使用符号链接而不是复制文件,如 以动态链接库为例,会在install目录中使用符号链接,指向build目录下生成的库文件(如 *.so). 没有该选项,则两个目录都会有该库文件
--packages-select :只编译指定包,如 colcon build --packages-select autoware_map_msgs vector_map_msgs
--packages-ignore : 忽略指定包,同上
--continue-on-error :在编译出错之后继续编译其他模块
--cmake-args ,--ament-cmake-args, --catkin-cmake-args :传递参数给对应的package
和ROS1不同的是,ROS2在修改完任何文件后,请重新编译 colcon build
在创建好的软件包中可见
修改CMakeLists.txt的project()内的包名,和package.xml的name,可以修改该软件包的名字。
同时为了能使用软件包里文件夹的文件,需要在cmakelist中进行install