ROS 点云配准与姿态估计
这边博客介绍了我们的一个开源仓库,该仓库实现了在 ROS Noetic 环境下使用点云配准并进行姿态估计的功能,并以服务的形式进行调用。博客的剩下部分直接搬运 Github 仓库中的 README 中文片段。如果你对这个功能感兴趣,建议关注该仓库,因为所有 Bug 修复与功能更新都以 Github 仓库优先,CSDN 博客更新可能存在滞后。
- Github 链接:https://github.com/GaohaoZhou-ops/pointcloud_registration
PointCloud Registration
这个功能包是基于 open3d 实现了 ROS 点云配准服务节点。该仓库的功能在以下配准中通过了测试:
Device | Plantform | OS | ROS |
---|---|---|---|
Nvidia Jetson Orin | Arm64 | Ubuntu 20.04 | Noetic |
Contributors
该工程由 中国科学院自动化研究所
提供硬件与测试场地,同时以下人员在该项目的开发中做出了巨大贡献,在此感谢他们的付出:
WenJiang Xu 徐文江,PengFei Yi 易鹏飞,JingKai Xu 徐靖凯,XingYu Wang 王行宇,YaNan Hao 郝亚楠,YuWei Wang 王雨薇
How to Use
Step1. Clone this repo
进入到你的工作空间中拉取该仓库,假设你的工作空间为 reg_ws
:
$ cd reg_ws/src
$ git clone xxx
Step2. Create conda env
新建一个 conda 环境并安装以下依赖:
$ conda create -n o3d python=3.10
$ pip install open3d pyyaml rospkg numpy==1.24.3
Step3. Build Workspace
返回到工作空间目录下编译该空间,编译成功后激活 conda 环境:
(base) $ cd reg_ws
(base) $ conda deactivate
(base) $ catkin_make(base) $ conda activate o3d
Step4. [optional] Run Test
在使用之前可以先运行测试脚本以确保 open3d 配准功能正常。如果你不想要打开 GUI 界面,修改脚本中的 DISPLAY
变量为 False
:
(o3d) $ python src/pointcloud_registration/scripts/test_without_ros.py demo
Before Reg | After Reg |
---|---|
![]() | ![]() |
如果你在运行后遇到了 Segmentation Fault
问题,有可能是由于 numpy
版本导致的,将其降级为 1.xx
版本:
(o3d) $ pip install -U numpy==1.24.3
Step5. [optional] Create Target File
我们建议使另外一个开源的 RGBD 重建仓库创建 target 点云,或者如果你有带有 Lidar 的 iPhone 设备可以下载 App Store 中的 3D Scanner
软件扫描你感兴趣的物体用于重建。
如果上述条件你都不具备,那么运行下面的节点来采集当前帧点云:
(o3d) $ roslaunch pointcloud_registration allocate_pcd.launch
调用服务并传入参数,如果你不修改 min max
参数则会使用 bounding box 范围为 x=[-1.0,1.0], y=[-1.0,1.0], z=[-1.0,1.0]
:
(o3d) $ rosservice call /pointcloud_accumulator_node/save_cloud "{filename: 'demo', min_x: 0.0, max_x: 0.
0, min_y: 0.0, max_y: 0.0, min_z: 0.0, max_z: 0.0}" success: True
message: "Successfully saved point cloud with 6705 points to /home/orin/Desktop/point_reg/src/pointcloud_registration/pcd_files/demo.pcd"
Step6. Use Point Cloud Register
在执行脚本之前需要确保 pcd_files
文件夹中有你的 target 点云文件,如果你需要保存当前正在使用的 target 和 source 点云用于 debug,可以修改 launch 文件中的 write_file
参数。
(o3d) $ roslaunch pointcloud_registration registration.launch
调用服务并将 target 点云文件名作为参数 target_cloud_name
传入:
(o3d) $ rosservice call /pointcloud_registration_node/register "{target_cloud_name: 'demo', voxel_size: 0.0, max_correspondence_distance: 0.0, crop_min_x: 0.0,crop_max_x: 0.0, crop_min_y: 0.0, crop_max_y: 0.0, crop_min_z: 0.0, crop_max_z: 0.0}" success: True
message: "Registration successful with fitness score: 0.9940"
transformation: translation: x: -0.060025553054253854y: 0.03020713014616973z: -0.00028744602569820155rotation: x: 0.019895079499856496y: -0.06213543298323554z: -0.0037846292055216057w: 0.9978622401721878