1. ROS2
1.1. ROS2新技术
- Zeroconf:零配置网络服务规范,用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。
- Protocol Buffers:Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。
- ZeroMQ(and the other MQs):一个简单好用的传输层,相框架一样的一个socket library,它使的socket编程更加简单、简洁和性能更高。
- Redis:一个高性能的key-value数据库。
- WebSockets:HTML5开始提供的浏览器与服务器间进行全双工通讯的网络技术。
- DDS(Data Distribution Service):新一代分布式实时通信中间件技术规范,DDS采用发布/订阅体系架构,强调以数据为中心,提供丰富的Qos服务质量策略,能保障数据进行实时、高效、灵活的分发,可满足各种分布式实时通信应用要求,
- 多机器人控制,可以同时驾奴多个机器人。
- 多平台应用支持、可以在x86和ARM上跑。
1.2. ROS2与ROS1 架构比对
1.3. ROS2的提升
- 实时性增强:数据必须在deadline之前完成更新。
- 持续性增强:ROS1尽管存在数据队列的概念,但是还有很大的局限,订阅者无法接收到加入网络之前的数据; DDS可以为ROS提供数据历史的服务,就算新加入的节点,也可以获取发布的所有历史数据。
- 可靠性增强:通过DDS配置可靠性原则,用户可以根据需求选择性能模式(BEST_EFFORT)或者稳定模式(RELIABLE)。
参考自:https://blog.csdn.net/aiqinchao/article/details/90580478
2. 入门教程
2.1. 克隆样本仓库
git clone https://github.com/ros/ros_tutorials.git -b eloquent-devel
2.2. 安装依赖
在构建工作空间之前,您需要解决程序包依赖性。您可能已经具有所有依赖关系,但是最佳实践是每次克隆时都要检查依赖关系。您不会希望由于长时间缺少依赖关系而导致构建失败。
在工作区(ROS2
)中,运行以下命令,安装依赖:
sudo rosdep install -i --from-path src --rosdistro=${ROS_DISTRO} -y
如果已经拥有所有依赖项,则控制台将返回:
1 | #All required rosdeps installed successfully |
软件包在package.xml文件中声明其依赖关系。该命令将遍历那些声明并安装缺少的那些声明。
2.3. 安装编译工具
colcon
是ROS编译工具catkin_make
,catkin_make_isolated
,catkin_tools
和ament_tools的换代
。
sudo apt-get install python3-colcon-common-extensions
2.4. 构建项目
编译:
1 | colcon build |
一些参数:
--packages-up-to
构建所需的程序包,及其所有依赖项,而不是整个工作区(节省时间)--symlink-install
使您不必在每次调整python脚本时都需要重建--event-handlers console_direct+
在构建时显示控制台输出(否则可以在log
目录中找到)
开始编译
编译完成
构建完成后,输入ls
,您将看到colcon创建了新目录:
2.5. 覆盖空间
在运行编译完成的程序前, 需要在工作空间目录下执行以下指令
source ./install/local_setup.bash
或
source ./install/local_setup.zsh
这个操作会将overlap层中可用的软件包添加到您的环境中.
2.6. 运行
现在,可以turtlesim
从叠加层运行该软件包:
1 | ros2 run turtlesim turtlesim_node |
有一个问题是, 如何确定这是刚刚构建的turtlesim程序在运行, 而不是安装ros时自带的turtlesim在运行?
让我们在overlap层中修改turtlesim,以便可以看到效果:
- 您可以与底层分开修改和重建叠加中的包。
- overlap层优先于参考层。
2.7. 修改程序
修改src/ros_tutorials/turtlesim/src/turtle_frame.cpp
文件 , 使得程序窗口标题改变
重新构建编译
colcon build
运行
可以看到, 标题已经被修改, 可以证明, 现在运行的turtlesim确实是来自代码的, 而不是ros系统自带的.