基于点云配准的重定位节点。输入为 odom 坐标系下的 SLAM 累积点云,输出为静态 world -> odom 变换。
zsh -lc "build-rmcs"默认配置文件位于 config/localization.yaml,需要重点确认以下参数:
map_path:待匹配地图的.pcd文件路径frames.world:全局坐标系,默认worldframes.odom:SLAM 点云所在坐标系,默认odomsubscription.pointcloud:输入点云话题,默认/cloud_registered_undistortinitial_world_to_odom.red/initial_world_to_odom.blue:红蓝方的初始world -> odom位姿
当前实现假设输入点云已经在 odom 系下完成累计,不依赖 base_link 的 TF 输入。
ros2 launch rmcs_localization launch.py节点启动后会:
- 加载
map_path指向的 PCD 地图 - 订阅
subscription.pointcloud指定的话题 - 等待重定位服务触发
红方:
echo red > /tmp/rmcs-localization/relocalize/trigger蓝方:
echo blue > /tmp/rmcs-localization/relocalize/trigger重定位结果(成功/失败 + 位姿)会写入 /tmp/rmcs-navigation/relocalize/result,由导航端监听并打印日志。
重定位成功后,节点会发布:
- 静态 TF:
world -> odom - 调试点云:
/rmcs_localization/origin_pointcloud - 调试点云:
/rmcs_localization/mapped_pointcloud
其中:
origin_pointcloud是按初始位姿中心截取出的局部地图mapped_pointcloud是配准完成后映射到world系下的输入点云
收到 /rmcs_localization/relocalize/red 或 /rmcs_localization/relocalize/blue 请求后,节点从配置读取对应的 initial_world_to_odom 作为初始解。
如果已经存在上一轮成功的重定位结果,则优先使用当前保存的 world -> odom 作为下一次配准初值。
节点进入收集状态后,会在固定时间窗口内累积 subscription.pointcloud 的输入点云。当前窗口长度为 2.0s。
这里的输入点云默认是 SLAM 已经累计完成、并且已经处于 odom 坐标系下的点云,因此不再额外查询 odom -> base_link。
节点使用初始解的平移分量作为中心,从全局 PCD 地图中按 registration.initial_map_radius 裁剪局部地图,降低后续配准的搜索范围。
配准模块会:
- 对局部地图和输入点云做预处理
- 使用配置中的迭代次数、体素分辨率、距离阈值等参数进行粗配准和精配准
- 输出最终的刚体变换结果
由于输入点云本身就在 odom 系,配准结果直接解释为 world -> odom。
配准成功后,节点会:
- 保存新的
world -> odom - 发布
world -> odom静态 TF - 发布局部地图与配准后的调试点云
后续再次触发重定位时,这个结果可以继续作为下一次的初始解。