编辑推荐: |
本文是读了ROS2机器人开发从入门到实践的笔记,介绍并学习如何将机器人接入ROS2,希望对你的学习有帮助。
本文来自于DevFrank,由火龙果软件Alice编辑,推荐。 |
|
下面就一起来了解如何学习并实践ROS2机器人开发:
一、启程-让你的第一个机器人动起来
ROS本质上是用于快速搭建机器人的 软件库 (核心是通信)和 工具集 。ROS 2采用 第三方的通信组件 代替ROS 1中的通信组件,使得数据传输更加稳定和强大。同时ROS 2引入了新的C++标准,在 代码规范性 、 接口一致性 上都有了不小的提升。
ROS 2的四大通信机制分别是 话题(Topic)通信、服务(Service)通信、参数(Parameter)通信和动作(Action)通信 。 除了核心通信机制外,ROS 2还提供了丰富的可视化 调试工具 ,比如用于三维可视化的RViz,用于可视化图表、图像等数据的rqt系列工具,以及用于数据记录和回放的ros2bag工具等。 推荐大家安装 Ubuntu22.04 学习 ROS Humble ,安装过程不再赘述。
二、基础入门-编写第一个节点
与ROS1一样,运行完海龟模拟器turtlesim后,我们已经迫不及待去编写第一个节点了。 一个最简单的python节点:
import rclpy
from rclpy.node import Node def main(args=None):
rclpy.init(args=args)
node = Node("minimal_python_node")
node.get_logger().info("Hello from the simplest ROS2 node!")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown() if __name__ == '__main__':
main()
|
可以直接用 python main.py 运行,C++节点类似,可以cmake编译后运行;或者创建功能包 ros2 pkg create ,用 colcon build 编译后运行。 在此基础上,ROS2在开发上也用了更新的版本和现代化特性,应该多用Python3、C++11-14-17等版本的特性。
三、发布和订阅-探索话题通信
话题通信是一种基于 发布/订阅 模型的异步单向数据流通信方式。 重点理解:
1.Node(节点) -> Topic(话题) -> Message(消息) 的关系。
2.使用rqt_graph工具可视化节点间的通信关系。
3.DDS (数据分发服务)作为ROS2的底层通信中间件,是其性能远超ROS1的关键。 作者还带我们实践做了一个系统状态监测与可视化工具。
四、服务和参数-深入ROS2通信
服务通信是一种基于 客户端/服务器 模型的同步双向RPC(远程过程调用)通信方式。适用于需要请求-响应模式的场景,如调用一个计算、开关一个功能。 可以跟着做一个 Python人脸检测服务 (C++巡逻海龟),客户端带着图片信息请求,服务端进行检测服务,并将人脸的位置信息返回给客户端。
还可以在通信中加入参数,如 动态配置节点参数 (检测模型),无需修改代码。使用rqt的参数面板或命令行工具ros2 param可以进行动态调整。 还有一种是 动作通信 ,可看作是异步双向的、带反馈的、可预取消的“加强版服务”。非常适合执行时间较长的任务,如导航到目标点(过程中持续反馈当前位置,并可随时取消)。
五、ROS2常用开发工具
ROS除了丰富的通信,还有强大的 命令行工具 ( ros2 node/list/topic/service 等)和 可视化工具 (rqt_console, rqt_plot, rviz2)。尤其是 rviz2 ,非常方便机器人的可视化调试,此外还有 坐标转换工具 TF ,方便机器人的开发。
六、建模与仿真-创建自己的机器人
实际的机器人并不能做到电影里那样的外观和智能, 目前的机器人结构往往是根据其应用场景设计的 ,比如快递机器人一般都是由轮子和货舱组成的,而工业机器人则有像人一样的手臂,方便进行组装焊接等工作。 一般情况下,可以先对机器人的传感器、执行器以及环境进行仿真,最常用的仿真平台有 Gazebo 、 WeBots 和 CoppeliaSim 。
以 Gazebo 为例,可以用URDF、Xacro创建机器人本体,添加传感器仿真,然后在rviz中显示。
ROS的一大宗旨是拒绝重复造轮子, ros2_control 是一个使用ROS 2进行实时机器人控制的框架,它的目标是简化硬件的集成,可以实现在仿真中让自己的机器人动起来。
七、自主导航-赋予机器智能
目前的机器人导航系统就是围绕着上面这三部分进行设计的。在对应的时机分别调用全局路径规划获取路径,根据当前位置和全局路径,在调用局部路径规划得到一小段路径后控制机器人行走,当出现问题时,调用恢复行为进行脱困。
Navigation 2 是一个 开源的机器人导航框架 ,它的目标是让机器人安全地从A点移动到B点。当然,它并不是教你如何将机器人从A点搬到B点,而是让机器人自主地进行移动。为了完成导航任务,路径规划、避障和自主脱困等能力便是Navigation 2所具备的基本能力。
可以跟着做一个 自动巡检机器人 ,在各个房间不断巡逻并记录图像。
八、使用自己的规划器和控制器
Nav 2导航框架通过ROS 2强大的 插件机制 ,可以将你编写的规划器或执行器加载到导航系统中进行调用。 pluginlib 是一个用于在ROS功能包中动态加载和卸载插件的C++库。通过pluginlib则不需要进行提前查找和链接库,在程序中可以通过参数或设置动态地加载和卸载插件。 假设我们要创建一个简单的机器人 运动控制器插件 ,一个机器人可以支持多种不同的运动控制方法,比如直线运动、旋转运动和Z字形运动等。此时我们就可以创建一个基类接口,然后让插件继承基类,实现不同的控制方式。
九、搭建实体移动机器人
对于一个移动机器人来说,从系统功能角度来看,机器人由 感知、决策和控制 三部分组成。感知部分是通过各种传感器来实现的,比如激光雷达和编码器;决策部分软件则是由各种算法组合实现的,比如可以进行路径规划和运动控制的Nav2,硬件则依托性能较强的处理器实现;控制部分通常是由驱动系统和电动机组成的。 作者依托自己的 FishBot 低成本机器人平台 ,给我们介绍了它所搭载的传感器、执行器以及决策系统。
此外,还对 Micro-ROS 连接微控制器进行了介绍并学习将机器人接入ROS2中,实现上下位机的无缝通信。
十、ROS2使用进阶
ROS 2基于其 中间件DDS 的 QoS 向用户提供了丰富多样的QoS策略,不同的QoS策略适用于不同的工作场景,比如在有丢包的无线网络环境,使用尽力而为( Best effort )策略更适合;对于要保证数据一定到达的重要数据传输,使用可靠传递( Reliable )策略更合适。 此外,ROS2还提供了 多线程执行器 、 生命周期节点 等新特性。
读到这里,相信大家已经收获满满当当了。我自己本身也是从教育方向出发开始接触ROS技术的,工作中也经历了ROS1到ROS2的迁移和宣教。到这两年已经明显感觉 到无论是教育还是企业的要求中,ROS已经成为掌握或从事机器人、智能驾驶等方向工作的基础,因此写这篇读书笔记与大家共勉,不断学习实践和分享。
|