文章目录
之前如此处进行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的包
那么之前测试不好的解释有以下几点
- 激光数据和MIT的不一样,MIT的激光原数据好,我们的差
- 代码中的参数调整不是很好(可能性小,因为直接使用kartoslam跑MITbag效果不错)
- 周围环境玻璃太多,环境复杂
- 我们实际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猜测:
- 激光数据和MIT的不一样,MIT的激光原数据好,我们的差
- 代码中的参数调整不是很好(可能性小,因为直接使用kartoslam跑MITbag效果不错)
- 周围环境玻璃太多,环境复杂
- 我们实际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上说是因为电脑的性能不够,然后把一些可视化或者占据内存的程序取消之后就好了
来源:CSDN
作者:专业渡劫修仙
链接:https://blog.csdn.net/kuizhao8951/article/details/103868850