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


    0. 驱动介绍

    A. 启动文件配置说明
    ROS 的启动文件位于“ws_livox/src/livox_ros_driver2/launch_ROS1”目录下,ROS2 的启动文件位于“ws_livox/src/livox_ros_driver2/launch_ROS2”目录下。不同的启动文件具有不同的配置参数值,用于不同的场景:
    启动文件名
    描述
    rviz_HAP.launch
    连接到 HAP LiDAR 设备发布 pointcloud2 格式数据自动加载 rviz
    msg_HAP.launch
    连接到 HAP LiDAR 设备,发布 Livox 定制点云数据
    rviz_MID360.launch
    连接到 MID360 LiDAR 设备,发布 pointcloud2 格式数据,自动加载 rviz
    msg_MID360.launch
    连接到 MID360 激光雷达设备,发布 Livox 定制点云数据
    rviz_mixed.launch
    连接到 HAP 和 MID360 激光雷达设备,发布 pointcloud2 格式数据,自动加载 rviz
    msg_mixed.launch
    连接到 HAP 和 MID360 激光雷达设备,发布 Livox 定制点云数据
    B. Livox ROS 驱动程序 2 内部主要参数配置说明
    Livox_ros_driver2 的所有内部参数都位于启动文件中。以下是三个常用参数的详细说明:
    范围
    详细描述
    默认
    发布频率
    设置点云发布频率,浮点数据类型,推荐值为 5.0、10.0、20.0、50.0 等。最大发布频率为 100.0 Hz。
    10.0
    多主题
    如果激光雷达设备拥有独立的用于发布点云数据的主题:0 -- 所有激光雷达设备使用同一个主题发布点云数据;1 -- 每个激光雷达设备都有自己的主题用于发布点云数据。
    0
    传输格式
    设置点云格式0 -- Livox pointcloud2(PointXYZRTLT) 点云格式1 -- Livox 自定义点云格式2 -- PCL 库中的标准 pointcloud2 (pcl :: PointXYZI) 点云格式(仅适用于 ROS)
    0
    C. 激光雷达配置参数
    激光雷达配置(例如 IP 地址、端口、数据类型等)可以通过 JSON 格式的配置文件进行设置。单个 HAP、Mid360 和混合激光雷达的配置文件位于“config”文件夹中。启动文件中的“user_config_path”参数指定了该 JSON 文件的路径。
    范围
    类型
    描述
    默认
    ip
    String
    您要配置的激光雷达的 IP 地址
    192.168.1.100
    pcl_data_type
    Int
    选择要发送的点云数据分辨率:1 -- 笛卡尔坐标数据(32 位)2 -- 笛卡尔坐标数据(16 位)3 -- 球坐标数据
    1
    pattern_mode
    Int
    空扫描模式0 -- 非重复扫描模式1 -- 重复扫描模式2 -- 重复扫描模式(低扫描速率)
    0
    blind_spot_set (Only for HAP LiDAR)
    Int
    设置盲区范围为 50 厘米至 200 厘米
    50
    extrinsic_parameter
    设置外参。“roll”、“picth”、“yaw”的数据类型为float;“x”、“y”、“z”的数据类型为int。
     

    1. 物理连接与网络检查

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

    2. 配置文件修改

    • IP 匹配:MID360_config.json 中,host_ip 必须设为机器狗 IP(192.168.123.18),lidar_ip192.168.123.20
    参考:MID360_config.json
    • 数据格式 (可选)
      • pcl_data_type: 0:输出标准 sensor_msgs/PointCloud2(Rviz 和通用 SLAM 算法首选)。
      • pcl_data_type: 1:输出 Livox 自定义 CustomMsg(Rviz 默认不识别)。
    • Launch 脚本选择
      • 必须使用 rviz_MID360_launch.py 才能确保驱动以“标准点云”模式启动,而 msg_... 脚本往往会强制回退到自定义消息格式。
    Livox_ros_driver2 的所有内部参数都位于启动文件中。以下是三个常用参数的详细说明:
     

    3. 脚本测试

    • 安装livox_ros_driver2设备驱动
    • 激活环境变量
    • 运行Launch脚本
    当驱动通过 rviz_MID360_launch.py 启动后,必须进行以下三项验证以确保硬件数据“可用”:
     
    A. 话题类型检查 (Topic Type)
    • 合格标准Type: sensor_msgs/msg/PointCloud2
    • 注意:如果类型仍为 CustomMsg,说明 pcl_data_type: 0 配置未生效,需重新编译工作空间或检查 install 目录下的配置文件。
     
     
    B. 坐标系对齐 (TF Tree)
    由于驱动可能不会自动发布全局地图坐标系,在 Rviz 中常会出现 Fixed Frame [map] does not exist 的错误。
    • 修复方案:运行静态变换发布器,将 map 坐标系与雷达坐标系 livox_frame 绑定。
       
      C. Rviz2 插件设置 (Plugin Settings)
      在 Rviz2 界面中,针对 Mid-360 的大数据量,需手动优化配置以防卡顿或黑屏:
      • Reliability Policy: 必须设置为 Best Effort
      • Color Transformer: 推荐设为 AxisColor,便于观察点云的高度层级。
      • Point Size: 设为 0.03m - 0.05m,增加点云在远程转发窗口的可视性。
       

      宇树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

        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代码编写

         

        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 翻译官
                 
                💡
                有关问题,欢迎您在底部评论区留言,一起交流~
                OpenGauss 数据库环境配置Go2:网络环境配置
                Loading...