经过前面的基础学习,本章进入最为激动的机器人自主导航的学习。在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予咱们的miiboo机器人能自由行走的生命。本章将围绕机器人SLAM建图、导航避障、巡航、监控等内容展开。本章内容:html
1.在机器人上使用传感器python
2.google-cartographer机器人SLAM建图nginx
4.多目标点导航及任务调度github
SLAM建图须要用到底盘、激光雷达和IMU,因此这里详细介绍如何在机器人上使用这些传感器。要使用这些传感器也很简单,就是在机器人上开启相应传感器的ROS驱动节点,在设置合适的可配参数就好了。django
须要注意的是,底盘、激光雷达、IMU这三个传感器都使用串口与树莓派通讯,为了防止每次开机这三个设备的串口号发生变更,须要将串口号进行绑定与重映射,操做方法在前面已经介绍过了,若是尚未绑定直接前往前面相关内容参考。ubuntu
这里将创建一个叫catkin_ws的ROS工做空间,专门用于存放机器人传感器相关的ROS驱动功能包。关于建立ROS工做空间的操做,请参考前面相应部份内容,这里就不作讲解。centos
在机器人上只须要使用miiboo这个驱动包就能够驱动底盘了。将miiboo这个驱动包拷贝到~/catkin_ws/src/中,编译后就可使用了。miiboo驱动包文件结构,如图1。miiboo驱动包中含有两个ROS功能包miiboo_bringup和miiboo_description,驱动miiboo底盘、底盘PID整定、里程计标定这些功能包含在miiboo_bringup中,miiboo底盘urdf模型包含在miiboo_description中。数组
(图1)miiboo驱动包文件结构
底盘控制可配参数:
关于底盘控制可配参数都放在miiboo_bringup/launch/minimal.launch中,如图2。
参数com_port是底盘控制的串口号,因为前面已经作了绑定,因此直接填入绑定好的名称/dev/miiboo就好了;
参数speed_ratio是里程计走直线标定值,这个值经过标定获得。
参数wheel_distance是里程计转角标定值,这个值经过标定获得。
其他参数通常不须要修改,若有须要能够结合阅读源码来了解参数含有和作相应修改。
(图2)底盘控制可配参数
驱动miiboo底盘:
其实很简单,一条命令启动miiboo底盘控制。
roslaunch miiboo_bringup minimal.launch
底盘PID整定:
咱们的miiboo机器人底盘的stm32控制板中已经内置了整定好的PID参数,若是选用咱们提供的控制板和电机,通常状况下是不须要整定PID的。
对于想体验一下PID参数整定过程或将咱们的miiboo机器人底盘的stm32控制板应用到其余地方的朋友,这里给出了整定PID的整个操做过程和思路,方便你们学习和更深层次的研究。这里主要讲解PID整定的操做,关于原理性的东西能够参考前面相关内容进行了解。
因为底盘PID整定是非必须的功能,因此没有对底盘PID整定的串口(DEBUG-uart1)作绑定,须要先手动插入该串口到树莓派3,而后手动查看该串口的设备号,并修改该设备号的可读写权限。而后将该设备号填入miiboo_bringup/launch/pid_set.launch中的com_port参数中。而后,须要启动底盘控制节点、底盘调试节点、键盘控制节点。键盘控制节点teleop_twist_keyboard须要经过apt-get命令来安装,rqt_plot是ROS提供的绘图工具。
#打开终端,启动底盘控制节点 roslaunch miiboo_bringup minimal.launch #再打开一个终端,启动底盘调试节点,按提示输入命令 roslaunch miiboo_bringup pid_set.launch #安装键盘控制工具 sudo apt-get install ros-kinetic-teleop-twist-keyboard #再打开一个终端,启动键盘控制节点, source ~/.bashrc rosrun teleop_twist_keyboard teleop_twist_keyboard.py #再打开一个终端,用rqt_plot对底盘速度曲线进行绘制,指定曲线数据来源的topic rosrun rqt_plot rqt_plot
ROS提供的绘图工具rqt_plot用法很简单,在rqt_plot界面中,在Topic栏输入曲线数据来源,咱们这里为左、右轮速度,而后点击旁边的“+”将曲线加入绘制界面,人如图3。
(图3)用rqt_plot显示速度曲线
而后,经过在启动teleop_twist_keyboard节点的终端经过I/</J/L四个按键来控制底盘前进/后退/左转/右转控制,并观察速度曲线的变化,根据PID整定规则对PID参数进行整定,在启动 pid_set.launch的终端下按相应提示输入PID参数实现对整定参数的编辑。直到获得一个比较好的速度曲线,就能够结束整定过程了。实时速度曲线显示,如图4。
(图4)实时速度曲线显示
里程计标定:
机器人底盘运行的精度是衡量底盘的重要指标。底盘精度受里程计的走直线偏差和转角偏差影响。所以,须要对里程计的走直线和转角进行标定,尽可能减少偏差。miiboo机器人底盘的ROS驱动中已经写好了相应的标定程序,跟里程计标定有关的文件主要有:
.../miiboo_bringup/launch/check_linear.launch为里程计走直线标定启动文件
.../miiboo_bringup/launch/check_angular.launch为里程计转角标定启动文件
.../miiboo_bringup/launch/minimal.launch为设置标定参数及底盘控制启动文件
下面是标定步骤过程。
因为标定过程在前面已经讲解过了,请直接前往相应内容参考。
miiboo底盘urdf模型:
urdf模型描述了机器人底盘的形状、传感器之间的安装关系、各个传感器在tf tree中的关系。其实,miiboo底盘urdf模型的主要做用是提供各个传感器在tf tree中的关系,这些关系将在SLAM和导航算法中被使用。
(图5)miiboo机器人底盘中各个传感器tf关系
图5是miiboo机器人底盘中各个传感器tf关系,base_footprint是底盘的运动中心,base_laser_link是激光雷达的中心,imu_link为IMU模块的中心。以base_footprint为原点,创建机器人底盘的坐标系,坐标系为标准右手系,即底盘正前方为x轴、正左方为y轴、正上方为z轴、以x轴起始逆时针方向为theta轴。以base_footprint为父坐标系,创建base_footprint->base_laser_link关系,创建base_footprint->imu_link关系,就实现了各个传感器tf关系的构建,构建的具体实如今miiboo_description/urdf/miiboo.urdf中完成。如图6,为miiboo.urdf的具体内容。
(图6)miiboo底盘urdf模型描述文件
要使用这个urdf模型就很简单了,直接一句命令启动。
roslaunch miiboo_description miiboo_description.launch
在机器人上只须要使用ydlidar这个驱动包就能够驱动ydlidar-x4雷达了。将ydlidar这个驱动包拷贝到~/catkin_ws/src/中,编译后就可使用了。ydlidar驱动包文件结构,如图7。ydlidar驱动包中的其余文件咱们不须要关心,这些都是由雷达厂商提供的标准驱动,只须要设置咱们本身创建的ydlidar/launch/my_x4.launch文件,这个用于启动雷达。
(图7)ydlidar驱动包文件结构
激光雷达数据可配参数:
关于激光雷达数据可配参数都放在ydlidar/launch/my_x4.launch中,如图8。
参数port是激光雷达的串口号,因为前面已经作了绑定,因此直接填入绑定好的名称/dev/lidar就好了;
参数range_min和range_max是设置激光雷达数据的有效值区间。
其他参数通常不须要修改,若有须要能够结合阅读源码来了解参数含有和作相应修改。
(图8)激光雷达数据可配参数
驱动ydlidar-x4激光雷达:
其实很简单,一条命令启动ydlidar-x4激光雷达。
roslaunch ydlidar my_x4.launch
激光雷达数据格式:
激光雷达采用右手坐标系,雷达正前方为x轴、正左方为y轴、正上方为z轴、以x轴起始逆时针方向为theta轴。激光雷达的扫描数据以极坐标的形式表示,雷达正前方是极坐标0度方向、雷达正左方是极坐标90度方向,红色点为扫描到的数据点,如图9所示。
(图9)激光雷达数据格式
激光雷达的数据在ROS中是以sensor_msgs/LaserScan消息类型进行表示,如图10,angle_increment表示激光数据点的极坐标递增角度,ranges数组存放实际的极坐标点距离值。
(图10)激光雷达数据sensor_msgs/LaserScan消息类型
在机器人上只须要使用miiboo_imu这个驱动包就能够驱动mpu9250模块了。将miiboo_imu这个驱动包拷贝到~/catkin_ws/src/中,编译后就可使用了。miiboo_imu驱动包文件结构,如图11。ydlidar驱动包中的其余文件咱们不须要关心,只须要设置ydlidar/launch/my_x4.launch文件,这个用于启动IMU。
(图11)miiboo_imu驱动包文件结构
IMU数据可配参数:
关于IMU数据可配参数都放在miiboo_imu/launch/imu.launch中,如图12。
参数come_port是IMU的串口号,因为前面已经作了绑定,因此直接填入绑定好的名称/dev/imu就好了;
其他参数通常不须要修改,若有须要能够结合阅读源码来了解参数含有和作相应修改。
(图12)IMU数据可配参数
驱动IMU模块:
其实很简单,一条命令启动IMU模块。
roslaunch miiboo_imu imu.launch
IMU数据格式:
IMU模块采用右手坐标系,IMU模块正前方为x轴、正左方为y轴、正上方为z轴。IMU模块提供3轴加速度、3轴角速度、3轴磁力计、经数据融合后用欧拉角表示的姿态。
IMU数据在ROS中是以sensor_msgs/Imu消息类型进行表示,如图13。
(图13)IMU数据sensor_msgs/Imu消息类型
miiboo机器人上使用的是USB摄像头,用ROS驱动USB摄像头能够采用如下3中方法。
方法1:
使用usb_cam这个ROS包直接驱动
方法2:
使用gscam这个ROS包直接驱动
方法3:
自制OpenCV,cv_bridge,image_transport驱动ROS包
为了方便起见,我采用的是方法1,直接安装usb_cam这个ROS包直接驱动。
usb_cam摄像头驱动安装:
将usb_cam下载到~/catkin_ws/src/中,直接编译就好了。
cd ~/catkin_ws/src/ git clone https://github.com/ros-drivers/usb_cam.git rosdep install usb_cam cd ~/catkin_ws/ catkin_make
摄像头数据可配参数:
关于摄像头数据可配参数都放在usb_cam/launch/usb_cam.launch中,如图14。
参数video_device是摄像头的设备号,因为直插了一个USB摄像头,因此直接填入名称/dev/video0就好了;
其他参数通常不须要修改,若有须要能够结合阅读源码来了解参数含有和作相应修改。
(图14)摄像头数据可配参数
驱动USB摄像头:
其实很简单,一条命令启动USB摄像头。
roslaunch usb_cam usb_cam.launch
摄像头远程显示:
摄像头数据远程显示的方法有两种,方法一是在PC端rviz中订阅摄像头发布的图像topic,方法二是用Android手机上miiboo机器人APP直接显示。
先说方法一,在PC端打开rviz,在rviz中添加须要显示的Topic,这样就能够看到图像了。如图15和16。
(图15)在rviz中添加须要显示的图像Topic
(图16)在rviz中显示图像Topic
方法二,就很简单了,只要Android手机上miiboo机器人APP链接到机器人端成功后,就能自动显示图像了。如图17。
(图17)在Android手机的miiboo机器人APP中显示图像Topic
这个很简单,由broadcast_ip这个功能包实现,我已经写好放入~/catkin_ws/src/并编译了。只须要一句命令启动就好了。
roslaunch broadcast_ip broadcast_udp.launch
------SLAM+语音机器人DIY系列【目录】快速导览------
第1章:Linux基础
第2章:ROS入门
第3章:感知与大脑
第4章:差分底盘设计
第5章:树莓派3开发环境搭建
第6章:SLAM建图与自主避障导航
2.google-cartographer机器人SLAM建图
第7章:语音交互与天然语言处理
第8章:高阶拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章将持续更新,敬请关注-----------------
若是你们对博文的相关类容感兴趣,或有什么技术疑问,欢迎加入下面的《SLAM+语音机器人DIY》QQ技术交流群,一块儿讨论学习^_^
关于咱们:
视频教程:
https://www.bilibili.com/video/av61448040
原文出处:https://www.cnblogs.com/hiram-zhang/p/10412509.html