Initialize odin1 workspace

This commit is contained in:
2026-08-13 12:52:06 +08:00
commit 59b0583444
7 changed files with 1815 additions and 0 deletions
+609
View File
@@ -0,0 +1,609 @@
# 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`