diff --git a/README.md b/README.md new file mode 100644 index 0000000..645bc0f --- /dev/null +++ b/README.md @@ -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/ +``` + +日志配置包括 `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 /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//` 查找预编译库: + +```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 +.pcd # 3D 点云地图 +.pgm # 2D 占据栅格图 +.yaml # 分辨率、原点、阈值和 PGM 引用 +.initial-pose # 初始位姿 +.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) + +发布二进制、固件、地图或修改后的第三方源码时,请同时保留对应版权和许可证文本。 +