前言
通过之前的文章已经安装好了Cartographer,也运行了官方的Demo,接下来就是连接自己的设备进行使用了,实车和仿真都是一种测试使用方式,我个人认为实车部署要简单一些,最起码不会遇到各种各样的Bug,也会省很多仿真参数设置花掉的时间。
这篇文章就介绍下Gazebo的仿真环境搭建过程,由于我不需要使用仿真环境做一些复杂的实现,只是想利用这个环境做一些模块功能开发测试,所以这一环节不会展开太细,仅仅够用就行,接下来开始环境搭建,遇到的问题随搭建过程介绍并给出解决办法。
移动机器人的准备
该部分参考了文章:Ubuntu20.04下Turtlebot3机器人仿真_turtlebot3功能包-优快云博客
在移动机器人准备这个环节,由于我的工作中心不在这里,所以并不想自己搭建一个机器人,采用了网上的功能包直接实现。
下载的第一个功能包,原谅我忘记了下载的功能包叫什么名字了,这里只介绍遇到的问题吧。
问题一:小车工作正常,控制不正常,小车前进时出现顿挫,且小车出现翘头-落下、翘头-落下的循环。
这个问题应该是小车的urdf参数设置不合理,或者速度不合适导致的,我的解决方法是在小车的urdf文件内将属性变量mass质量值改大(只要我够重就够稳,杜绝力大砖飞),虽然方法很糙但是看起来管用,各位遇到同样的问题也可以试一下减小速度。
但是改mass方法不一定百分百可行,我在下文Turtlebot3调整时使用这个方法,好像是因为太沉了小车基本走不动了...
问题二:小车工作正常,Gazebo显示正常,传感器Gazebo可视化数据正常,但是没有Lasercan、IMU传感器数据的话题发布
这个问题最终没有得到解决,我检查了Launch、urdf等文件,均没有发现错误,进一步检查太浪费时间,果断更换一个机器人功能包,也确实可以解决这个问题.....
接下来就是目前使用功能正常,但是不太好用的机器人功能包:Turtlebot3
部署过程可以参考上述提到的文章,文章中的方法可以让功能包内部结构简洁,防止一些冗余文件干扰视线。
具体小机器人的部署我在这里就不多赘述了(主要是懒得配图了),参考文章写的很清晰,跟随参考文章完成第6步,实现小机器的运动就可以了。
至于Gazebo的World文件,我不希望使用别人的World,我需要自己创建一个供自己测试的World环境,设置自己的实验条件,比如更大的测试空间、特别的结构等等。
搭建世界
接下来简单介绍如何利用gazebo搭建一个简单的地图:
首先在命令行启动gazebo:
gazebo
启动后会自动生成一个空世界,gazebo的操作个人感觉非常不舒服,不如完全Blender的视角转换逻辑,他的操作逻辑是以点击的位置为操作原点,左键单击按住平移,滚轮缩放,右键按住也是缩放,中键按住转换视角。
因为我们只需要简单的地图,所以点击菜单栏Edit->Build Editor打开建筑建筑模式。
如图,上半部分为俯视图,下半区域为3D视图,点击左侧的元素可以插入,如点击墙体wall,在上面的俯视图给定起点终点就可以生成一个墙体(注意俯视图左下角有比例尺):
当然,如果我们有平面图也可以插入作为参考,点击左侧的Import按钮,在弹出页面选择你的本地照片后点击Next:
接下来是选择图像尺度,比如你希望图像上的一面墙是10m或者100m,在尺度选择界面选择一个起点和终点,并给出你希望这段长度的实际距离值,程序会自动帮你把图像缩放到制定大小:
点击OK后图像会插入到俯视图中,并且尺寸为规定尺寸,可以根据这个图绘制,绘制完成后点击File->save as。选择合适的位置进行保存,保存后点击File->Exit Builder Editor进入世界编辑模式。
在世界里应该会出现你建立的模型,如果没有也不要紧,在左侧找到Insert按钮,在下面的选项中找到你建立的模型,单击,然后在3D视图中选择合适位置再次单击就置入到世界里面了。如果Insert下面没有你的模型,可以点击Add Path添加你保存模型的路径,就可以了。
接下来点击File->Save World As保存世界文件即可。
注意保存世界文件的时候,软件不会自动添加.world文件后缀,需要自己手动写上。
接下来可以在启动机器人的Launch文件中将加载的世界替换为自己创建的世界。
问题三:在后续建图过程中,会发现world中某个部件在缓慢抖动加移动
这个问题在我新建完模型后,又Insert了一个圆柱到世界中,并利用这个保存的地图文件进行建图测试时发现,建图效果稀烂,圆柱位置根本对不上,结果仔细一看好家伙Gazebo里面圆柱在缓慢移动。
这个问题没有找到具体原因,但是一个治标不治本的方法是不要将多个模型载入world中,直接在建筑模式完成完整模型搭建,然后世界中只有这一个模型保存后就不存在某个部件漂移了。
至于会不会发生整个模型漂走的情况,目前我是没有遇到。
至此,我们获得了一个可以发出传感器话题,可以受我们控制的小机器人,并且位于指定的环境里。
但是不得不说虽然能用但是控制起来挺困难,在80*80场景下,速度太快会不受控制,速度太慢太浪费时间,每次启动和停止的时候小车总是会莫名其妙转动一个角度,确实用这别扭,还好建图只需要一次,要不然也太折磨了。
但是!
事情还没有结束,目前的小机器人虽然看着状态不错,但是接入Cartographer多半会遇到各种各样的Bug,我在这里汇总一下我遇到的问题:
问题四:激光雷达闪烁或者缺角度
在介绍这个问题之前就需要先介绍下硬件参数设置
turtlebot3_waffle_pi.gazebo.xacro文件
<gazebo reference="base_scan">
<material>Gazebo/FlatBlack</material>
<sensor type="ray" name="lds_lfcd_sensor">
<pose>0 0 0 0 0 0</pose>
<visualize>true</visualize> 在Gazebo中是否可视化雷达探测线
<update_rate>50</update_rate> 雷达发布频率
<ray>
<scan>
<horizontal>
<samples>360</samples> 采样点
<resolution>1</resolution> 分辨率
<min_angle>-3.1</min_angle> 最大最小角度
<max_angle>3.1</max_angle>
</horizontal>
</scan>
<range>
<min>0.5</min> 最小探测范围
<max>30</max> 最大探测范围
<resolution>0.015</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.001</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_lds_lfcd_controller" filename="libgazebo_ros_laser.so">
<topicName>scan</topicName>
<frameName>base_scan</frameName> 雷达坐标系名称
</plugin>
</sensor>
</gazebo>
需要首先将 <visualize>true</visualize>标签置为True可视化雷达探测线来暴露问题。
部分小机器人的正后方出现一个缺角,少了一部分扫描范围,遇到这种情况检查<min_angle>-3.1</min_angle> <max_angle>3.1</max_angle>
如果两个参数为3,那么可能有较大缺角,将其值修改即可,数值越趋近π,缺口越小。
如果不是该原因导致的激光角度缺失,检查机器人结构,是否是因为机器人结构造成的结构遮挡。
如果出现部分激光束闪烁,时有时无,修改雷达的最大最小探测范围,增大最小探测范围解决了我的闪烁问题。
如果激光束在小车移动过程中出现大范围变化,检查机器人在运动过程中是否有剧烈变化,如前面提到的翘头等情况。
问题五:TF错误
检查一下整个机器人launch启动后的TF是否正常,odom是否存在,TF不正常的话会影响后面的建图流程。
可以使用以下命令在机器人启动时打印TF树:
rosrun rqt_tf_tree rqt_tf_tree
默认的坐标系结构已经记不清了,但是印象中该功能包采用的基坐标系为base_footprint,而且没有发布base_scan到base_footprint的tf变换,打印的TF应该为odom->base_footprint
在只跑Gazebo时这不会引起报错,但是引入cartographer时,其launch文件加载了一个urdf文件,在某奇妙位置base_link坐标系可能会与Gazebo中的base_footprint产生冲突报错。
所谓为了省事,在Gazebo的launch文件中发布两个静态TF变换强行对接结构,很糙但管用。
launch文件加入的静态变化为:
<node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_base_scan" args="0.0 0.0 0.0 0.0 0.0 0.0 base_link base_scan" />
<node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_base_footprint" args="0.0 0.0 0.0 0.0 0.0 0.0 base_link base_footprint" />
并将上文提到的xacro文件的第68行:<robotBaseFrame>修改为base_link。
这样启动gazebo仿真节点后的TF树就变成了:
接下来就准备将cartographer接入仿真环境进行建图了。