我在用jackal simulator做多机器人gmapping建图时出现map frame和base_link frame在rviz中不移动, 而odom frame往小车移动方向的反方向移动,导致建图无法完成。
怀疑:
请问在这种情况下怀疑哪个地方出了问题呢?
```c++
<node pkg="move_base" type="move_base" respawn="false" name="move_base_node" output="screen">
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/costmap_common_params.yaml" command="load" ns="global_costmap"/>
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/local_costmap_params_$(arg ns).yaml" command="load"/>
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/global_costmap_params_$(arg ns).yaml" command="load"/>
<!-- <param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS"/> -->
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/base_local_planner_teb_$(arg ns).yaml" command="load" />
<rosparam file="$(find jackal_navigation_rtab)/params/ns_params/base_global_planner.yaml" command="load" />
<rosparam file="$(find jackal_navigation_rtab)/params/move_base_params.yaml" command="load" />
<remap from="robot_base_frame" to="$(arg ns)/base_link"/>
<remap from="odom" to="/$(arg ns)/odometry/local_filtered" />
<remap from="cmd_vel" to="/$(arg ns)/cmd_vel"/>
<remap from="/map" to="$(arg ns)/map"/>
</node>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="odom_frame" value="$(arg ns)/odom"/>
<param name="base_frame" value="$(arg ns)/base_link"/>
<param name="map_frame" value="$(arg ns)/map"/>
<!-- Process 1 out of every this many scans (set it to a higher number to skip more scans) -->
<param name="throttle_scans" value="1"/>
<param name="map_update_interval" value="5.0"/> <!-- default: 5.0 -->
<!-- The maximum usable range of the laser. A beam is cropped to this value. -->
<param name="maxUrange" value="5.0"/>
<!-- The maximum range of the sensor. If regions with no obstacles within the range of the sensor should appear as free space in the map, set maxUrange < maximum range of the real sensor <= maxRange -->
<param name="maxRange" value="10.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="minimumScore" value="0.0"/>
<!-- Number of beams to skip in each scan. -->
<param name="lskip" value="0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<!-- Process a scan each time the robot translates this far -->
<param name="linearUpdate" value="0.1"/>
<!-- Process a scan each time the robot rotates this far -->
<param name="angularUpdate" value="0.05"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<!-- Number of particles in the filter. default 30 -->
<param name="particles" value="10"/>
<!-- Initial map size -->
<param name="xmin" value="-10.0"/>
<param name="ymin" value="-10.0"/>
<param name="xmax" value="10.0"/>
<param name="ymax" value="10.0"/>
<!-- Processing parameters (resolution of the map) -->
<param name="delta" value="0.02"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="/$(arg ns)/$(arg scan_topic)"/>
</node>
```
没有broadcast base_link到odom的tf
使用
rosrun rqt_tf_tree rqt_tf_tree
动态查询当前的tf tree
你的小车控制代码中缺少类似以下语句:
static tf::TransformBroadcaster odom_broadcaster;//定义tf对象
geometry_msgs::TransformStamped odom_trans;//创建一个tf发布需要使用的TransformStamped类型消息
geometry_msgs::Quaternion odom_quat; //四元数变量
//载入坐标(tf)变换时间戳
odom_trans.header.stamp = ros::Time::now();
//发布坐标变换的父子坐标系
odom_trans.header.frame_id = "odom";
odom_trans.child_frame_id = "base_link";
//tf位置数据:x,y,z,方向
odom_trans.transform.translation.x = position_x;
odom_trans.transform.translation.y = position_y;
odom_trans.transform.translation.z = 0.0;
//里程计的偏航角需要转换成四元数才能发布
odom_quat = tf::createQuaternionMsgFromYaw(oriention);//将偏航角转换成四元数
odom_trans.transform.rotation = odom_quat;
//发布tf坐标变化
odom_broadcaster.sendTransform(odom_trans);