尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ROS2从入门到实战:去中心化机器人操作系统详解

ROS2从入门到实战:去中心化机器人操作系统详解 本文是独立成篇的 ROS2 笔记涵盖从命令行到仿真的全链路。建议配合 Ubuntu 22.04 Humble 食用。1. 什么是 ROS2为什么要用它ROS 全称 Robot Operating System它不是传统意义的操作系统像 Linux/Windows而是一套运行在 Linux 上的机器人软件框架硬件抽象屏蔽雷达、摄像头、IMU、电机驱动的底层差异中间件提供标准化的节点间通信类似你之前学的 MQTT但更强大工具链调试、可视化RViz2、仿真Gazebo、录包bag算法库导航 Nav2、建图 SLAM、MoveIt2 机械臂规划开箱即用不用 ROS2 的痛点假设机器人有 3个模块激光雷达、摄像头、底盘控制由3个团队开发。没 ROS2雷达团队写个 socket 发数据摄像头团队写个串口底盘团队写个 CAN接口对不上联调地狱。有 ROS2大家都说Topic普通话雷达发/scan导航订阅/scan底盘订阅/cmd_vel即插即用。2. ROS1 vs ROS2一次颠覆性的重构特性ROS1 (Noetic)ROS2 (Humble/Iron)核心架构中心化必须有一个roscore / Master节点Master挂了全挂去中心化无Master基于 DDS 自动发现无单点故障通信中间件自定义 TCPROS/UDPROSDDS 标准工业级航空/国防在用实时性弱TCP延迟不可控强DDS 可配置 QoS 实时策略跨平台主要 LinuxLinux/Windows/macOS/RTOS构建系统catkinament colconPythonPython2Python3节点生命周期无节点启动即运行有可配置 unconfigured/inactive/active/shutdown适合产品安全性无加密SROS2支持认证加密一句话总结ROS1 是实验室玩具ROS2 是能上产线的商业系统。3. ROS2 架构五层分层模型从底到顶DDS层 (Data Distribution Service)厂商实现Fast DDS默认、CycloneDDS、Connext。负责真正的网络传输UDP多播/单播、共享内存。RMW层 (ROS Middleware Interface)抽象层把不同厂商 DDS API 统一成一套标准接口rmw_*。好处今天用 Fast DDS明天切 CycloneDDS代码一行不改。RCL层 (ROS Client Library)C语言实现的rcl封装节点、话题、服务等核心概念。客户端库层rclcpp(C)、rclpy(Python)、rcljava(Java) 等面向开发者。应用层你的节点、Nav2、MoveIt2。所以 ROS2 删除 Master 后怎么发现彼此靠 DDS 的SPDP SEDP自动发现新节点上线DDS 向239.255.0.1多播发广播我来了我有/scan发布器。其他节点收到回复我是谁我有什么订阅。两边 QoS 兼容则建立 P2P 直连后续不经过任何中心。4. 五大核心通信机制嵌入式类比秒懂对于 STM32 开发者用 FreeRTOS 类比ROS2组件FreeRTOS类比核心功能通信模式典型场景节点 Node任务 Task最小功能单元-激光驱动、电机控制、路径规划各一个节点话题 Topic消息队列 串口广播连续数据流异步、多对多雷达发/scan相机发/image_raw底盘发/odom消息 Messagestruct 结构体数据格式定义-geometry_msgs/Twist速度,sensor_msgs/LaserScan雷达服务 Service函数调用 问答一次性远程调用同步、一对一拍照、查询电量、重置里程计动作 Action状态机 带反馈任务长时间可取消任务异步 反馈导航到目标点NavigateToPose可中途取消看进度参数 ParameterFlash配置 全局变量节点动态配置-PID增益、最大速度不重启即可修改4.1 话题 Topic最常用80%场景publisher_node -- /scan (sensor_msgs/LaserScan) -- subscriber_node(s)特点解耦发布者不知道谁在听订阅者不知道谁发的。4.2 服务 Service客户端发 Request等待服务端 Response。同步阻塞但 ROS2 中是异步回调不会卡死。/client 请求 计算路径 - /planner 服务端 - 返回路径4.3 动作 Action服务话题的合体处理3秒以上的长任务导航、机械臂抓取。包含3部分Goal目标 Feedback周期反馈 Result最终结果且可取消。底层由3个话题2个服务实现但对你透明。4.4 参数 QoS参数ros2 param set /turtlesim background_r 128动态改背景颜色无需重启。QoS可靠性 RELIABLE / BEST_EFFORT历史 KEEP_LAST持久性 TRANSIENT_LOCAL 等可针对雷达/图像/控制指令精细配置。4.5 ROS2命令行操作ROS2 90%的调试都靠命令行掌握它就掌握了机器人的控制台。命令族常用命令作用ros2 nodelist,info /turtlesim,kill查看/杀死节点ros2 topiclist -t,echo /scan,hz /scan,bw,pub /cmd_vel ...调试连续数据流最常用ros2 servicelist -t,call /spawn ...,type,find调用一次性服务ros2 actionlist,info /navigate_to_pose,send_goal调试导航等长任务ros2 paramlist,get /node param,set,dump/load动态改参运行时调PIDros2 interfaceshow geometry_msgs/msg/Twist,list,proto查看消息结构ros2 bagrecord -a,play,info录包回放复现偶发Bugros2 runrun turtlesim turtlesim_node运行单个节点ros2 launchlaunch nav2_bringup bringup_launch.py一键启动多节点colconcolcon build --symlink-install,--packages-select编译工作空间实战口诀# 不知道有什么 ros2 topic list -t # 看话题 ros2 node list # 看节点 ros2 service list # 看服务 ​ # 不知道数据格式 ros2 interface show sensor_msgs/msg/LaserScan ​ # 看数据流是否正常 ros2 topic echo /scan --no-arr # 不打超长数组 ros2 topic hz /scan # 看雷达频率是不是10Hz5. ROS2开发环境配置推荐组合Ubuntu 22.04 ROS2 Humble HawksbillLTS到2027年最稳。5.1 一键安装sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 ​ sudo apt install software-properties-common -y sudo add-apt-repository universe sudo apt install curl gnupg lsb-release -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null ​ sudo apt update sudo apt install ros-humble-desktop -y # 桌面完整版含RViz2Gazebo示例 sudo apt install python3-colcon-common-extensions python3-rosdep ros-dev-tools -y ​ # 环境变量 echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc ​ # 初始化 rosdep sudo rosdep init || true rosdep update5.2 多机隔离与工具# 多机器人同WiFi防串台 export ROS_DOMAIN_ID10 # 0~101同一ID才能互通 ​ # VSCode插件ROS, URDF, 记得装 ​ # Docker版Windows/Mac用户 docker pull osrf/ros:humble-desktop验证ros2 run demo_nodes_cpp talker ros2 run demo_nodes_py listener # 看到 hello world 互通即成功6. 工作空间与功能包开发过程的大本营工作空间 Workspace是项目的物理边界。官方推荐~/ros2_ws。四个子目录src放所有功能包源码git clone都在里buildcolcon 编译中间文件不用管install编译产物setup.bash在这log编译日志功能包 Package是最小复用单元。包含package.xml依赖声明CMakeLists.txt(C) 或setup.py(Python) 代码。mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ​ # 创建C包 ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp std_msgs ​ # 创建Python包 ros2 pkg create my_py_pkg --build-type ament_python --dependencies rclpy std_msgs ​ # 创建带消息定义的包 ros2 pkg create my_interfaces --build-type ament_cmake --dependencies rosidl_default_generators ​ cd ~/ros2_ws rosdep install -i --from-path src --rosdistro humble -y colcon build --symlink-install source install/setup.bash--symlink-install对Python极其重要改.py不用重编直接运行。7. 节点机器人的工作细胞节点 Node 是 ROS2 最小执行单元一个独立进程只做一件事。import rclpy from rclpy.node import Node ​ class MyNode(Node): def __init__(self): super().__init__(my_first_node) # 节点名唯一 self.get_logger().info(Hello, 我是工作细胞) self.timer self.create_timer(1.0, self.tick) ​ def tick(self): self.get_logger().info(心跳...) ​ def main(): rclpy.init() rclpy.spin(MyNode()) # 阻塞处理回调 rclpy.shutdown()节点生命周期ROS2 独有产品级必用unconfigured - inactive - active - finalized可通过生命周期管理器lifecycle_manager统一配置机器人启动时先加载参数再激活。8. 话题节点间传递数据的桥梁话题 Topic 是异步、多对多广播最常用。/demonstration Publisher ---(/cmd_vel, geometry_msgs/Twist)--- Subscriber(s)Python 发布者self.pub self.create_publisher(Twist, /cmd_vel, 10) msg Twist() msg.linear.x 0.2 self.pub.publish(msg)订阅者self.sub self.create_subscription(LaserScan, /scan, self.scan_callback, 10) def scan_callback(self, msg): print(f最前面障碍物距离: {msg.ranges[0]})命令行调试ros2 topic list -t ros2 topic echo /turtle1/pose ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist {linear: {x: 0.5}, angular: {z: 0.5}} -1QoS 可选RELIABLE/BEST_EFFORT雷达用 BEST_EFFORT 少延迟控制指令用 RELIABLE 保到达。9. 服务节点间的你问我答服务 Service 是同步一对一请求响应类似函数调用。Client ---(Request: 拍照请求)--- Server Client ---(Response: 照片结果)--- Serverturtlesim 典型服务ros2 service list ros2 service call /spawn turtlesim/srv/Spawn {x: 2, y: 2, theta: 0.2, name: turtle2}代码from turtlesim.srv import Spawn self.client self.create_client(Spawn, /spawn) req Spawn.Request(x2.0, y2.0, namet2) future self.client.call_async(req) rclpy.spin_until_future_complete(self, future)适用重置里程计、保存地图、触发拍照等只需执行一次的任务。10. 通信接口数据传递的标准结构所有话题/服务/动作的数据类型都有标准定义放在msg/srv/action文件中。Message (.msg)话题载体# Twist.msg Vector3 linear Vector3 angularService (.srv)请求---响应# AddTwoInts.srv int64 a int64 b --- int64 sumAction (.action)目标---结果---反馈# Fibonacci.action int32 order # Goal --- int32[] sequence # Result --- int32[] partial_sequence # Feedback自定义接口# my_interfaces/msg/Student.msg string name int32 age # CMakeLists.txt rosidl_generate_interfaces(${PROJECT_NAME} msg/Student.msg srv/AddTwoInts.srv )ros2 interface show就能看到。11. 动作完整行为的流程管理Action Service(可取消) Topic(周期反馈)。处理长时间任务导航、机械臂执行。Client --Goal-- Server (开始去(2,2)) --Feedback-- (已走30%) --Feedback-- (已走80%) --Cancel-- (用户中途取消) --Result-- (成功/失败/取消)命令行ros2 action list ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose {pose: {pose: {position: {x: 2, y: 2}}}}Nav2 导航就是一个 Action ServerRViz2 点目标点就是 Client。12. 参数机器人系统的全局字典参数 Parameter 是节点的可动态配置变量无需重启。self.declare_parameter(kp, 1.0) kp self.get_parameter(kp).value # 支持回调参数一改控制立刻生效 self.add_on_set_parameters_callback(self.param_callback)命令行ros2 param list ros2 param get /turtlesim background_r ros2 param set /turtlesim background_r 200 ros2 param dump /turtlesim params.yaml ros2 param load /turtlesim params.yaml应用现场调小车最大速度、PID增益、相机曝光直接param set不用重新编译烧录。13. 分布式通信多计算平台的任务分配ROS2 原生支持分布式机器人端Jetson Orin 跑激光相机驱动PC端高性能主机跑建图、Nav2导航只要同一局域网同一ROS_DOMAIN_ID同一WiFi节点自动发现话题互通。# 机器人端192.168.1.10 export ROS_DOMAIN_ID42 ros2 run rplidar_ros rplidar_composition # PC端192.168.1.20 export ROS_DOMAIN_ID42 ros2 topic echo /scan # 就能收到机器人雷达 rviz2 # 就能可视化比 ROS1 需要ROS_MASTER_URI配置简单太多。进阶DDS支持跨广域网、SROS2加密适合车队。14. DDS机器人的神经网络DDS 是 ROS2 的底座工业级标准。Domain逻辑隔离域ROS_DOMAIN_ID就是 DDS Domain ID。Participant每个进程一个 Participant。Topic DataWriter/DataReader底层真正收发。QoS策略Reliability: RELIABLE/BEST_EFFORTDurability: VOLATILE/TRANSIENT_LOCAL新订阅者能否收到历史History: KEEP_LAST depthRMWROS中间件接口层抽象不同厂商 DDS。切换实现# 默认 Fast DDS export RMW_IMPLEMENTATIONrmw_fastrtps_cpp # 换 CycloneDDS更轻量 sudo apt install ros-humble-rmw-cyclonedds-cpp export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp理解 DDS调透 QoS是解决图像卡顿、控制丢包的关键。15. Launch多节点启动与配置脚本机器人启动要启动 10 节点雷达、IMU、底盘、TF、RViz...一个个ros2 run会累死Launch 一键搞定。ROS2 Launch 是 Python 脚本比 ROS1 XML 强大百倍支持 if 判断、变量。# my_robot/launch/robot.launch.py from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node(packagerplidar_ros, executablerplidar_composition, parameters[{serial_port: /dev/ttyUSB0, frame_id: laser}]), Node(packagemy_robot, executablebase_driver, outputscreen), Node(packagetf2_ros, executablestatic_transform_publisher, arguments[0,0,0.2,0,0,0,base_link,laser]), Node(packagerviz2, executablerviz2, arguments[-d, my.rviz]) ])运行ros2 launch my_robot robot.launch.py带参ros2 launch my_robot robot.launch.py use_sim_time:true16. TF机器人坐标系管理器机器人有无数坐标系map地图、odom里程计、base_link底盘、laser雷达、camera_link。TF就是管理它们关系的时变树。TF 是话题/tf和/tf_static每个变换都是父坐标 - 子坐标 时间戳tf2可查询任意时刻任意两坐标系的关系。ros2 run tf2_ros static_transform_publisher 0 0 0.2 0 0 0 base_link laser ros2 run tf2_tools view_frames # 生成PDF的TF树 rviz2 - Add - TF 看坐标轴代码监听from tf2_ros import Buffer, TransformListener self.tf_buffer Buffer() self.tf_listener TransformListener(self.tf_buffer, self) trans self.tf_buffer.lookup_transform(map, base_link, rclpy.time.Time())没有 TF导航、建图全崩。必须保证TF树连通无环。17. URDFROS机器人建模方法URDF (Unified Robot Description Format) 用 XML 描述机器人连杆 Link 关节 Joint。robot namemy_car link namebase_link visualgeometrycylinder length0.1 radius0.2//geometry/visual /link link nameleft_wheel/ joint nameleft_wheel_joint typecontinuous parent linkbase_link/child linkleft_wheel/ origin xyz0 0.2 0/axis xyz0 1 0/ /joint /robotlink外观visual、碰撞collision、惯性inertialjointfixed固定、continuous连续旋转轮子、revolute有限转角舵机、prismatic滑轨XacroURDF 宏支持变量、计算复杂机器人必用。sudo apt install ros-humble-joint-state-publisher-gui ros2 launch urdf_tutorial display.launch.py model:my_car.urdf # 在RViz里拖动滑杆看关节运动URDF TF 机器人完整数字孪生。18. Gazebo三维物理仿真平台Gazebo 是独立的物理引擎支持重力、摩擦、碰撞、光照、传感器仿真雷达噪声、相机畸变。Gazebo 负责让机器人动起来有物理Rviz 负责把数据画出来无物理经典流程# 安装 sudo apt install ros-humble-gazebo-ros-pkgs ros-humble-gazebo-ros2-control # 启动仿真 ros2 launch my_robot gazebo.launch.py # 话题桥接Gazebo的 /clock, /scan 会自动转 ROS2 话题在URDF里加gazebo标签和插件如libgazebo_ros_diff_drive.so差速驱动Gazebo就开始仿真轮子转。价值无需真机在仿真中测试 Nav2 算法撞烂了也不心疼。19. Rviz三维可视化显示平台Rviz2 不模拟只订阅话题并可视化。常用 DisplayRobotModel显示URDF模型LaserScan雷达点云PointCloud23D点云Map占据栅格地图Path导航路径TF坐标系Image相机图像rviz2 # Add - By topic - 勾选 /scan # 配置文件保存 .rviz下次一键加载配合 Nav2Rviz里可点2D Pose Estimate初始位姿2D Goal Pose导航目标。20. RQT模块化可视化工具RQT 是基于 Qt 的插件容器集成几十个小工具rqt # 打开插件选择器 rqt_graph # 节点图最常用看话题连接上一章用过 rqt_plot # 画曲线/odom速度波形 rqt_console # 日志过滤 rqt_reconfigure # 动态调参图形化前端 rqt_bag # 播放 bag 包安装sudo apt install ~nros-humble-rqt*调试三件套rqt_graphros2 topic echorviz2。21. ROS2应用与进阶攻略到此你已学完 ROS2 核心。下一步应用层导航 Nav2sudo apt install ros-humble-navigation2SLAM建图slam_toolbox定位amcl一键导航。机械臂 MoveIt2抓取规划。ros2_control统一硬件接口你的 STM32 底盘写一个hardware_interface就能被 Nav2 调度。micro-ROS在 STM32F4/H7 上直接跑 ROS2 节点不再经串口转发订阅/cmd_vel成为真·ROS2节点。进阶路线图动手造小车差速底盘 RPLIDAR A1 IMU跑通URDF - Gazebo - Nav2全流程。视觉v4l2_cameraOpenCVYOLO话题/image_raw→ 目标检测。多机协同两台机器人同ROS_DOMAIN_IDNav2支持多机编队。云边端ROS2 MQTT桥机器人数据上阿里云参考你之前 MQTT 篇。最终建议先把turtlesim 话题服务玩熟再用URDF Rviz搭自己模型再进Gazebo 仿真 Nav2 导航最后接真车总结本篇严格目录独立介绍了 ROS2 的命令行、环境、工程、五大通信、DDS、Launch、TF、URDF、Gazebo、Rviz、RQT。工具包Humble官方文档 鱼香ROS《ROS2机器人开发从入门到实践》 古月居教程
返回列表