type
Post
status
Published
date
Mar 18, 2026
slug
summary
tags
具身智能
ROS
SLAM
category
项目开发
icon
password
  1. 连接环境
    1. 对导航环境绘制地图
        • 激光雷达节点 ——> 雷达数据话题/scan ——>SLAM Toolbox
        • 机器人驱动节点 ——> 坐标变换/tf ——> SLAM Toolbox
    1. IP地址
    IP 地址
    身份
    角色功能
    192.168.123.18
    扩展坞 PC (上位机)
    你是谁。这就是你的 Jetson Orin,负责跑 SLAM、Qwen 大模型、作为 host_ip
    192.168.123.20
    MID-360 雷达
    你在看谁。这是雷达硬件,它会把数据发往 .18
    192.168.123.161
    运控 PC (底层)
    你在指挥谁。接收上位机的速度指令,转化为腿部动作。
    192.168.96.67
    本地 Wi-Fi 访问 IP
    你怎么进来的。这是你电脑远程连接机器人进行开发的“外网口”。
    1. 整体架构
    notion image
     

    硬件检查:Livox Mid-360


    1. 物理连接与网络检查

    首先确认 LiDAR 是否已通电并处于正确的网段。Livox 默认 IP 通常是 192.168.1.1XX
    tmux 的第一个窗口运行:
    • 正常: 有持续的毫秒级响应。
      • notion image
    • 异常: Destination Host Unreachable。如果是这样,请检查 Go2 的网口灯是否亮起,或使用 ip addr 确认你的机载电脑是否在同一网段。
      • notion image
     

    3. 脚本测试

    • 安装livox_ros_driver2设备驱动
    修改配置文件:MID360_config.json
    • 激活环境变量并编译代码
    • 运行Launch脚本
     

    宇树Go2机器人驱动


    1. GO2拓展模块更新

     

    2. 配置SDK

    • 安装SDK
       

      3. DDS通信(待定)

      SDK仅仅只是打通了底层硬件与代码之间的通讯问题,但是要使用ros直接进行操作,还需要封装成ros所用的topic、service和action,所以我们需要配置unitree_ros2封装支持包。
      • DDS通信:修改cyclonedds.xml
        • ssh连接:eth0
        • 通过ipconfig连接修改.bashrc
      • 工具包接入
        • 将unitree_go和unitree_api移植到工作空间src下,同时原来的src内的示例代码也移植过来备用。
          notion image
           

      4. unitree_sdk2:底层开发工具包

      这是宇树官方提供的原生 C++ 软件开发工具包。它是所有上层应用(包括官方 App、ROS 2 插件等)的基石。
      • 用途:
        • 直接控制: 不通过任何中间件,直接与机器人的运动控制板通讯。
        • 低延迟开发: 适用于对实时性要求极高的底层算法开发(如自定义步态平衡控制)。
        • 嵌入式部署: 在资源受限、无法运行 ROS 2 完整环境的计算单元上运行。
      • 结构:
        • Communication (DDS): 基于 CycloneDDS,实现了与机器人硬件的协议握手。
        • IDL (接口描述): 定义了机器人原生数据结构(如电机角度、IMU 原始数据)。
        • Robot Clients: 封装了 SportClient(运动客户端)、VideoClient(视频流客户端)等,直接调用机器人的 API。
      • 依赖: 主要是标准 C++ 环境、CycloneDDS 库和一些第三方压缩库(如 RapidJSON)。
       

      5. unitree_ros2:ROS 2 封装支持包

      这是基于 unitree_sdk2 开发的 ROS 2 适配层。它的核心任务是将 SDK 的功能转化为 ROS 开发者熟悉的 Topic(话题)Service(服务)Action(动作)
      • 用途:
        • 生态接入: 将 Go2W 接入 ROS 生态,以便使用 Nav2(导航)、Fast-LIO(建图) 等成熟算法。
        • 多机/多进程通讯: 利用 ROS 2 机制,让 SLAM 节点、视觉大模型节点和机器人驱动节点轻松交换数据。
      • 结构:
        • cyclonedds_ws 通信适配层,确保 ROS 2 的通讯协议与宇树底层的 DDS 协议一致。(在unitree中已经适配好无需自配)
        • unitree_go / unitree_api 消息定义包。将 SDK 里的 IDL 结构翻译成 ROS 2 的 .msg 文件。
        • Example 节点: 演示了如何编写一个 ROS 2 Node 来订阅机器人的状态话题。
      • 依赖: 必须安装 ROS 2 环境(如 Foxy 或 Humble),并依赖 unitree_sdk2 的部分头文件。
       

      SLAM建图


      这里我们参考B站:机器人工匠阿杰的教程来搭建整个slam框架。
      notion image
      notion image

      1. 核心依赖

      ROS 2 核心功能包依赖
      • livox_ros_driver2:雷达官方驱动(需确保配置为输出标准 PointCloud2 格式)。
      • pointcloud_to_laserscan:3D 降维 2D 核心包。
      • slam_toolbox:目前 ROS 2 生态中最强大的 2D 建图与定位引擎。
      • nav2_map_server:用于最终保存地图的工具。
       
      ROS 2 配套驱动和数据库:
       

      2. 数据流与坐标系畅通

      SLAM 引擎(slam_toolbox)就像一个极其挑剔的大脑,它必须同时接收到环境感知本体运动两种数据,且格式必须严丝合缝。
      • 感知流(雷达数据降维)
        • Mid-360 输出高频的 3D 点云(/livox/lidar)。
        • 经过降维节点,像切西瓜一样切出狗子腰部高度的一片数据,压扁成 2D 的单线激光(/scan),不仅过滤了天花板和地面的噪点,还极大地降低了算法算力需求。
        • QoS 降级:传感器数据天生是“尽力而为(Best Effort)”的,所以在 RViz 监听时必须手动调整 QoS 策略,否则数据包会被直接丢弃。
      • 运动流(真实里程计 TF 树)
        • 机器狗的底层状态话题 /lf/sportmodestate 包含了融合了腿部运动学与高频 IMU 的绝对坐标与姿态。
        • 依靠我们手搓的 C++ 翻译官节点,强行使用底层 DDS 规则解析这串数据,并实时发布 odom(原点)到 base_link(狗身体中心)的 TF 坐标系变换。这使得建图告别了纯靠雷达盲猜的“漂移”,地图稳如泰山。
      • 静态补丁:发布 base_linklivox_frame 的静态 TF,告诉大脑雷达安装在狗背上的确切位置。
       
       

      3. Slam代码编写

      notion image
       

      4. 固定环境配置(once)

      编辑 ~/.zshrc,将所有底层环境变量永久写入,告别多终端丢失变量的烦恼:
       

      5. 编译与运行

      1. 回到工作空间根目录编译。
        1. 打开新终端,直接运行
          1. 打开 RViz2,Fixed Framemap,配置 /livox/lidar/scan 的 QoS 为 Best Effort
          1. 遥控机器狗慢速遍历环境。
          1. 建图满意后,开新终端保存。
             

            踩坑说明


            💡
            在整个slam建图过程中核心有两个:
            • DDS通信
            • TF树
            其中,通过CycloneDDS配置,使ROS2和机器底层成功通信。
            在完成通信之后,则通过c++调用底层里程计状态数据来建立TF树,以辅助建图工作。

            1. DDS 配置文件

            终端环境变量加载
             

            2. std::bad_alloc 内存分配崩溃(非主因)

            • 现象: 运行 ros2 topic echo 时直接报错退出,甚至显示 Killed。
            • 原因: 并非你的物理内存不够,而是 CycloneDDS 试图在 eth0 网卡上申请超大的接收缓冲区来应对高频数据流(如雷达点云)。但 Linux 内核默认的 Socket 接收缓冲区(通常只有几 MB)太小,直接拒绝了 DDS 的申请。
            • 解决: 修改了系统内核参数 net.core.rmem_max,放开了网络内存限制。
             

            3. “半步发现”:看得到话题,却收不到数据(非主因)

            • 现象: ros2 topic list 能看到几十个话题,但 echo 任何话题都会卡住,且 ros2 node list 为空。
            • 原因: cyclonedds.xml 配置文件中写了 <AllowMulticast>spdp</AllowMulticast>。这导致你的系统只允许使用多播(Multicast)来发现设备,却拦截了所有使用多播传输的实际数据。
            • 解决: 将其修改为 <AllowMulticast>true</AllowMulticast>,彻底放开多播通道。
             

            4. 雷达降维罢工:格式标准不统一

            • 现象: 3D 转 2D 节点收不到数据,无法发布 /scan
            • 原因: Livox 驱动默认输出私有格式 CustomMsgxfer_format=1),而开源的 ROS 2 包只认标准的 sensor_msgs/PointCloud2xfer_format=0)。
            • 解决:将文件livox_ros_driver2/launch_ROS2/rviz_MID360_launch.py中的参数修改 xfer_format = 0
               

              5. SLAM 拒收数据:TF 坐标树断裂 —— 最初slam报错

              • 现象: 报错 Message Filter dropping message,地图无法生成。
              • 原因: SLAM 引擎需要完整的链路 map -> odom -> base_link -> livox_frame。由于一开始没有启动底盘真实的里程计,导致 odom -> base_link 缺失,SLAM 无法计算相对位移。
              • 解决:发布真实完整的TF(见6)。
               

              6. Python 脚本“失聪”:底层裸 DDS 的反序列化

              • 现象: C++ 的官方例程能收到机器狗状态数据,但 Python 写的 rclpy 节点完全收不到。
              • 原因: Unitree 发送的是没有标准 ROS 2 Header 包尾的“裸 DDS”数据。C++ 靠强类型内存地址能强行解析,而 Python 解析器出于安全机制,直接将这些“不规范”的数据包丢弃了。
              解决:手搓一个 C++ 版的 TF 翻译官
               
              💡
              有关问题,欢迎您在底部评论区留言,一起交流~
              视觉 Realsense D435iLivox Mid-360
              Loading...