ROS/ROS2

ROS (Robot Operating System) 并不是一个操作系统——它是一套发布/订阅中间件,外加一个庞大的工具和软件包生态系统,已经成为机器人软件领域的通用语言。对于SLAM来说,ROS解决的是那些不起眼但又必不可少的”管道”问题:把传感器数据从驱动传递到你的算法、维护坐标系的一致性、录制数据集,以及可视化结果。

你需要掌握的核心概念:

ROS 1 与 ROS 2:ROS 1(最终版本:Noetic)已经进入生命周期终点;新开发都面向 ROS 2,它用DDS替代了自定义传输层,增加了服务质量(QoS)控制(对有损无线链路和高频传感器至关重要),支持对实时友好的执行器,原生支持多平台,并去掉了单master架构。上述概念几乎原样延续;API分别是 rclcpp(C++)和 rclpy(Python)。

对SLAM而言,实践中的工作流程是:把算法写成一个完全不依赖ROS的库,然后添加一个薄薄的ROS封装节点,订阅传感器话题、驱动你的库、并发布里程计、TF修正量和可视化标记。这样能保持算法的可测试性和可移植性——ORB-SLAM3、VINS-Fusion、RTAB-Map以及大多数提供ROS支持的开源系统都采用这种模式。

一个用Python写的最简ROS 2封装展示了每个SLAM节点的基本形态:

import rclpy
from rclpy.node import Node
from rclpy.qos import qos_profile_sensor_data
from sensor_msgs.msg import Image, Imu
from nav_msgs.msg import Odometry

class SlamNode(Node):
    def __init__(self):
        super().__init__('my_slam')
        self.create_subscription(Image, '/camera/image_raw',
                                 self.on_image, qos_profile_sensor_data)
        self.create_subscription(Imu, '/imu/data',
                                 self.on_imu, qos_profile_sensor_data)
        self.odom_pub = self.create_publisher(Odometry, '/odom', 10)

    def on_imu(self, msg):   self.slam.feed_imu(msg)      # buffer at high rate
    def on_image(self, msg): self.odom_pub.publish(
                                 to_odom_msg(self.slam.track(msg)))

rclpy.init(); rclpy.spin(SlamNode())

值得记住的日常命令:ros2 bag record -a / ros2 bag play <bag>ros2 topic hz <topic>(数据到底有没有到达,速率是多少?)、ros2 topic echoros2 run tf2_tools view_frames(导出TF树),以及用 ros2 node info <node> 做接线检查。对于多传感器输入,message_filters 提供了近似时间同步器,用于把图像与深度或IMU批数据配对。

常见陷阱

对SLAM的意义

几乎你会部署的每个机器人都说ROS:传感器数据以ROS话题到达,外参存在TF里,下游消费者(导航、规划)期望 nav_msgs/Odometry 和一个 map 坐标系。能够把一个SLAM系统封装成ROS 2节点、重放bag、并用RViz调试,是科研和工业机器人工作的基本技能。

动手实践

相关条目