feat: 初始化 Go2 导航代码与配置
This commit is contained in:
551
README.md
Normal file
551
README.md
Normal file
@@ -0,0 +1,551 @@
|
||||
# Go2 Navigation
|
||||
|
||||
基于 Unitree Go2、Livox LiDAR、ROS/ROS2、FAST-LIO 和 Unitree SDK 的导航与建图资料仓库。仓库把驱动、点云里程计、传统 ROS1 建图、Unitree SLAM 示例、机器人 ROS2 消息包、C++ SDK、网页控制台和 LiDAR 外参标定工具集中在一起,便于在真实 Go2 与 Livox 设备上进行建图、定位、导航和调试。
|
||||
|
||||
> **仓库状态**:这是一个多项目集合,不是可以用一条命令构建的单一 ROS workspace。不同目录对应不同上游项目、ROS 发行版和运行方式;请先选择目标模块,再按本文对应章节操作。
|
||||
|
||||
## 目录
|
||||
|
||||
- [项目组成](#项目组成)
|
||||
- [系统要求](#系统要求)
|
||||
- [目录结构](#目录结构)
|
||||
- [网络与设备](#网络与设备)
|
||||
- [快速开始](#快速开始)
|
||||
- [各模块构建与运行](#各模块构建与运行)
|
||||
- [配置说明](#配置说明)
|
||||
- [话题、服务与数据流](#话题服务与数据流)
|
||||
- [地图与标定数据](#地图与标定数据)
|
||||
- [验证清单](#验证清单)
|
||||
- [故障排查](#故障排查)
|
||||
- [文档索引](#文档索引)
|
||||
- [许可证](#许可证)
|
||||
|
||||
## 项目组成
|
||||
|
||||
| 路径 | 内容 | 主要入口 | 运行环境 |
|
||||
| --- | --- | --- | --- |
|
||||
| `Livox-SDK2/` | Livox HAP、Mid-360 等设备的 C/C++ SDK、示例和通信配置 | `CMakeLists.txt`、`samples/` | Linux/Windows,C++11,CMake 3.0+ |
|
||||
| `ws_livox/src/livox_ros_driver2/` | Livox ROS Driver 2,发布标准点云或 `CustomMsg` | `build.sh`、`launch_ROS2/` | ROS1 或 ROS2 Foxy/Humble/Jazzy |
|
||||
| `fast_lio_ws/src/FAST_LIO_ROS2/` | FAST-LIO2 ROS2 激光惯性里程计和 PCD 建图 | `launch/mapping.launch.py` | Ubuntu 20.04+,ROS2,PCL,Eigen |
|
||||
| `livox_mapping/` | Livox 的 ROS1 LOAM 低速建图包 | `launch/mapping_*.launch` | Ubuntu 16.04/18.04,ROS Kinetic/Melodic |
|
||||
| `Livox_automatic_calibration-master/` | 双 Livox 雷达点云外参自动标定 | `mapping`、`calibration`、`fitline` | CMake,PCL 1.7,Eigen |
|
||||
| `unitree_ros2/` | Unitree Go2/B2/H1/G1 的 ROS2 消息包和示例 | `cyclonedds_ws/`、`example/` | ROS2 Foxy 或 Humble,CycloneDDS |
|
||||
| `unitree_sdk2/` | Unitree C++ SDK2 及 Go2、G1、H1 等示例 | `CMakeLists.txt`、`example/` | Ubuntu 20.04,GCC 9.4,C++17 |
|
||||
| `unitree_slam/` | Unitree SLAM 二进制、配置、动态库和 `keyDemo` 示例 | `example/src/keyDemo.cpp`、`bin/keyDemo` | ARM64 Unitree 设备或匹配的交叉环境 |
|
||||
| `unitree_ui/unitree_ui-main/` | 基于 TypeScript、Three.js、Vite 的 WebRTC 控制台 | `package.json`、`start.sh` | Node.js 18+,npm 9+,Chrome |
|
||||
| `go2_maps/` | 本地 Go2 地图和初始位姿文件(默认被 Git 忽略) | `.yaml`、`.pgm`、`.pcd` | Unitree SLAM/导航数据 |
|
||||
| `go2-environment-setup-handoff.md` | 另一套自主巡检仓库的环境交接记录 | 文档本身 | 仅作历史参考 |
|
||||
|
||||
仓库同时保留部分第三方源码、预编译库、构建目录和示例资源。`3rdparty/`、`build/`、`node_modules/` 等内容不需要重新整理到本 README;使用某个模块时,以该模块的 `README.md`、`CMakeLists.txt`、`package.xml` 或 `package.json` 为准。
|
||||
|
||||
## 系统要求
|
||||
|
||||
建议在 Ubuntu 20.04/22.04 上运行。ROS1 建图和旧版标定工具依赖旧发行版;FAST-LIO 与 Livox ROS Driver 2 建议使用 ROS2 Humble。
|
||||
|
||||
| 组件 | 建议版本 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| CMake | 3.10+(SDK2 最低 3.0) | C/C++ 模块构建 |
|
||||
| GCC/G++ | 9.4+ | SDK2、ROS2 示例和 FAST-LIO |
|
||||
| ROS2 | Humble(Foxy 也有脚本) | Livox Driver 2、FAST-LIO、Unitree ROS2 |
|
||||
| ROS1 | Kinetic/Melodic | `livox_mapping` 和部分旧标定流程 |
|
||||
| PCL | 1.8+;标定工具要求 1.7 | 点云处理 |
|
||||
| Eigen | 3.3.4+ | 状态估计与几何计算 |
|
||||
| Node.js/npm | Node.js 18+,npm 9+ | Unitree WebRTC UI |
|
||||
| Python | Python 3 | UI BLE 服务和启动脚本 |
|
||||
| 浏览器 | Chrome | WebRTC 控制台 |
|
||||
|
||||
先检查本机工具链:
|
||||
|
||||
```bash
|
||||
gcc --version
|
||||
cmake --version
|
||||
python3 --version
|
||||
node --version
|
||||
source /opt/ros/humble/setup.bash
|
||||
ros2 --version
|
||||
```
|
||||
|
||||
ROS2 包构建前建议安装依赖:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y build-essential cmake libeigen3-dev libpcl-dev \
|
||||
python3-colcon-common-extensions python3-rosdep
|
||||
rosdep update
|
||||
```
|
||||
|
||||
Unitree ROS2 的官方依赖还包括 `rmw-cyclonedds-cpp`、`rosidl-generator-dds-idl` 和 `libyaml-cpp-dev`。不同 ROS 发行版的包名要把 `foxy` 替换成实际发行版。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```text
|
||||
Go2_navigation/
|
||||
├── Livox-SDK2/ # Livox SDK2 与 C++ samples
|
||||
├── Livox_automatic_calibration-master/ # 双雷达外参自动标定
|
||||
├── fast_lio_ws/src/FAST_LIO_ROS2/ # FAST-LIO2 ROS2
|
||||
├── livox_mapping/ # Livox ROS1 LOAM 建图
|
||||
├── ws_livox/src/livox_ros_driver2/ # Livox ROS Driver 2
|
||||
├── unitree_ros2/ # Unitree ROS2 消息与示例
|
||||
├── unitree_sdk2/ # Unitree SDK2
|
||||
├── unitree_slam/ # Unitree SLAM 二进制与配置
|
||||
├── unitree_ui/unitree_ui-main/ # WebRTC/Three.js 控制台
|
||||
├── go2_maps/ # 本地地图资产
|
||||
└── go2-environment-setup-handoff.md # 历史环境交接
|
||||
```
|
||||
|
||||
## 网络与设备
|
||||
|
||||
### Unitree Go2
|
||||
|
||||
Unitree ROS2 文档以有线网卡连接为例:电脑网卡配置为 `192.168.123.99/24`,机器人通常位于同一网段。把 `unitree_ros2/setup.sh` 中的 `enp3s0` 改为实际网卡名,然后加载环境:
|
||||
|
||||
```bash
|
||||
cd unitree_ros2
|
||||
source setup.sh
|
||||
ros2 topic list
|
||||
```
|
||||
|
||||
仅本机仿真或回环测试可使用:
|
||||
|
||||
```bash
|
||||
source unitree_ros2/setup_local.sh # CycloneDDS 使用 lo
|
||||
# 或
|
||||
source unitree_ros2/setup_default.sh # 不指定网卡
|
||||
```
|
||||
|
||||
注意:仓库中的这三个脚本仍然使用 `/opt/ros/foxy` 和 `$HOME/unitree_ros2`。如果仓库不在 `$HOME/unitree_ros2`,需要先修改脚本中的路径;使用 Humble 时也要将 Foxy 路径改为 Humble。
|
||||
|
||||
### Livox LiDAR
|
||||
|
||||
Livox Driver 2 的 MID360 示例使用独立的设备网段。配置文件示例使用 `192.168.1.x`,控制、推送、点云、IMU、日志端口分别为 `56100`–`56500`(主机端通常为 `56101`–`56501`)。把 `host_ip`、LiDAR IP 和网卡地址改成现场实际值,确保防火墙允许这些 UDP 端口。
|
||||
|
||||
Go2 内置 SLAM 的配置则使用机器人 DDS 网络和 `rt/unitree/...` 话题。不要把 Livox 独立网段的配置直接套到 Unitree DDS 网卡上。
|
||||
|
||||
## 快速开始
|
||||
|
||||
下面是一条适用于“外置 Livox + ROS2 FAST-LIO”的最短流程。每个命令在独立终端执行。
|
||||
|
||||
### 1. 构建 Livox SDK2
|
||||
|
||||
```bash
|
||||
cd Livox-SDK2
|
||||
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build build -j$(nproc)
|
||||
sudo cmake --install build
|
||||
```
|
||||
|
||||
SDK 默认安装库到 `/usr/local/lib`、头文件到 `/usr/local/include`。如果不希望安装到系统目录,请为 Driver 2 和后续 CMake 工程显式设置 `CMAKE_PREFIX_PATH` 或库搜索路径。
|
||||
|
||||
### 2. 构建并启动 Livox ROS Driver 2
|
||||
|
||||
```bash
|
||||
source /opt/ros/humble/setup.bash
|
||||
cd ws_livox/src/livox_ros_driver2
|
||||
bash build.sh humble
|
||||
source ../../install/setup.bash
|
||||
ros2 launch livox_ros_driver2 msg_MID360_launch.py
|
||||
```
|
||||
|
||||
单雷达使用 `MID360_config.json`,多雷达使用 `msg_MID360s_launch.py` 和 `MID360s_config.json`。FAST-LIO 使用 Livox 每点时间戳时,必须发布 `CustomMsg` 格式;不要使用不能提供每点时间的旧 `livox_lidar.launch` 变体。
|
||||
|
||||
### 3. 构建并启动 FAST-LIO2
|
||||
|
||||
```bash
|
||||
source /opt/ros/humble/setup.bash
|
||||
cd fast_lio_ws
|
||||
rosdep install --from-paths src --ignore-src -r -y
|
||||
colcon build --symlink-install
|
||||
source install/setup.bash
|
||||
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml
|
||||
```
|
||||
|
||||
如果使用 Avia、Horizon、Velodyne 或 Ouster,把 `config_file` 换成 `avia.yaml`、`horizon.yaml`、`velodyne.yaml` 或 `ouster64.yaml`。先启动 Driver,再启动 FAST-LIO;检查 `/livox/lidar`、`/livox/imu` 是否有数据。
|
||||
|
||||
保存 PCD:
|
||||
|
||||
```bash
|
||||
ros2 service call /map_save std_srvs/srv/Trigger "{}"
|
||||
```
|
||||
|
||||
保存路径由对应 YAML 的 `map_file_path` 和 `pcd_save.pcd_save_en` 决定。默认 `interval: -1` 会将所有帧写入一个文件,长时间运行可能占用大量内存。
|
||||
|
||||
### 4. 启动网页控制台
|
||||
|
||||
```bash
|
||||
cd unitree_ui/unitree_ui-main
|
||||
npm install
|
||||
npm run start:no-ble
|
||||
```
|
||||
|
||||
浏览器打开 Vite 输出的地址(通常是 `http://localhost:5173`)。需要机器人 BLE 配网或 BLE 遥控器时使用:
|
||||
|
||||
```bash
|
||||
npm run start
|
||||
```
|
||||
|
||||
该命令会启动 Vite 和 FastAPI BLE 服务(端口 `5051`)。依赖来自 `server/requirements.txt`,包括 FastAPI、Uvicorn、Bleak、PyCryptodome、pygatt 和 websockets。
|
||||
|
||||
## 各模块构建与运行
|
||||
|
||||
### Livox SDK2
|
||||
|
||||
SDK2 提供 C 风格 API,覆盖 HAP、Mid-360 等 Livox 设备。源码中包含快速启动、日志、信息查询、IP 设置、时间同步、多雷达升级和调试点云等 sample:
|
||||
|
||||
```bash
|
||||
cd Livox-SDK2/build
|
||||
./samples/livox_lidar_quick_start/livox_lidar_quick_start \
|
||||
../samples/livox_lidar_quick_start/<config.json>
|
||||
```
|
||||
|
||||
日志配置包括 `lidar_log_enable`、`lidar_log_cache_size_MB` 和 `lidar_log_path`。升级固件会让设备停止工作,必须使用与设备匹配的固件文件并在现场操作前确认网络稳定。
|
||||
|
||||
### Livox ROS Driver 2
|
||||
|
||||
ROS2 launch 文件位于 `ws_livox/src/livox_ros_driver2/launch_ROS2/`:
|
||||
|
||||
| Launch | 用途 |
|
||||
| --- | --- |
|
||||
| `msg_HAP_launch.py` | HAP,自定义消息 |
|
||||
| `msg_MID360_launch.py` | 单 Mid-360,自定义消息 |
|
||||
| `msg_MID360s_launch.py` | 多 Mid-360,自定义消息 |
|
||||
| `rviz_HAP_launch.py`、`rviz_MID360_launch.py` | 启动驱动并打开 RViz |
|
||||
| `rviz_mixed.py` | 混合型号可视化 |
|
||||
|
||||
需要修改的参数位于 launch 文件开头和 `config/`:`xfer_format`、`multi_topic`、`publish_freq`、`frame_id`、`user_config_path` 以及设备 IP。配置文件使用 JSON,不能包含注释或 `...` 占位符。
|
||||
|
||||
### FAST-LIO2 ROS2
|
||||
|
||||
FAST-LIO 将 LiDAR 和 IMU 通过紧耦合迭代扩展卡尔曼滤波器融合,并使用 ikd-Tree 增量维护地图。配置重点:
|
||||
|
||||
| 参数 | 说明 |
|
||||
| --- | --- |
|
||||
| `common.lid_topic` / `imu_topic` | 输入话题,Mid-360 默认 `/livox/lidar`、`/livox/imu` |
|
||||
| `preprocess.lidar_type` | Livox=1、Velodyne=2、Ouster=3、通用点云=4 |
|
||||
| `mapping.extrinsic_T/R` | LiDAR 在 IMU body frame 中的外参 |
|
||||
| `mapping.extrinsic_est_en` | 是否在线估计外参;已有可靠外参时建议关闭 |
|
||||
| `publish.*` | 点云、地图、路径和 body-frame 输出开关 |
|
||||
| `pcd_save.*` | PCD 保存开关、间隔和输出路径 |
|
||||
|
||||
输出话题和服务由 `src/laserMapping.cpp` 实现,包含 `/cloud_registered`、`/cloud_registered_body`、`/cloud_effected`、`/Laser_map`、`/Odometry`、`/path` 和 `/map_save`。
|
||||
|
||||
### Livox ROS1 LOAM 建图
|
||||
|
||||
`livox_mapping` 是旧 ROS1 catkin 包,依赖 `livox_ros_driver`、PCL、Eigen 和 OpenCV:
|
||||
|
||||
```bash
|
||||
cd <catkin_ws>/src
|
||||
ln -s /path/to/Go2_navigation/livox_mapping livox_mapping
|
||||
cd ..
|
||||
catkin_make
|
||||
source devel/setup.bash
|
||||
roslaunch livox_mapping mapping_mid.launch
|
||||
```
|
||||
|
||||
Horizon 使用 `mapping_horizon.launch`,室外示例使用 `mapping_outdoor.launch`。需要保存地图时,在 launch 文件中设置 `map_file_path`。
|
||||
|
||||
### Livox 双雷达外参自动标定
|
||||
|
||||
工具会先用基准雷达建立地图,再将目标雷达逐帧配准,最后用 `fitline` 拟合外参矩阵:
|
||||
|
||||
```bash
|
||||
cd Livox_automatic_calibration-master
|
||||
cmake -S . -B build
|
||||
cmake --build build -j$(nproc)
|
||||
cp run.sh build/
|
||||
cd build
|
||||
bash run.sh
|
||||
```
|
||||
|
||||
运行前准备:
|
||||
|
||||
```text
|
||||
data/Base_LiDAR_Frames/100000.pcd # 基准雷达,帧号递增
|
||||
data/Target-LiDAR-Frames/100000.pcd # 目标雷达,时间同步
|
||||
data/Init_Matrix.txt # 粗配准初值
|
||||
```
|
||||
|
||||
程序会生成 `data/H-LiDAR-Map-data/H_LiDAR_Map.pcd`、`T_Matrix.txt` 和 `calib_data.txt` 等中间结果。两路数据必须尽可能同步,采集时应缓慢运动、减少动态物体,并保证初始矩阵大致对齐。
|
||||
|
||||
### Unitree ROS2 消息与示例
|
||||
|
||||
消息包包括:
|
||||
|
||||
- `unitree_api`:请求、响应和租约消息。
|
||||
- `unitree_go`:Go2/B2 的低层、高层、IMU、BMS、LiDAR、遥控器和运动消息。
|
||||
- `unitree_hg`:G1/H1 等人形机器人的电机、手部和主板消息。
|
||||
|
||||
构建:
|
||||
|
||||
```bash
|
||||
source /opt/ros/humble/setup.bash
|
||||
cd unitree_ros2/cyclonedds_ws
|
||||
colcon build --symlink-install
|
||||
source install/setup.bash
|
||||
|
||||
cd ../example
|
||||
colcon build --symlink-install
|
||||
source install/setup.bash
|
||||
```
|
||||
|
||||
常用示例:
|
||||
|
||||
```bash
|
||||
ros2 run unitree_ros2_example read_motion_state
|
||||
ros2 run unitree_ros2_example read_low_state
|
||||
ros2 run unitree_ros2_example read_wireless_controller
|
||||
ros2 run unitree_ros2_example go2_sport_client
|
||||
```
|
||||
|
||||
Go2 高层运动通过 `/api/sport/request` 请求响应接口,低层控制通过 `/lowcmd` 发布 `unitree_go/msg/LowCmd`。低层控制会直接驱动关节,必须先确认机器人处于安全状态并准备急停。
|
||||
|
||||
### Unitree SDK2
|
||||
|
||||
SDK2 的 CMake 工程按 CPU 架构从 `lib/<CMAKE_SYSTEM_PROCESSOR>/` 查找预编译库:
|
||||
|
||||
```bash
|
||||
cmake -S unitree_sdk2 -B unitree_sdk2/build -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build unitree_sdk2/build -j$(nproc)
|
||||
```
|
||||
|
||||
安装到系统或自定义前缀:
|
||||
|
||||
```bash
|
||||
cmake --install unitree_sdk2/build --prefix /opt/unitree_robotics
|
||||
```
|
||||
|
||||
自定义前缀需要加入 `CMAKE_PREFIX_PATH`。`unitree_sdk2/example/` 中按 Go2、G1、H1、B2、B2W、H2 等型号提供高级控制、低级控制、状态读取、无线遥控和 JSON 示例。
|
||||
|
||||
### Unitree SLAM 示例
|
||||
|
||||
`unitree_slam/bin/` 内已有 ARM64 二进制和配套动态库;源码示例依赖已安装的 `unitree_sdk2`:
|
||||
|
||||
```bash
|
||||
cmake -S unitree_slam/example -B /tmp/unitree_slam_example-build
|
||||
cmake --build /tmp/unitree_slam_example-build -j$(nproc)
|
||||
./unitree_slam/bin/keyDemo eth0
|
||||
```
|
||||
|
||||
`keyDemo` 的按键流程:
|
||||
|
||||
| 按键 | 操作 |
|
||||
| --- | --- |
|
||||
| `q` / `w` | 开始 / 结束建图 |
|
||||
| `a` | 开始重定位 |
|
||||
| `s` / `d` / `f` | 添加位姿、执行任务、清空任务 |
|
||||
| `z` / `x` | 暂停 / 恢复导航 |
|
||||
| 其他键 | 停止 SLAM |
|
||||
|
||||
示例源码将地图写入机器人 `/home/unitree/test.pcd`,重定位也从该路径读取。现场使用时应修改为机器人上实际存在的 PCD 文件,并检查 `unitree_slam/config/` 中的网卡名、LiDAR 型号、DDS XML 路径和 `rt/unitree/...` 话题。
|
||||
|
||||
### Unitree WebRTC UI
|
||||
|
||||
网页控制台支持 Go2、G1 和 R1,主要能力包括:实时视频和 3D 视图、双摇杆、运动模式、状态面板、错误解码、服务管理、账号、BLE 配网、BLE 遥控转发、Go2 3D LiDAR SLAM、地图缓存和自动充电。
|
||||
|
||||
生产构建:
|
||||
|
||||
```bash
|
||||
cd unitree_ui/unitree_ui-main
|
||||
npm run build
|
||||
npm run preview
|
||||
```
|
||||
|
||||
详细协议说明在 `docs/`,其中 `connection.md`、`control.md`、`status.md`、`slam.md`、`lidar.md` 和 `remote-control.md` 是排查连接与控制问题的首选文档。
|
||||
|
||||
## 配置说明
|
||||
|
||||
### Livox MID360 JSON
|
||||
|
||||
`ws_livox/src/livox_ros_driver2/config/MID360_config_backup.json` 是完整的单雷达示例。当前 `MID360_config.json` 含有 `...` 占位符,不是合法 JSON;在启动前必须补齐 `lidar_configs` 并通过解析检查:
|
||||
|
||||
```bash
|
||||
python3 -m json.tool ws_livox/src/livox_ros_driver2/config/MID360_config_backup.json >/dev/null
|
||||
```
|
||||
|
||||
关键字段包括 `lidar_net_info`、`host_net_info`、LiDAR IP、点云数据类型、扫描模式和外参。不要把示例 IP 直接用于现场设备。
|
||||
|
||||
### FAST-LIO YAML
|
||||
|
||||
`fast_lio_ws/src/FAST_LIO_ROS2/config/` 提供 `avia.yaml`、`horizon.yaml`、`mid360.yaml`、`velodyne.yaml` 和 `ouster64.yaml`。修改输入话题、扫描线、盲区、时间单位、外参、视场角和 PCD 输出路径后再启动。
|
||||
|
||||
FAST-LIO 的外参定义是 LiDAR 在 IMU body frame 中的位姿,不是 IMU 在 LiDAR frame 中的逆变换;方向弄反会导致点云扭曲和里程计发散。
|
||||
|
||||
### Unitree SLAM YAML/JSON
|
||||
|
||||
`unitree_slam/config/` 里包含 Mid-360、XT16、建图、重定位、规划、栅格地图、充电和 DDS 配置。以下内容通常必须按设备修改:
|
||||
|
||||
- `network` 或 `network_interface`:实际以太网卡。
|
||||
- `lidar_ysn`、`lidar_ip`:LiDAR 序列号和地址。
|
||||
- `odom_topic`、`imu_topic`、`lidar_topic`:机器人实际 DDS 话题。
|
||||
- `dds_config.json` 与 `dds_parameter.json` 中的绝对路径。
|
||||
- 建图/重定位的 PCD、PGM、YAML 文件路径。
|
||||
|
||||
仓库中的部分配置仍保留 `/home/unitree/...`、`/home/unitree/graph_pid_ws/...` 等设备端历史路径,迁移到新机器前必须替换。
|
||||
|
||||
### Go2 地图资产
|
||||
|
||||
`go2_maps/` 中的地图通常由以下文件组成:
|
||||
|
||||
```text
|
||||
<name>.pcd # 3D 点云地图
|
||||
<name>.pgm # 2D 占据栅格图
|
||||
<name>.yaml # 分辨率、原点、阈值和 PGM 引用
|
||||
<name>.initial-pose # 初始位姿
|
||||
<name>.map-manifest.json # 校准 ID、哈希、点数和版本
|
||||
```
|
||||
|
||||
示例 YAML 使用 `resolution: 0.05`、`mode: trinary`、`occupied_thresh: 0.65`、`free_thresh: 0.25`。地图目录和 mapping log 默认被 `.gitignore` 忽略,发布或备份前请单独归档。
|
||||
|
||||
## 话题、服务与数据流
|
||||
|
||||
```text
|
||||
Livox LiDAR
|
||||
└─ livox_ros_driver2
|
||||
├─ /livox/lidar + /livox/imu (CustomMsg / sensor_msgs)
|
||||
└─ fast_lio_mapping
|
||||
├─ /cloud_registered, /Laser_map
|
||||
├─ /Odometry, /path
|
||||
└─ /map_save
|
||||
|
||||
Unitree Go2 DDS
|
||||
├─ /sportmodestate, /lowstate, /wirelesscontroller
|
||||
├─ /api/sport/request, /lowcmd
|
||||
└─ rt/unitree/slam_*
|
||||
|
||||
Browser
|
||||
└─ WebRTC data channel/video + BLE FastAPI proxy
|
||||
```
|
||||
|
||||
常用检查命令:
|
||||
|
||||
```bash
|
||||
ros2 topic list
|
||||
ros2 topic hz /livox/lidar
|
||||
ros2 topic echo --once /livox/imu
|
||||
ros2 service list | grep map_save
|
||||
ros2 topic echo --once /Odometry
|
||||
```
|
||||
|
||||
Unitree UI 的 SLAM 页面使用 `rt/uslam/client_command` 发送 `mapping/...`、`localization/...`、`navigation/...` 和 `patrol/...` 字符串命令,状态从 `rt/uslam/server_log`、点云、里程计和路径话题返回。地图文件通过 WebRTC 内部文件传输通道分块传输,并在浏览器 IndexedDB 中缓存。
|
||||
|
||||
## 地图与标定数据
|
||||
|
||||
建议采用以下现场流程:
|
||||
|
||||
1. 固定 LiDAR 和 IMU,记录安装方向、坐标系和网卡地址。
|
||||
2. 用 Livox Driver 检查点云与 IMU 时间戳;FAST-LIO 要求每点时间可用。
|
||||
3. 采集缓慢、闭环且包含丰富几何特征的数据,避免人车等动态物体。
|
||||
4. 先用已知外参或机械测量值运行 FAST-LIO,保存 PCD 并检查重影、扭曲和闭环误差。
|
||||
5. 双雷达场景使用 `Livox_automatic_calibration-master`,保证两路 PCD 文件名和时间戳一一对应。
|
||||
6. 把确认后的外参写入 FAST-LIO YAML 或设备配置,再重新建图验证。
|
||||
7. Go2 官方 SLAM 地图同时保存 PCD、PGM、YAML、初始位姿和 manifest,不要只保留单个 PCD。
|
||||
|
||||
外参验证至少采用一种独立方法:重叠视场观察墙面是否错层,或把目标雷达变换后与基准点云融合再重新建图。若出现分层,优先检查时间同步、坐标方向、初值和地图质量。
|
||||
|
||||
## 验证清单
|
||||
|
||||
### 构建前
|
||||
|
||||
- [ ] ROS 发行版、PCL、Eigen 和编译器版本符合目标模块。
|
||||
- [ ] 设备网卡、IP、LiDAR 序列号和端口已核对。
|
||||
- [ ] `MID360_config.json` 等 JSON 通过解析检查,没有 `...` 占位符。
|
||||
- [ ] FAST-LIO 的 `lid_topic`、`imu_topic` 和外参已确认。
|
||||
- [ ] Unitree 配置中的绝对路径已替换为本机或机器人实际路径。
|
||||
|
||||
### 运行时
|
||||
|
||||
- [ ] `ros2 topic list` 能看到 Livox 和 Unitree 话题。
|
||||
- [ ] `/livox/lidar` 与 `/livox/imu` 频率稳定,时间戳递增。
|
||||
- [ ] FAST-LIO 的 `/Odometry` 连续更新,点云无明显扭曲。
|
||||
- [ ] `/map_save` 成功生成 PCD,且文件可用 `pcl_viewer` 打开。
|
||||
- [ ] 控制机器人前已确认站立模式、急停和通信链路。
|
||||
|
||||
### 软件检查
|
||||
|
||||
```bash
|
||||
# Shell 语法
|
||||
bash -n ws_livox/src/livox_ros_driver2/build.sh
|
||||
bash -n unitree_ui/unitree_ui-main/start.sh
|
||||
|
||||
# UI TypeScript/Vite 构建
|
||||
cd unitree_ui/unitree_ui-main
|
||||
npm run build
|
||||
|
||||
# ROS2 包索引(已 source 对应环境)
|
||||
cd ../../fast_lio_ws
|
||||
colcon list
|
||||
```
|
||||
|
||||
当前仓库没有统一的根目录测试命令;C++/ROS 包主要通过构建、话题、服务和真实设备链路验证。`go2-environment-setup-handoff.md` 中提到的 `robot/`、`dependencies/`、Cargo workspace 和导航测试属于另一套 `/home/limerly/go2_autonomous_inspection` 仓库,不能在本仓库直接执行。
|
||||
|
||||
## 故障排查
|
||||
|
||||
| 现象 | 优先检查 |
|
||||
| --- | --- |
|
||||
| `liblivox_lidar_sdk_shared.so` 找不到 | SDK2 是否安装到 `/usr/local/lib`;运行 `sudo ldconfig` 或设置 `LD_LIBRARY_PATH` |
|
||||
| Driver 能启动但没有点云 | LiDAR/主机 IP、UDP 端口、防火墙、`host_net_info` 和网卡是否一致 |
|
||||
| FAST-LIO 报 `Failed to find match for field 'time'` | 驱动是否发布 `CustomMsg`;rosbag 是否保留每点时间字段 |
|
||||
| FAST-LIO 发散或点云扭曲 | IMU/LiDAR 时间同步、外参方向、`time_sync_en` 和 `time_offset_lidar_to_imu` |
|
||||
| `/map_save` 返回 `Map save disabled` | YAML 中 `pcd_save.pcd_save_en` 是否为 `true`,`map_file_path` 是否可写 |
|
||||
| Unitree ROS2 看不到话题 | 网卡名、`RMW_IMPLEMENTATION=rmw_cyclonedds_cpp`、DDS 配置和机器人网段 |
|
||||
| `setup.sh` 找不到环境 | 脚本中的 `/opt/ros/foxy` 或 `$HOME/unitree_ros2` 是否与实际安装一致 |
|
||||
| SDK2 CMake 找不到库 | `unitree_sdk2/lib/<架构>/` 是否有当前 CPU 的静态库,或 SDK 是否已安装 |
|
||||
| `keyDemo` 无法连接 | 运行参数必须是连接机器人且位于 123 网段的网卡,例如 `eth0` |
|
||||
| UI BLE 服务启动失败 | `pip3 install -r server/requirements.txt`,确认 websockets >= 11、蓝牙适配器和权限 |
|
||||
| UI 能开但无法连接机器人 | Chrome、机器人 WebRTC 网络模式、STA-L/AP/Remote 配置和固件兼容性 |
|
||||
| 地图重定位失败 | PCD/YAML/PGM 是否成套,初始位姿坐标系、地图版本和 DDS 话题是否一致 |
|
||||
|
||||
## 文档索引
|
||||
|
||||
### 仓库级
|
||||
|
||||
- [环境交接记录](go2-environment-setup-handoff.md)
|
||||
|
||||
### Livox 与 FAST-LIO
|
||||
|
||||
- [Livox SDK2](Livox-SDK2/README.md)
|
||||
- [Livox ROS Driver 2](ws_livox/src/livox_ros_driver2/README.md)
|
||||
- [Livox ROS1 Mapping](livox_mapping/README.md)
|
||||
- [Livox 外参自动标定(英文)](Livox_automatic_calibration-master/README.md)
|
||||
- [Livox 外参自动标定(中文)](Livox_automatic_calibration-master/doc/readme-CN.md)
|
||||
- [FAST-LIO ROS2](fast_lio_ws/src/FAST_LIO_ROS2/README.md)
|
||||
- [FAST-LIO 日志分析指南](fast_lio_ws/src/FAST_LIO_ROS2/Log/guide.md)
|
||||
|
||||
### Unitree
|
||||
|
||||
- [Unitree ROS2(英文)](unitree_ros2/README.md)
|
||||
- [Unitree ROS2(中文)](unitree_ros2/README%20_zh.md)
|
||||
- [Unitree SDK2](unitree_sdk2/README.md)
|
||||
- [Unitree SLAM 示例](unitree_slam/example/README.md)
|
||||
|
||||
### WebRTC UI
|
||||
|
||||
- [UI 总览](unitree_ui/unitree_ui-main/README.md)
|
||||
- [连接](unitree_ui/unitree_ui-main/docs/connection.md)
|
||||
- [控制](unitree_ui/unitree_ui-main/docs/control.md)
|
||||
- [状态](unitree_ui/unitree_ui-main/docs/status.md)
|
||||
- [错误处理](unitree_ui/unitree_ui-main/docs/error-handling.md)
|
||||
- [服务管理](unitree_ui/unitree_ui-main/docs/services.md)
|
||||
- [账号](unitree_ui/unitree_ui-main/docs/account.md)
|
||||
- [蓝牙总览](unitree_ui/unitree_ui-main/docs/bluetooth.md)
|
||||
- [蓝牙 V1/V2 协议](unitree_ui/unitree_ui-main/docs/bluetooth-v1-v2.md)
|
||||
- [蓝牙 V3 协议](unitree_ui/unitree_ui-main/docs/bluetooth-v3.md)
|
||||
- [BLE 遥控器](unitree_ui/unitree_ui-main/docs/remote-control.md)
|
||||
- [Go2 SLAM](unitree_ui/unitree_ui-main/docs/slam.md)
|
||||
- [Go2 LiDAR/体素地图](unitree_ui/unitree_ui-main/docs/lidar.md)
|
||||
- [R1 动作列表](unitree_ui/unitree_ui-main/docs/r1_action_list.md)
|
||||
|
||||
## 许可证
|
||||
|
||||
各子目录保留各自上游许可证,不能用一个根目录许可证替代:
|
||||
|
||||
- Livox SDK2:`Livox-SDK2/LICENSE.txt`
|
||||
- Livox ROS Driver 2:`ws_livox/src/livox_ros_driver2/LICENSE.txt`
|
||||
- Livox Mapping:`livox_mapping/LICENSE`
|
||||
- Livox 自动标定:`Livox_automatic_calibration-master/LICENSE`
|
||||
- FAST-LIO ROS2:`fast_lio_ws/src/FAST_LIO_ROS2/LICENSE`(GPLv2)
|
||||
- Unitree ROS2:`unitree_ros2/LICENSE`(BSD 3-Clause)
|
||||
- Unitree SDK2:`unitree_sdk2/LICENSE`(BSD 3-Clause)
|
||||
- Unitree UI:`unitree_ui/unitree_ui-main/LICENSE`(MIT)
|
||||
|
||||
发布二进制、固件、地图或修改后的第三方源码时,请同时保留对应版权和许可证文本。
|
||||
|
||||
Reference in New Issue
Block a user