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
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 的第一个窗口运行:- 正常: 有持续的毫秒级响应。

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

2. 配置文件修改
- IP 匹配:
MID360_config.json中,host_ip必须设为机器狗 IP(192.168.123.18),lidar_ip为192.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拓展模块更新
- 本地浏览器连接
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!











