type
Post
status
Published
date
Mar 18, 2026
slug
summary
tags
具身智能
ROS
SLAM
category
项目开发
icon
password
- 连接环境
- 对导航环境绘制地图
- 激光雷达节点 ——> 雷达数据话题/scan ——>SLAM Toolbox
- 机器人驱动节点 ——> 坐标变换/tf ——> SLAM Toolbox
- 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 | 你怎么进来的。这是你电脑远程连接机器人进行开发的“外网口”。 |
- 整体架构

硬件检查:Livox Mid-360
1. 物理连接与网络检查
首先确认 LiDAR 是否已通电并处于正确的网段。Livox 默认 IP 通常是
192.168.1.1XX。在
tmux 的第一个窗口运行:- 正常: 有持续的毫秒级响应。

- 异常:
Destination Host Unreachable。如果是这样,请检查 Go2 的网口灯是否亮起,或使用ip addr确认你的机载电脑是否在同一网段。

3. 脚本测试
- 安装livox_ros_driver2设备驱动
修改配置文件:MID360_config.json
- 激活环境变量并编译代码
- 运行Launch脚本
宇树Go2机器人驱动
1. GO2拓展模块更新
- 本地浏览器连接
192.168.96.67
192.168.96.67
- 下载拓展坞模块更新包
- 如果你的 Go2 腿部末端是橡胶足端(像个小蹄子),选 GO2 SLAM 服务。
- 如果你的 Go2 腿部末端自带轮子(可以像车一样滑行),选 GO2_W SLAM 服务。
2. 配置SDK
- 获取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内的示例代码也移植过来备用。

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框架。


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_link到livox_frame的静态 TF,告诉大脑雷达安装在狗背上的确切位置。
3. Slam代码编写

4. 固定环境配置(once)
编辑
~/.zshrc,将所有底层环境变量永久写入,告别多终端丢失变量的烦恼:5. 编译与运行
- 回到工作空间根目录编译。
- 打开新终端,直接运行
- 打开 RViz2,
Fixed Frame选map,配置/livox/lidar和/scan的 QoS 为Best Effort。
- 遥控机器狗慢速遍历环境。
- 建图满意后,开新终端保存。
踩坑说明
在整个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 驱动默认输出私有格式
CustomMsg(xfer_format=1),而开源的 ROS 2 包只认标准的sensor_msgs/PointCloud2(xfer_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 翻译官
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/318c7b13-c6a7-80e4-b4f3-d61bfd6d863c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!









