前言
为了能够真实模拟实验室的Autolabor_pro1小车,我就自己用solidworks2018基本仿画出Autolabor模型,当然我知道官网有urdf文件但是好像官方的只有一个车子的base部分没有其他任何对外的传感器,因此我就索性自己利用solidworks构建自己的机器人然后转换成urdf文件然后自己构建仿真地图环境。然后这里记录了我在试验Cartographer算法时遇到的一些问题(至少对我来说困惑了很久)。
一、配置关于cartographer的launch文件
其实配置launch文件很简单,平平无奇,建议参照古月居老师的博客或者教学视频进行操作,当然这里我也简单给出一些列操作(先说明我用的是RPLidar单线激光雷达)
首先说明cartographer功能包的安装这里不作阐述,我是将cartographer功能包独立放在了自己建立的一个工作空间之下(例如:我的工作空间名为Google_ws)。然后进入如图路径之下的launch文件夹。
在此文件夹之下创建一个全新的launch文件,至于launch文件怎么写就是参考此文件夹下其他的launch文件,然后左右参考参考康康就OK,实在不行就去百度,下面是我的launch文件。
<launch>
<param name="/use_sim_time" value="true" />
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename rplidar.lua"
output="screen">
<remap from="scan" to="scan" />
</node>
<node name="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
</launch>
事实上很简单的一个launch文件,里面主要就做了两件事第一个就是打开Cartographer这个节点即开始调用Cartographer建图算法;第二个就是打开rviz仿真软件,在rviz中实时显示利用激光雷达建图的情况。
二、配置lua文件
其实配置lua文件才是比较关键的地方,最容易出错的也都是lua文件,因为Cartographer的更新频率很高所以就会出现这种情况:你在看别人的ROS教学视频的时候你也要跟着实操但是发现明明一模一样的配置步骤和文件却出错,在这里很大可能就是随着时间的变化官方对文件参数配置内容作出了相应的改变,至于lua文件怎么写那也是参考原文件夹下面的revo_lds.lua文件(lua文件都是放在下图这个路径)
接下来贴出我自己的lua文件
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_link",
published_frame = "odom",
odom_frame = "odom",
provide_odom_frame = false,
publish_frame_projected_to_2d = false,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1,
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1
POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65
return options
这里说个注意的地方就是如果你们看得还是别人比较早的教学视频那么lua文件最下面的PPOSE_GRAPH,以前是叫SPARSE_POSE_GRAPH,现在早就有些变量名都已经改变了。
三、关于以上过程所遇到的问题
1、首先第一个问题是如下图所示的问题。
其实可以从上面的error看到这个错误就是在rviz中显示的时候找不到RobotModel模型文件,我刚开始以为的时候是要在上面那个配置的launch文件下加上我自己构建的模型的功能包,但是经过一系列尝试之后发现还是不行,最后我发现原因所在是因为自己的cartographer工作空间和原来自己urdf文件所在的工作空间不同所导致,只需要包包含模型文件的功能包(比如我的模型文件功能包叫autolabor_description )复制到cartographer工作空间的src目录下就行,然后再重新编译cartographer工作空间即可解决问题。
2、第二个问题是关于建图的时候构建出来的2D地图模型重叠混乱,如下图所示
这种情况其实是lua文件没有配置好的问题(至少对于我来说是这样子的),还记的上面lua文件里的
tracking_frame = "base_link"和published_frame = "odom"吗,我参考网上很多人说这两者配置相同的base_link即可或者参照官方lua文件,但其实这两个差别老大了,一个是你要追踪的坐标系也就是你算法要跟踪的Frame,另外一个是要用来发布POSE信息的Frame,你自己可以试一下如果两个都配置相同的Frame会有什么样的结果(至少对我来说结果很不理想),所以这两个参数根据自己个人情况配置。
四、结语与总结
先推荐一下官方的文档Cartographer ROS Documentation
然后再推一份关于lua文件参数的博客Lua配置文件
其实探索的路上会遇到很多各种的困难和坑,虽然有点痛苦但是不要一直放弃暴躁,今天不能解决那就明天,总有一天可以解决的,遇到不会的先思考后百度最后再去请教他人,一定要学会自我解决问题的能力,不要过度依赖于他人,有时候他人的情况和自己不同不要盲目投医。