整体参考:自主移动机器人实验课
1 概述
硬件:Turtlebot3底盘 + 思岚rplidar A2
环境:Ubuntu 18.04 + ROS Melodic
流程:gmapping建图 + 蒙特卡洛定位 + A*自主导航
2 准备工作
2.1 解决catkin_make报错的问题
常见错误合集1:https://www.codenong.com/cs106660540
常见错误合集2:https://www.twblogs.net/a/5e80c790bd9eee2116866b77
ecl报错:https://blog.csdn.net/baidu_36645485/article/details/79020029(需要改ROS版本为melodic)
missing spnav.h:https://github.com/ros-drivers/joystick_drivers/issues/79
fatal error: bluetooth/bluetooth.h: No such file or directory:https://blog.csdn.net/p942005405/article/details/86559966
2.2 解决Turtlebot启动报错的问题
运行命令
roslaunch turtlebot_bringup minimal.launch
报错
[ WARN] [1426225321.364907925]: Kobuki : device does not (yet) available, is the usb connected?.
[ WARN] [1426225321.615097034]: Kobuki : no data stream, is kobuki turned on?
运行下面命令,发现/dev/kobuki设备不存在。
ls -n /dev | grep kobuki
解决方法:
sudo apt-get install ros-melodic-kobuki-ftdi
rosrun kobuki_ftdi create_udev_rules
若报有关battery的错误,可运行如下指令解决
sudo apt-get install ros-melodic-laptop-battery-monitor
参考:https://blog.csdn.net/qq_41808841/article/details/113458565
2.3 解决rplidar端口号不固定的问题
由于ubuntu USB设备号为从零开始依次累加,所以多个设备每次开机后设备号不固定,如果launch文件以端口号(如ttyUSB0)索引rplidar,可能出现问题。
解决方法:
列出所有USB设备:
lsusb
ID 10c4:ea60 表示USB设备的ID,这个ID由芯片制造商设置,可以唯一表示该设备。因此,我们只需索引这个固定的ID。
sudo gedit /etc/udev/rules.d/rapliar.rules
在打开的文件中添加以下内容
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"
这样我们就将"rplidar"与ID 10c4:ea60建立了联系,在launch等文件中,我们就不需要以/dev/ttyUSB0
索引rplidar,而是以/dev/rplidar
索引它。
具体地,在turtlebot_ws/src/rplidar_ros/launch/rplidar.launch
,以及turtlebot_ws/src/rplidar_ros/src/node.cpp
中将/dev/ttyUSB0
改为/dev/rplidar
。
这样无论rplidar是USB0还是USB1,程序都可以找到它。
查看端口号命令(理论上无需用到):
ls -l /dev|grep ttyUSB
参考:
https://blog.csdn.net/lj164567487/article/details/120327666?spm=1001.2014.3001.5501
https://www.it610.com/article/1294851321765109760.htm
3 实验过程
3.1 Gmapping建图
环境配置:https://blog.csdn.net/lj164567487/article/details/120331552
开启turtlebot底盘:
roslaunch turtlebot_bringup minimal.launch
启动gmapping并开启rviz:
roslaunch turtlebot_navigation rplidar_gmapping_demo.launch
rviz
在rviz左下角,点击add
,添加map
,在左侧栏中选择不同的Topic可呈现不同样式的地图,如普通地图,代价地图(cost map)等。
启动键盘控制:
roslaunch turtlebot_teleop keyboard_teleop.launch
控制机器人移动,完成建图:
保存建好的地图:
rosrun map_server map_saver -f /home/yicheng/turtlebot_ws/map/map2
注意:建图误差较大,表现在直角弯很可能无法建成直角。原因:(1) 算法性能的局限性,(2) Turtlebot底盘的里程计有一定误差。
要提高建图精度,可以尽量减小机器人移动速度。
3.2 蒙特卡洛定位
环境配置:https://blog.csdn.net/lj164567487/article/details/120543517
注意,蒙特卡洛定位调用的是第三步Gamppinp创建的地图,launch文件指定了这个地图文件的路径,应确保turtlebot_ws/src/turtlebot_apps/turtlebot_navigation/launch/rplidar_amcl_demo.launch
文件中地图的路径与上一步保存的地图的路径一致。
关闭rviz窗口,关闭rplidar_gmapping_demo.launch
所在的进程,然后运行
roslaunch turtlebot_navigation rplidar_amcl_demo.launch
roslaunch turtlebot_rviz_launchers view_navigation.launch
在rviz中,点击2D Pose Estimate
,将向量的位姿设置为机器人的当前位姿。使用键盘控制机器人移动,可见位姿估计的粒子群逐渐收敛。
如果人为搬动机器人到新位置,要重新定位,只需重新运行rplidar_amcl_demo.launch
。
3.3 A*导航
注意:在进行A*自主导航时,要关闭键盘控制节点。
在rviz中点击2D Nav Goal
设定目标位姿,机器人将自动规划出轨迹并移动到目标位置。