从来没有接触过slam的我第一次学习建图,对于想象力欠缺的新手来说真的很难受了,但是自己试着做一次就豁然开朗了,仅供刚入门的新手参考和自己将来快速回忆上手实验。
一、建图:
1、激光雷达:
ls -l /dev/ttyUSB0
sudo chmod 777 /dev/ttyUSB0
roslaunch ls01b_v2 ls01b_v2.launch --screen
2、机器人底盘控制:
roslaunch savvy base_controller.launch
rosrun savvy_teleop teleop_node
3、gmapping:
roslaunch savvy gmapping.launch
4、保存地图:
rosrun map_server map_saver -f [map`s name] (括号不用输入)
用键盘控制小车慢慢移动,尽量扫到空间中的每一个角落,当地图逐渐完整的时候就可以保存地图了。
二、amcl定位:
1、激光雷达:
同上
2、机器人底盘控制:
同上
3、amcl:
roslaunch savvy savvy_amcl.launch map:=[map`s name].yaml
4、信息订阅:
rostopic echo /amcl_pose (amcl发布的以/map为基坐标的机器人的当前pose,包括positioin与orientatiion,等价与/map–>/base_link)
rosrun tf tf_echo /map /odom (tf变换:/map–>/odom)
rosrun tf tf_echo /odom /base_link (tf变换:/odom–>/base_link) (2D下/link_footprint=/base_link)
rostopic echo /tf (监听所有的变换)
刚开始激光数据与地图的误差很大,可以用 ‘2D Pose Estimate’ 来调整地图上小车的pose,然后再用键盘控制小车慢慢上下左右旋转移动,直到粒子收敛。仿佛粒子收敛后的大小和我设置的footprinf差不多形状大小,不知道是巧合还是需要继续调整amcl中的参数,以后再慢慢研究了。当环境中加入了新障碍物也是可以定位成功的,但是时间需要更久一点,当然如果环境没有变化定位更准确。
注意:
(1)、若打开amcl后无激光数据,则需要重新启动激光程序再次打开。默认每次重新开始每个程序都要重新启动。
(2)、机器人的里程计的信息=当前地图中的机器人的位置-地图中机器人的起始位置:/base_link–>/odom = /map–>/base_link - /map–>/odom
(3)、amcl只发布变换:/map–>/odom,与机器人pose:/amcl_pose