在ROS2中如何实现用cartographer进行纯激光雷达进行定位
-
背景(可选):
在实际调车的过程中,发现使用amcl进行定位的时候效果超级差,所以想采用雷达进行定位。
问题描述:
- cartographer的配置文件和launch文件应该怎么编写?
- 如何移除掉navigation2中的amcl?
具体细节和上下文:
- 我采用了CSDN中一些方法进行修改配置文件和launch文件,在终端也显示了 /tracked_pose, 但是数据并不能成功打印,我怀疑是配置文件编写存在问题。
- 同样在模型运动的过程中,终端能打印出和amcl相关的话题,但是我已经对nav2的配置文件中将amcl那块参数都进行删除。
尝试过的解决方法:
目前阅读过几个CSDN上介绍的方法,但是关于nav2这一块比较少。因此问题没能解决。
-
在ROS 2中使用Cartographer进行纯激光雷达定位是一个常见的需求,特别是在室外或复杂环境中,激光雷达(LIDAR)可以提供高精度和高可靠性的环境感知。以下是如何配置Cartographer、修改launch文件以及从navigation2中移除AMCL的详细步骤:
1. 配置Cartographer
首先,你需要有一个合适的Cartographer的配置文件(通常是YAML格式)。这个文件包含了Cartographer运行所需的所有参数,如传感器配置、地图构建和定位的参数等。一个基本的配置文件可能包括:
map_builder: use_trajectory_builder_2d: true trajectory_builder_2d: submaps: num_range_data: 1 range_data_inserter: scan_matcher_translation_delta_cost_weight: 0.1 scan_matcher_rotation_delta_cost_weight: 1.0 occupied_space_cost_evaluator: exponential_rate: 0.3 linear_offset: 0.5 max_obstacle_height: 2.0 motion_filter: max_distance_meters: 0.05 max_angle_radians: 0.05 min_relative_translation: 0.01 min_relative_rotation: 0.01 ... pose_graph: optimization_problem: huber_scale: 1e2 global_sampling_ratio: 0.03 constraint_builder: min_score: 0.65 loop_closure_translation_weight: 1.0 loop_closure_rotation_weight: 1.0 ... map_frame: "map" tracking_frame: "base_link" published_frame: "base_link" odom_frame: "odom" provide_odom_frame: true use_odometry: false use_nav_sat: false use_landmarks: false num_laser_scans: 1 num_multi_echo_laser_scans: 0 num_subdivisions_per_laser_scan: 1 lookup_transform_timeout_sec: 0.2 submap_publish_period_sec: 5.0 pose_publish_period_sec: 5e-3 trajectory_publish_period_sec: 30e-3 rangefinder_sampling_ratio: 1. odometry_sampling_ratio: 1.
2. 修改Launch文件
你需要创建一个ROS 2的launch文件来启动Cartographer的节点,并配置相关的参数。这个文件将包含对Cartographer节点和任何相关转换(TF)的启动。
<launch> <arg name="config_file" default="$(find your_cartographer_config_package)/config/cartographer.lua"/> <arg name="map_file" default="$(find your_map_package)/maps/my_map.pbstream"/> <node name="cartographer_node" pkg="cartographer_ros" exec="cartographer_node" output="screen" args=" -configuration_directory $(dirname $(find your_cartographer_config_package)) -configuration_basename $(arg config_file) -map_filename $(arg map_file) -load_state_filename $(arg map_file) "> <remap from="scan" to="/your_lidar_topic"/> </node> <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" exec="cartographer_occupancy_grid_node" output="screen" args="-resolution 0.05"> <remap from="map" to="occupancy_grid"/> </node> ... </launch>
3. 移除Navigation2中的AMCL
在Navigation2中,你可以通过修改
navigation2_params.yaml
文件或直接在launch文件中禁用AMCL。如果你使用的是navigation2_launch.xml
,你可以移除或注释掉启动AMCL的节点。例如,在
navigation2_launch.xml
中:<!-- 注释掉或删除AMCL的启动 --> <!-- <node name="amcl" pkg="nav2_amcl" exec="amcl" output="screen"> ... </node> -->
4.
以上为生成回答,仅供参考~