kartoslam找bug之行

我们两清 提交于 2020-01-27 01:15:05


之前如此处进行karto_slam算法包的安装
kartoslam算法的launch文件如下

<launch>

  <!-- Define laser type-->
  <arg name="laser_type" default="rplidar" />

  <!-- laser driver -->
  <include file="$(find turtlebot_navigation)/laser/driver/$(arg laser_type)_laser.launch" />

  <!-- karto.launch-->
  <arg name="custom_karto_launch_file" default="$(find turtlebot_navigation)/launch/includes/karto/$(arg laser_type)_karto.launch.xml"/>
  <include file="$(arg custom_karto_launch_file)"/>

  <!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>


</launch>

在rplidar_karto.launch.xml中内容为

<launch>
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
    <param name="odom_frame" value="odom"/>
    <param name="map_update_interval" value="25"/>
    <param name="resolution" value="0.025"/>
  </node>
</launch>

也就是说custom_karto_launch_file只有一个slam_karto的node
然后说说move_base.launch.xml

<!-- 
    ROS navigation stack with velocity smoother and safety (reactive) controller
-->
<launch>
  <include file="$(find turtlebot_navigation)/launch/includes/velocity_smoother.launch.xml"/>
  <include file="$(find turtlebot_navigation)/launch/includes/safety_controller.launch.xml"/>
  
  <arg name="odom_frame_id"   default="odom"/>
  <arg name="base_frame_id"   default="base_footprint"/>
  <arg name="global_frame_id" default="map"/>
  <arg name="odom_topic" default="odom" />
  <arg name="laser_topic" default="scan" />
  <arg name="custom_param_file" default="$(find turtlebot_navigation)/param/dummy.yaml"/>

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find turtlebot_navigation)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />   
    <rosparam file="$(find turtlebot_navigation)/param/local_costmap_params.yaml" command="load" />   
    <rosparam file="$(find turtlebot_navigation)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/dwa_local_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/move_base_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/global_planner_params.yaml" command="load" />
    <rosparam file="$(find turtlebot_navigation)/param/navfn_global_planner_params.yaml" command="load" />
    <!-- external params file that could be loaded into the move_base namespace -->
    <rosparam file="$(arg custom_param_file)" command="load" />
    
    <!-- reset frame_id parameters using user input data -->
    <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
    <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
    <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

    <remap from="cmd_vel" to="navigation_velocity_smoother/raw_cmd_vel"/>
    <remap from="odom" to="$(arg odom_topic)"/>
    <remap from="scan" to="$(arg laser_topic)"/>
  </node>
</launch>

这里除了两个为了使得运动平滑的launch文件velocity_smoother.launch.xml和safety_controller.launch.xml之外还运行了move_base节点,因为之前测试的时候使用MIT的bag文件我发现只有运行kartoslam的包,但是没有运行movebase的包

那么之前测试不好的解释有以下几点

  1. 激光数据和MIT的不一样,MIT的激光原数据好,我们的差
  2. 代码中的参数调整不是很好(可能性小,因为直接使用kartoslam跑MITbag效果不错)
  3. 周围环境玻璃太多,环境复杂
  4. 我们实际launch文件里面有movebase,也许movebase会对结果有影响。

Karto_slam跑激光雷达MITbag文件
roscore
rosrun slam_karto slam_karto
rosbag play ~/bagfile/script/data.bag
rosrun rviz rviz

实际运行kartoslam在tb2上的代码:
roscore
roslaunch turtlebot_bringup minimal.launch
roslaunch turtlebot_navigation rplidar_karto_demo.launch
roslaunch turtlebot_teleop keyboard_teleop.launch
roslaunch turtlebot_rviz_launchers view_navigation.launch

对了 在运行launch文件的时候最好加一个 --screen 可以把每一个node的输出显示在终端

编写launch

<launch>	
 指roslaunch语句的开始和结束。
 <node> 	
 这是对于节点运行的标签。您可以更改功能包、节点名称和执行名称。
 <machine> 	 可以设置运行该节点的PC的名称、address、ros-root和ros-package-path。
 <include> 	您可以加载属于同一个功能包或不同的功能包的另一个launch,并将其作为一个launch
文件来运行。
 <remap> 	
 可以更改节点名称、话题名称等等,在节点中用到的ROS变量的名称。
 <env> 	
 设置环境变量,如路径和IP(很少使用)。
 <param> 	
 设置参数名称、类型、值等
 <rosparam> 	 可以像rosparam命令一样,查看和修改load、dump和delete等参数信息。
 <group> 	
 用于分组正在运行的节点。
 <test> 用于测试节点。类似于<node>,但是有可以用于测试的选项。
 <arg> 	
 可以在launch文件中定义一个变量,以便在像下面这样运行时更改参数。

MIT数据测试:

rosbag play ~/bagfiles/script/data.bag
roslaunch turtlebot_rviz_launchers view_navigation.launch

自己节点运行:kartoslam.launch

<launch>
  <include file="$(find turtlebot_bringup)/launch/minimal.launch" />
  <include file="$(find turtlebot_navigation)/launch/rplidar_karto_demo.launch"/>
  <include file="$(find turtlebot_teleop)/launch/keyboard_teleop.launch"/>
</launch>

测试bug猜测:

  1. 激光数据和MIT的不一样,MIT的激光原数据好,我们的差
  2. 代码中的参数调整不是很好(可能性小,因为直接使用kartoslam跑MITbag效果不错)
  3. 周围环境玻璃太多,环境复杂
  4. 我们实际launch文件里面有movebase,也许movebase会对结果有影响。

激光数据和MIT的不一样,MIT的激光原数据好,我们的差

  • 打开rviz查看MIT激光和我们的激光数据的差别
    运行MITbag文件的时候只是单纯的运行rosrun slam_karto slam_karto
    RVIZ中会显示这些东西导致看不到模型,localmap(当然也不需要)以及laserscan
    parameter [robot_description]does not exist,and was not found by searchParam()
    local map - costmap :No map received
    LaserScan:For frame[base_laser_link]:No transform to fixed frame [map].TF error:[Lookup would require extrapolation into the past.Requested time 238.889998999 but the earliest data is at time 1578367989.428750344,when looking up transfrom from frame [base_laser_link] to frame [map]
    所以应该是没有发布出baselink到laser的tf
    新建一个launch文件 MIT.launch
<launch>
  <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/>
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
    <param name="odom_frame" value="odom"/>
    <param name="map_update_interval" value="25"/>
    <param name="resolution" value="0.025"/>
  </node>
</launch>

和 kartoslam.launch唯一的区别就是没有运行

<!-- Move base -->
  <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>

这个launch文件


roslaunch kartoslam MIT.launch --screen
rosbag play ~/bagfiles/script/data.bag
rviz 然后把Global Options中的fixed frameg改成baselinke

此次MIT数据运行使用这里gif制作工具
在运行roslaunch kartoslam MIT.launch --screen的时候提示:

Warning: TF_OLD_DATA ignoring data from the past for frame base_link at time 147.46 according to authority unknown_publisher
Possible reasons are listed at http://wiki.ros.org/tf/Errors%20explained
at line 277 in /tmp/binarydeb/ros-kinetic-tf2-0.5.20/src/buffer_core.cpp

下面是MIT的激光数据
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述他运行的时候也并没有在一个地方绕环过久,直接走就可以了


我上一次运行录下的bag文件
在这里插入图片描述可以很明显的看出来,scan数据十分的卡顿,不流畅
至于
2. 代码中的参数调整不是很好(可能性小,因为直接使用kartoslam跑MITbag效果不错)
3. 周围环境玻璃太多,环境复杂
4. 我们实际launch文件里面有movebase,也许movebase会对结果有影响。
实际查看了一下雷达高度并没有很多玻璃存在,从图也可以看出,
在这里插入图片描述
这里是接水的地方 但是其实里面有物体存在,所以大部分并不造成很大影响

所以我认为很大的一个问题就是我们的激光数据实在是太卡顿了,所以我打算单独不跑kartoslam的记录一下数据,顺便不用ssh链接接受bag 直接保存在本地,因为这个也可能是原因

不跑karto只录制信息

规定一下路线,从工位中间开始接受雷达数据,然后走到多媒体那边的空地中间掉头,然后到另一边尽头走廊中间,然后往厕所岔路口掉头回到工位。

结果发现的确是不运行kartoslam以及不用ssh接受bag而是保存在本地,激光数据连贯多了,不过因为地形的原因,在沙发、玻璃等地方很难找到有效的点。

接下来跑一跑这个记录的bag在kartoslam上的效果。
最后bag建图情况
在这里插入图片描述这个图依然是倒过来的 相当于把地图放在玻璃桌子上,然后我们从下面看,不过问题依然很大,首先工位和沙发都是胡在一起,然后莫名其妙有很多小波纹,其次在L形拐角处,我们那边本该检测到的墙壁到了本该没有墙壁的地方
在这里插入图片描述
以及这里的电梯入口被堵住了。
在这里插入图片描述这次没有运行movebase,但是还是很差,感觉所有的结论都要从激光和环境讲起了。要更换一个比较简单的环境比较好,其次,再看看哪些参数可以适应我们这种环境。
仔细分析一下会发现,这些在墙壁上一横一横的东西,

在这里插入图片描述
(电梯)
在这里插入图片描述(卫生间岔路口)
在这里插入图片描述四个工位处
貌似都是墙体或者平面出现的地方,我猜测是因为他没有吧新的scan判定为原来第一次出现的平面,造成了这种会有很多平面,实际上只有一个平面的存在。

在这里插入图片描述然后我又跑了一次,竟然路径变得不一样了,而且上面这个地方是第一次走向厕所就有的,我在想会不会是的确有这个地方,这个墙,但是因为我搞不清楚他地图
运行过程
在这里插入图片描述
在这里插入图片描述所以现在有两个疑点,到底 这个地图是怎么构建的,然后第二点是修改哪些参数能够修改这种奇怪的波纹和地图分布

终于找到问题根源啦!

我发现问题根源所在啦!

在这里插入图片描述


又出问题拉,出大问题。

建图到一半

Could not get robot pose, cancelling reconfiguration Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past.

[ERROR] [1577803544.186413799]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past. Requested time 1577803395.635771648 but the earliest data is at time 1577803534.160161966, when looking up transform from frame [base_footprint] to frame [map]
这个我之前也遇到过 有进行资料查询

有说是主从机因为网络原因导致的时间不同步。
实验1:修改local_costmap_params.yaml和global_costmap_params.yaml两个文件中的transform_tolerance=10(之前是2->5,现在->10)

实验结果:
依然在建图大部分之后

[ INFO] [1578456428.827163199]: Calling doSPA for loop closure
                  [ INFO] [1578456428.837986198]: Finished doSPA for loop closure
   [slam_karto-11] process has died [pid 13146, exit code -11, cmd /home/asber/turtlebot_ws/devel/lib/slam_karto/slam_karto scan:=scan __name:=slam_karto __log:=/home/asber/.ros/log/328a1216-31cb-11ea-8f97-28c2dd4c2a6d/slam_karto-11.log].
    log file: /home/asber/.ros/log/328a1216-31cb-11ea-8f97-28c2dd4c2a6d/slam_karto-11*.log
            [ERROR] [1578456438.366370194]: Kobuki : malformed sub-payload detected. [129][170][81 AA 55 4D 01 0F ]
                                     [ WARN] [1578456438.961491661]: Costmap2DROS transform timeout. Current time: 1578456438.9614, global_pose stamp: 1578456428.9330, tolerance: 10.0000
                              [ WARN] [1578456438.961598209]: Could not get robot pose, cancelling reconfiguration
                                    [ERROR] [1578456439.043270114]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past.  Requested time 1578456428.932966528 but the earliest data is at time 1578456429.071418350, when looking up transform from frame [base_footprint] to frame [map]

那我们在本地建图如何通过遥控键盘控制试试看效果怎么样。
果然在键盘单独本地运行就不会出现问题。
那就是网络延时造成的问题了


[ WARN] [1578669454.733878780]: Could not get robot pose, cancelling reconfiguration

[ERROR] [1578669455.533468334]: Extrapolation Error looking up robot pose: Lookup would require extrapolation into the past. Requested time 1578669101.339670111 but the earliest data is at time 1578669445.509893491, when looking up transform from frame [base_footprint] to frame [map]

有wiki上说是因为电脑的性能不够,然后把一些可视化或者占据内存的程序取消之后就好了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!