Files
RC_WheelLeg/catkin_ws/odin1的使用手册.md
2026-08-13 12:52:06 +08:00

610 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Odin1 的使用手册
## 1. 文档来源与适用范围
本文根据 Odin1 官方仓库内容整理,官方仓库克隆位置为:
- `/home/lcf/catkin_ws/ziliao/odin_ros_driver`
本手册重点面向你当前这台机器上的 **ROS2 使用方式**,并结合你当前工作空间实际路径整理为可直接操作的版本:
- 工作空间根目录:`/home/lcf/catkin_ws`
- 实际运行包目录:`/home/lcf/catkin_ws/src/odin_ros_driver`
- 官方参考仓库目录:`/home/lcf/catkin_ws/ziliao/odin_ros_driver`
## 2. Odin1 是什么
Odin1 官方 ROS 驱动 `odin_ros_driver` 是一个同时支持 ROS1 和 ROS2 的驱动包,核心用途包括:
- 连接 Odin1 设备并发布点云、IMU、RGB、里程计、TF 等数据
- 提供里程计模式、SLAM 建图模式、重定位模式
- 支持 RViz 可视化
- 支持在线调节 AE/AWB
- 支持地图保存与重定位
官方说明里明确推荐:
- ROS2 推荐使用 `Humble`
- Ubuntu 推荐使用 `22.04`
- 设备固件版本要求 `v0.11.11`
## 3. 官方仓库里与 ROS2 最相关的文件
- `README.md`
- 官方主说明,包含安装、运行、建图、常见问题
- `RELOCALIZATION_GUIDE.md`
- 重定位专门说明
- `config/control_command.yaml`
- 运行参数总配置,建图和重定位主要看这个文件
- `launch_ROS2/odin1_ros2.launch.py`
- ROS2 启动入口
- `script/build_ros2.sh`
- 官方 ROS2 构建脚本
- `set_param.sh`
- 用于在运行时发送参数命令,保存地图时会用到
## 4. ROS2 启动流程总结
官方 README 的 ROS2 逻辑本质上是两步:
```bash
source /home/lcf/catkin_ws/install/setup.bash
ros2 launch odin_ros_driver odin1_ros2.launch.py
```
你当前环境里已经额外有一个一键脚本:
```bash
/home/lcf/catkin_ws/runros.sh
```
这条命令现在默认就等价于上面两条命令,所以日常使用时建议优先用它。
## 5. ROS2 启动时实际会拉起什么
根据官方 `launch_ROS2/odin1_ros2.launch.py`,启动时会拉起以下节点:
- `host_sdk_sample`
- 主驱动节点,负责设备连接、数据流和核心逻辑
- `pcd2depth_ros2_node`
- 深度图相关节点
- `cloud_reprojection_ros2_node`
- 点云投影相关节点
- `image_overlay_node`
- 图像叠加相关节点
- `rviz2`
- 默认会同时启动 RViz2,并加载 `config/odin_ros2.rviz`
所以官方 ROS2 launch 不是只起一个驱动进程,而是“驱动 + 辅助处理节点 + RViz2”的完整演示链路。
## 6. 先决条件
### 6.1 系统与依赖
官方建议:
- Ubuntu 22.04
- ROS2 Humble
- OpenCV 只保留一个版本
- 已安装 `yaml-cpp``libusb``Eigen3`、OpenSSL 等依赖
### 6.2 Udev 规则
官方要求添加 udev 规则,否则可能遇到 USB 访问权限问题:
```bash
sudo vim /etc/udev/rules.d/99-odin-usb.rules
```
写入:
```bash
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", ATTR{idProduct}=="0019", MODE="0666", GROUP="plugdev"
```
然后执行:
```bash
sudo udevadm control --reload
sudo udevadm trigger
```
### 6.3 可能遇到的 USB 权限问题
如果启动时报:
- `LIBUSB_ERROR_ACCESS`
- `LIBUSB_ERROR_BUSY`
优先检查:
1. 是否已经添加 udev 规则
2. 当前用户是否在 `plugdev`
3. 是否有旧的 `host_sdk_sample` 进程还在占用设备
可用命令:
```bash
ps aux | grep host_sdk_sample
killall host_sdk_sample
```
## 7. 你当前环境下的推荐使用方式
### 7.1 一键启动
```bash
/home/lcf/catkin_ws/runros.sh
```
该命令会自动:
1. 加载 `/opt/ros/humble/setup.bash`
2. 加载 `/home/lcf/catkin_ws/install/setup.bash`
3. 执行:
```bash
ros2 launch odin_ros_driver odin1_ros2.launch.py
```
### 7.2 只加载环境
```bash
source /home/lcf/catkin_ws/runros.sh
```
### 7.3 只开一个干净 shell
```bash
/home/lcf/catkin_ws/runros.sh --shell
```
## 8. Odin1 的三种工作模式
官方通过 `config/control_command.yaml` 中的 `custom_map_mode` 控制工作模式:
- `0`:里程计模式
- `1`SLAM 建图模式
- `2`:重定位模式
### 8.1 里程计模式
```yaml
custom_map_mode: 0
```
特点:
- `map``odom` 视为同一位姿
- 不进行回环建图
- 适合只看实时位姿和点云
如果里程计漂移,官方建议在运行过程中执行:
```bash
cd /home/lcf/catkin_ws/src/odin_ros_driver
./set_param.sh algo_reset 1
```
### 8.2 SLAM 建图模式
```yaml
custom_map_mode: 1
```
特点:
- 在里程计模式基础上增加回环检测和地图保存能力
- 启动后自动开始建图并缓存地图数据
- 地图不会自动保存,必须手动触发保存
### 8.3 重定位模式
```yaml
custom_map_mode: 2
```
特点:
- 基于已有地图重新定位
- 必须指定地图文件路径
- 成功后会发布 `map -> odom` 的 TF
## 9. ROS2 下怎么建图
这是你最关心的部分,按下面流程做。
### 9.1 第一步:修改配置为建图模式
编辑实际运行中的配置文件:
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
至少确认这些字段:
```yaml
register_keys:
custom_map_mode: 1
relocalization_map_abs_path: ""
```
建议同时关注:
- `strict_usb3.0_check`
- 默认 `0`,允许非严格 USB3.0;但官方强调建图最好使用 USB3.0
- `senddtof`
- 点云开关
- `sendodom`
- 里程计开关
- `sendcloudslam`
- SLAM 点云开关
- `sendcloudrender`
- 渲染点云开关
- `showpath`
- 是否显示路径
如果你想更明显地看路径,可考虑:
```yaml
showpath: 1
```
### 9.2 第二步:启动驱动
推荐直接执行:
```bash
/home/lcf/catkin_ws/runros.sh
```
或者手动执行:
```bash
source /home/lcf/catkin_ws/install/setup.bash
ros2 launch odin_ros_driver odin1_ros2.launch.py
```
### 9.3 第三步:移动设备开始建图
驱动启动后,Odin1 会自动开始建图并缓存地图数据。
建议操作方式:
- 使用 USB3.0 连接
- 启动后缓慢移动设备
- 尽量覆盖你希望建图的区域
- 尽量回到已走过区域,帮助回环闭合
- 场景中应有足够几何/纹理特征
### 9.4 第四步:保存地图
建图完成后,进入包目录:
```bash
cd /home/lcf/catkin_ws/src/odin_ros_driver
```
执行官方命令:
```bash
./set_param.sh save_map 1
```
`set_param.sh` 的本质是向 `/tmp/odin_command.txt` 写入:
```bash
set save_map 1
```
主驱动会读取这个命令并调用 SDK 保存地图。
### 9.5 第五步:找到保存出来的地图文件
配置文件里写明:
```yaml
mapping_result_dest_dir: ""
mapping_result_file_name: ""
```
如果这两个都为空,则官方默认保存到:
- `{ws}/src/odin_ros_driver/map/{driver_start_time}/`
结合你当前工作空间,默认可按下面路径去找:
- `/home/lcf/catkin_ws/src/odin_ros_driver/map/`
实际生成的地图文件通常是 `.bin` 文件。
### 9.6 第六步:重复保存
官方说明允许重复执行:
```bash
./set_param.sh save_map 1
```
但两次保存之间建议至少间隔 **5 秒**
## 10. 重定位怎么用
官方重定位文档单独给了更详细说明,这里按实用方式整理。
### 10.1 自动重定位
修改配置:
```yaml
register_keys:
custom_map_mode: 2
relocalization_map_abs_path: "/home/lcf/catkin_ws/src/odin_ros_driver/map/你的地图目录/xxx.bin"
custom_init_pos: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
```
推荐条件:
- 起始位置距离原始建图轨迹 1 米以内
- 起始朝向与建图时偏差不超过 ±10°
- 场景特征明显
启动后行为:
1. 尝试将当前观测和已有地图匹配
2. 成功后发布 `map -> odom` TF
3. 失败时进入后备模式并继续尝试
### 10.2 指定初始位姿重定位
如果你知道大概起点位置,可设置:
```yaml
register_keys:
custom_map_mode: 2
relocalization_map_abs_path: "/绝对路径/xxx.bin"
custom_init_pos: [x, y, z, qx, qy, qz, qw]
```
含义是:
- `x y z`:地图坐标系中的位置
- `qx qy qz qw`:四元数姿态
例如绕 Z 轴 90°:
```yaml
custom_init_pos: [5.2, -3.1, 0.0, 0.0, 0.0, 0.707, 0.707]
```
### 10.3 与官方文档的一个小冲突
官方主 README 的参数表里写过:
- `custom_init_pos`currently unused
但官方单独的 `RELOCALIZATION_GUIDE.md` 已经把它作为重定位功能来详细说明,并给了示例,因此更应以重定位指南为准。
如果你实际测试发现 `custom_init_pos` 不生效,优先检查:
1. `custom_map_mode` 是否为 `2`
2. `custom_init_pos` 是否正好 7 个值
3. 四元数是否归一化
4. 地图文件路径是否为绝对路径
## 11. 建图与重定位的推荐操作套路
### 11.1 首次建图
1.`custom_map_mode` 设为 `1`
2. 启动:
```bash
/home/lcf/catkin_ws/runros.sh
```
3. 缓慢移动 Odin1,采完整个区域
4. 返回包目录保存地图:
```bash
cd /home/lcf/catkin_ws/src/odin_ros_driver
./set_param.sh save_map 1
```
5.`map/` 目录下找到 `.bin` 地图文件
### 11.2 下次基于已有地图定位
1.`custom_map_mode` 改为 `2`
2.`relocalization_map_abs_path` 指到上一步生成的 `.bin`
3. 若知道起点,补 `custom_init_pos`
4. 再执行:
```bash
/home/lcf/catkin_ws/runros.sh
```
## 12. 常用参数解释
以下参数来自官方 `control_command.yaml`,是 ROS2 下最常用的一批。
### 12.1 时间与同步
- `use_host_ros_time`
- `0`:使用设备时间,官方推荐
- `1`:收到数据时用主机 ROS 时间
- `2`:对齐到主机时间轴
建议:
- 一般先保持 `0`
### 12.2 传感器输出
- `sendimu`
- 是否发布 IMU
- `sendodom`
- 是否发布里程计
- `senddtof`
- 是否发布原始点云
- `sendcloudslam`
- 是否发布 SLAM 点云
- `sendcloudrender`
- 是否发布渲染后的点云
- `sendrgb`
- 是否发布 RGB 图像
- `sendrgbcompressed`
- 是否发布压缩 RGB 图像
### 12.3 点云质量相关
- `cloud_raw_confidence_threshold`
- 原始点云置信度阈值,官方示例是 `35`
- `dtof_fps`
- 官方注释给出 `100``145``290` 等档位
### 12.4 其他
- `recorddata`
- 是否录制官方私有格式数据,空间占用很大
- `devstatuslog`
- 是否记录设备状态日志
- `showpath`
- 是否显示路径
- `showcamerapose`
- 是否显示相机位姿
## 13. ROS2 下常用话题
官方 README 给出的常用话题包括:
- `/odin1/imu`
- `/odin1/image`
- `/odin1/image_undistort`
- `/odin1/image/compressed`
- `/odin1/cloud_raw`
- `/odin1/cloud_render`
- `/odin1/cloud_slam`
- `/odin1/odometry`
- `/odin1/odometry_high`
- `/odin1/path`
- `/tf`
- `/odin1/reprojected_image`
重定位成功后,`/tf` 中会出现 `map -> odom` 关系。
## 14. 在线调参能力
官方驱动提供四个 ROS2 服务,可在驱动运行时调整自动曝光和自动白平衡:
- `/odin1/get_ae`
- `/odin1/get_awb`
- `/odin1/set_ae`
- `/odin1/set_awb`
示例:
```bash
source /home/lcf/catkin_ws/install/setup.bash
ros2 service call /odin1/get_ae odin_ros_driver/srv/GetAe
ros2 service call /odin1/get_awb odin_ros_driver/srv/GetAwb
ros2 service call /odin1/set_ae odin_ros_driver/srv/SetAe "{mode: 0}"
ros2 service call /odin1/set_awb odin_ros_driver/srv/SetAwb "{mode: 0}"
```
## 15. 常见问题总结
### 15.1 启动后设备很快断开
官方认为 ROS2 在复杂网络环境下容易因为广播导致阻塞,从而出现设备断开。
如果不需要跨设备通信,可先尝试:
```bash
export ROS_LOCALHOST_ONLY=1
```
### 15.2 RViz 卡死或长时间无响应
官方建议先给 Odin1 重新上电。
### 15.3 重启设备后 RViz 出现 `TF_OLD_DATA`
官方说明这是时间戳冲突导致的,点击 RViz 底部 reset 按钮可清掉旧状态。
### 15.4 图像相关节点一启动就崩
官方提示这通常与系统里安装了多个 OpenCV 版本有关。
### 15.5 `Missing camera node 'cam_0'`
官方建议重新插拔 USB。
### 15.6 录 bag 时 IMU 或高频里程计丢帧
官方仓库提供了:
- `script/rosbag2_qos.yaml`
录制时建议:
```bash
ros2 bag record -a \
--qos-profile-overrides-path src/odin_ros_driver/script/rosbag2_qos.yaml \
-o my_bag
```
## 16. 你当前环境下的最简建图命令
### 16.1 建图前
编辑:
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
设置:
```yaml
custom_map_mode: 1
```
### 16.2 启动建图
```bash
/home/lcf/catkin_ws/runros.sh
```
### 16.3 保存地图
```bash
cd /home/lcf/catkin_ws/src/odin_ros_driver
./set_param.sh save_map 1
```
### 16.4 做重定位
编辑:
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
设置:
```yaml
custom_map_mode: 2
relocalization_map_abs_path: "/home/lcf/catkin_ws/src/odin_ros_driver/map/你的目录/你的地图.bin"
```
然后再次启动:
```bash
/home/lcf/catkin_ws/runros.sh
```
## 17. 我对官方文档的实用化结论
如果只用一句话总结官方仓库的 ROS2 使用方式:
- **建图**:把 `custom_map_mode` 设为 `1`,启动驱动,移动设备采图,最后执行 `./set_param.sh save_map 1`
- **重定位**:把 `custom_map_mode` 设为 `2`,设置 `relocalization_map_abs_path` 指向 `.bin` 地图,再重新启动驱动
- **启动**:在你当前环境里,最省事的方式就是直接运行 `/home/lcf/catkin_ws/runros.sh`