Amcl Cartographer 双定位

1、使用记录

1)执行双定位,执行过程中未报错。注意各个launch文件执行顺序。
2)AMCL运行过程中,SCAN与地图匹配没carto好,感觉慢半拍,不
影响使用。
3)Amcl 定位精度稍差,但无首次定位漂移的问题,carto有这问题。
4)carto 在imu加laser , 定位还行,进行搬移后,还是能准确定位。
5)carto启动首次定位容易飘,无法到达指定位置。
6)cpu占用率在增加了amcl后变化不大,最主要还是carto负荷大。
7)amcl维持常规配置 map - odom - baselink-laser。
8)主要修改carto 的配置,反过来还未调试成功。
9)增加超声后,移动过程中没纯激光流畅,但影响在空旷位置不明显。
在狭窄位置有卡顿,还是能走出来。后期考虑设置为可开启关闭。
10)在carto 使用odom进行搬移后,靠自身重定位困难,除非回到原点,
很容易重定位成功。

2、修改文件

一、firstdev.launch
1)增加了carto 使用的静态TF,imu 不需要,将IMU的frame_id 改为与baselink
相同即可。
 
其他未改变。

二、backpack_2d.lua
1)更地图帧名。
2)更改了tracking与published 帧名,其实跟踪帧跟踪的是激光与IMU,需要
topic与帧名,IMU可以直接用baselink名,无需TF,如果一定要(增加IMU的TF有可能会造成ROS时间报警,需要IMU及时发布话题。
但scan需要增加TF,不然carto 无法找到原帧(父帧)跟踪,因为激光与baselink不一定重合。
3)published帧也需要,carto需要输出MAP到baselink的TF变换。
4)odom不需要,odom帧名应该不关键。

三、sdwa.sh
1)主要启动顺序,不然会报警。

四、carto_localization.launch
1)修改了carto的激光话题,如果用baselink下的激光话题,容易冲突。
2)修改了cartographer_occupancy_grid_node 的输出地图话题。不然与
map_server 话题冲突,虽然帧名不一样。
3)其他未改动。

五、socket_node
1)增加了py_scan话题,原因如4.1。
2)监听scan话题,修改帧名后发出。以后需改到c++文件中,增加
执行速度。

六、修改了hi216_imu_node.
将imu话题的帧名改为py_base_link,原因如2.2。

文件:
carto_localization.launch

<launch>
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename backpack_2d_localization.lua
          -load_state_filename /home/zjz/maps/mymap.pbstream"
      output="screen">
      <remap from="/scan" to="/py_scan" />	
  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" >
	<remap from = "/map" to = "/carto_map" />
  </node>

  <arg name="map_file" default="/home/zjz/maps/mymap.yaml"/>
  <node pkg="map_server" name="map_server"  type="map_server" args="$(arg map_file)"> 
  </node>

  <include file="/home/zjz/rsvel/navparas/amcl.launch" />

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/local_costmap_params.yaml" command="load" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/global_costmap_params.yaml" command="load" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/move_base_params.yaml" command="load" />
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/dwa_local_planner_params.yaml" command="load"/>
    <rosparam file="/home/zjz/rsvel/navparas/dwa_paras/global_planner_params.yaml" command="load" />
  </node>
</launch>

文件:backpack_2d.lua

  map_frame = "c_map",
  tracking_frame = "py_base_link",	
  published_frame = "py_base_link",
  odom_frame = "py_odom",
  provide_odom_frame = false,	
  publish_frame_projected_to_2d = false,
  use_odometry = false,

文件:firstdev.launch

<node pkg="tf" type="static_transform_publisher" name="py_base_link_to_laser" args="0.04 0 0.2 0 0 0  py_base_link py_scan 25"/>

 <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.04 0 0.2 0 0 0  base_link laser 25"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_fl" args="0.185 0.09 0.145 0 0 0  base_link ultrasound_fl  50"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_fr" args="0.185 -0.09 0.145 0 0 0  base_link ultrasound_fr  50"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_ml" args="-0.0965 0.21 0.145 1.57 0 0  base_link ultrasound_ml  100"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_mr" args="-0.0965 -0.21 0.145 -1.57 0 0  base_link ultrasound_mr  100"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_bl" args="-0.235 0.078 0.145 3.14 0 0  base_link ultrasound_bl  100"/>
 <node pkg="tf" type="static_transform_publisher" name="base_link_to_range_br" args="-0.235 -0.078 0.145 3.14 0 0  base_link ultrasound_br  100"/>

 <node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf"> 
   <param name="output_frame" value="odom"/> 
   <param name="base_footprint_frame" value="base_link"/>
   <param name="freq" value="30.0"/>
   <param name="sensor_timeout" value="1.0"/> 
   <param name="odom_used" value="true"/>
   <param name="imu_used" value="true"/> 
   <param name="vo_used" value="false"/> 
   <param name="debug" value="false"/> 
   <param name="self_diagnose" value="false"/> 
   <remap from="odom" to="vel_odom" />
 </node>
 <node pkg="socket_node" type="socket_node_class.py" name="socket_node" output="screen"/>

</launch>

文件:sdwa.sh

#!/bin/bash

cd rsvel
cd launch
roslaunch my_serial_node.launch &
echo "*********** sleep 5 second ***********"
sleep 5
roslaunch firstdev.launch &
echo "*********** sleep 5 second ***********"
sleep 4
roslaunch slamware.launch &
echo "*********** sleep 4 second ***********"
sleep 4
roslaunch carto_localization.launch 
exit 0
<think>好的,我现在需要回答用户关于Cartographer在ROS 2中如何进行重定位的问题。首先,我得确认自己对Cartographer和ROS 2的基本了解。Cartographer是一个开源的实时SLAM库,支持2D和3D建图,而ROS 2是其机器人操作系统的新版本。重定位通常指在已有地图中重新定位机器人,尤其是在丢失位置跟踪后。 接下来,用户的问题是如何在ROS 2中实现Cartographer重定位。我需要回忆Cartographer的功能是否原生支持重定位。记得Cartographer主要专注于建图和定位的实时处理,但可能没有直接的重定位接口。可能需要利用其提供的服务或者话题来触发重定位过程。 然后,我应该考虑Cartographer在ROS 2中的具体实现。ROS 2的节点和服务与ROS 1有所不同,所以需要确认Cartographer的ROS 2包是否支持相关服务。例如,是否有用于加载现有地图、设置初始姿态的服务。同时,重定位可能需要调整某些参数,比如关闭增量式建图,启用纯定位模式。 接着,步骤可能包括:首先加载已有地图,然后切换到纯定位模式,通过传感器数据匹配当前位姿。用户可能需要调用特定的服务来初始化位姿,比如通过RViz中的手动设置初始姿态,或者使用传感器数据自动匹配。 另外,需要提醒用户可能遇到的问题,比如初始位置估计不准确导致重定位失败,或者需要调整配置参数以提高匹配精度。可能还需要参考Cartographer的官方文档和ROS 2的相关教程,确保步骤正确。 最后,要组织回答的结构,分步骤说明如何在ROS 2中配置Cartographer进行重定位,包括必要的服务调用、参数设置和工具使用,同时指出注意事项和常见问题解决方法。需要确保语言清晰,步骤详细,帮助用户逐步操作。</think>在ROS 2中使用Cartographer进行重定位的实现步骤如下: ### 一、核心原理 Cartographer重定位依赖于预先构建好的子地图(submap)和实时传感器数据匹配。其本质是通过关闭SLAM的建图模式,切换为纯定位模式(`POSE_TRACKING`),利用已有地图进行位姿推算。 ### 二、配置步骤 1. **加载已有地图** ```bash ros2 service call /load_state cartographer_ros_msgs/srv/LoadState "{filename: 'map.pbstream'}" ``` 需提前将构建好的地图保存为`.pbstream`格式 2. **启动纯定位模式** 修改`backpack_2d.lua`配置文件: ```lua POSE_GRAPH.optimize_every_n_nodes = 0 # 关闭持续优化 TRAJECTORY_BUILDER.pure_localization = true # 启用纯定位 TRAJECTORY_BUILDER.trajectory_builder_2d.submaps.num_range_data = 35 # 调整子地图匹配范围 ``` 3. **设置初始位姿** ```bash ros2 topic pub /initialpose geometry_msgs/msg/PoseWithCovarianceStamped " header: frame_id: 'map' pose: pose: position: {x: 1.0, y: 2.0, z: 0.0} orientation: {z: 0.7071, w: 0.7071} " ``` 可通过RViz的`2D Pose Estimate`工具手动设置 ### 三、关键ROS 2接口 | 服务/话题 | 类型 | 功能 | |---------|------|-----| | `/finish_trajectory` | cartographer_ros_msgs/srv/FinishTrajectory | 结束在建轨迹 | | `/write_state` | cartographer_ros_msgs/srv/WriteState | 地图保存 | | `/get_trajectory_states` | cartographer_ros_msgs/srv/GetTrajectoryStates | 查询轨迹状态 | ### 四、调试技巧 1. 可视化验证: ```bash ros2 launch cartographer_ros occupancy_grid_node_launch.py ``` 2. 检查匹配质量: ```bash ros2 topic echo /scan_matched_points2 ``` 3. 调整关键参数: - `TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight` - `POSE_GRAPH.constraint_builder.min_score` ### 五、常见问题处理 1. **定位漂移**: - 检查IMU数据同步性 - 增大`TRAJECTORY_BUILDER_2D.submaps.num_range_data` 2. **初始化失败**: - 确保初始位姿误差小于子地图尺寸的1/2 - 调整`POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher`参数 建议结合Cartographer的离线工具分析定位质量: ```bash cartographer_pbstream -pbstream_filename=map.pbstream ``` 注意:ROS 2 Humble版本对Cartographer的参数接口有更新,需确认使用的版本与配置文件兼容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值