ROS2安装Localization模块

1. 准备

  • Map: ply, pcd格式都可以
  • 配置好的雷达程序,这里以Mid360为例子,之前已经配好了,有问题看另一篇blog.
  • TF tree:要有/map, /odom, /baselink等的关系,其中/map -> /odom之间的关系可以通过localization的程序获得,但是/odom -> /baselink -> ... 后续这些link最好提前定义好,暂时没有可以调用ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 world map 构建一下TF的关系

2.部署

2.1 安装 ndt_omp_ros2(必须依赖,加速 NDT)

先进入workspace,根据实际情况调整对应路径
cd ~/ros2_ws/src
git clone https://github.com/rsasaki0109/ndt_omp_ros2.git

2.2 安装 lidar_localization_ros2

git clone https://github.com/rsasaki0109/lidar_localization_ros2.git

2.3 安装其他依赖

sudo apt update
sudo apt install ros-humble-pcl-ros ros-humble-pcl-conversions ros-humble-tf2-ros

cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install --packages-up-to ndt_omp_ros2 lidar_localization_ros2
source install/setup.bash

2.4 编译完成后需要修改一些参数

1)找到文件param/localization.yaml

json 复制代码
/**:
    ros__parameters:
      registration_method: "NDT_OMP"
      score_threshold: 2.0
      ndt_resolution: 1.0
      ndt_step_size: 0.1
      ndt_num_threads: 4
      ndt_max_iterations: 35
      transform_epsilon: 0.01
      voxel_leaf_size: 0.2
      scan_max_range: 100.0
      scan_min_range: 1.0
      scan_period: 0.1
      use_pcd_map: true
      map_path: ""
      set_initial_pose: true
      initial_pose_x: 0.0
      initial_pose_y: 0.0
      initial_pose_z: 0.0
      initial_pose_qx: 0.0
      initial_pose_qy: 0.0
      initial_pose_qz: 0.0
      initial_pose_qw: 0.0
      use_odom: false
      use_imu: false
      enable_debug: true
      enable_map_odom_tf: false
      global_frame_id: map
      odom_frame_id: odom
      base_frame_id: base_link
      enable_timer_publishing: false
      pose_publish_frequency: 30.0

修改:
map_path: "":改成当前地图的路径,pcd格式的map
enable_map_odom_tf: false:true,这里会把map -> odom的关系发布出来
enable_timer_publishing:true

以下这三个frame根据实际情况来调整:

复制代码
      global_frame_id: map
      odom_frame_id: odom
      base_frame_id: base_link

2)找到文件/launch/lidar_localization.launch.py

找到以下这段code,看看要不要修改/base_link和/velodyne,根据实际情况来,我用的是mid360,所以velodyne -> livox_frame

python 复制代码
    lidar_tf = launch_ros.actions.Node(
        name='lidar_tf',
        package='tf2_ros',
        executable='static_transform_publisher',
        arguments=['0','0','0','0','0','0','1','base_link','velodyne']
        )

另一处要改的是以下这段code,关于点云的映射关系,/velodyne_points -> /livox/lidar,改成实际雷达的点云输出即可,数据类型为sensor_msgs/PointCloud2

python 复制代码
    lidar_localization = launch_ros.actions.LifecycleNode(
        name='lidar_localization',
        namespace='',
        package='lidar_localization_ros2',
        executable='lidar_localization_node',
        parameters=[localization_param_dir],
        remappings=[('/cloud','/velodyne_points')],
        output='screen')

3.运行

  • 先启动TF tree相关的节点
  • 启动雷达的节点
  • 确保有以下的input
    /cloud (sensor_msgs/PointCloud2)
    /map (sensor_msgs/PointCloud2)
    /initialpose (geometry_msgs/PoseStamed)这个在启动完localization节点后,点一下rviz的2D pose estimate就行了
  • 先cd到localization的ws里,启动rvizrviz2 -d src/lidar_localization_ros2/rviz/localization.rviz,也可以不用它们提供的rviz配置文件,自己启动一个rviz然后添加一下对应topic就行了
  • 运行ros2 launch lidar_localization_ros2 lidar_localization.launch.py
  • 这时再到rviz里给个初始位置就行了

效果如下:

Localization Test-1

相关推荐
米糕闯编程8 天前
鱼香ros2(二十五)导航
机器人·slam·ros2·launch·navigation2
兜里只有三分钱~11 天前
从 URDF 到 SDK:开发者视角拆解启元 T1/Q1 机器人架构
机器人·sdk·仿真·ros2·urdf
特立独行的猫a15 天前
ROS 2 主流DDS中间件入门:Cyclone DDS 与 Fast DDS 完全指南
中间件·ros2·dds·fast dds·cyclone dds
轻口味18 天前
启元无真机二开实战1:54 个接口能做什么、不能做什么——启元 Q1/T1 SDK 能力全景与版本矩阵
线性代数·矩阵·ros2·具身智能·启元机器人
热金鼠21 天前
2.ROS2 核心机制与命令行实操
ros2
大雨歌1 个月前
笛卡尔坐标 → 自然坐标(Frenet) 逐步推导全解 -2
ros2
米糕闯编程1 个月前
鱼香ros2(十七)C++小海龟巡逻
开发语言·c++·机器人·ros2·服务·小海龟
风合星语1 个月前
2026 机器人工程实例(七):Nav2 到站了,任务却没完成——AMR 载货导航中的托盘滑移与验收闭环
人工智能·机器人·ros2·机器人仿真·nav2·mujoco·amr
米糕闯编程1 个月前
鱼香ros2(十二)C++话题订阅与发布
开发语言·c++·ros2·话题
朝朝辞暮i1 个月前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2