多机器人gmapping建图时base_link在rviz不移动,而odom frame移动

我在用jackal simulator做多机器人gmapping建图时出现map frame和base_link frame在rviz中不移动, 而odom frame往小车移动方向的反方向移动,导致建图无法完成。
怀疑:

  1. move_base中的costmap的map frame child frame没有define清楚(已排除)
  2. gmapping中的frame id有问题(没有找到问题)

请问在这种情况下怀疑哪个地方出了问题呢?


```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);