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