本专栏目录
前言
第一章:Linux基础
第二章:ROS入门
(资料图)
第三章:感知与大脑
第四章:差分底盘设计
第五章:树莓派3开发环境搭建
第六章:SLAM建图与自主避障导航
第七章:语音交互与自然语言处理
附录A:用于ROS机器人交互的Android手机APP开发
附录B:用于ROS机器人管理调度的后台服务器搭建
附录C:如何选择ROS机器人平台进行SLAM导航入门
视频教程
https://www.bilibili.com/video/BV1jS4y1a7Lz
通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识。接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发。本章将从树莓派3的开发环境搭建入手,为后续ros开发、slam导航及语音交互算法做准备。本章内容:
1.安装系统ubuntu_mate_16.04
2.安装ros-kinetic
3.装机后一些实用软件安装和系统设置
4.PC端与robot端ROS网络通信
5.Android手机端与robot端ROS网络通信
6.树莓派USB与tty串口号绑定
7.开机自启动ROS节点
下面这本书是本篇文章的参考文献,大家有需要可以入手一本:
1.安装系统ubuntu_mate_16.04
安装前先准备好需要用到的材料,在树莓派3上安装ubuntu_mate_16.04需要用到的工具和材料,如图1。
1.1.格式化microSD卡
在向microSD卡烧入系统之前,需要先格式化好microSD卡。我这里使用DiskGenius工具将卡格式化为FAT32文件系统。DiskGenius下载地址:
http://www.diskgenius.cn/download.php
1.2.下载ubuntu-mate-16.04系统镜像
直接前往ubuntu-mate的官网https://ubuntu-mate.org/download/。选择如图2所示的版本进行下载就行了。
1.3.系统烧录
将下载好的系统镜像文件ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz解压得到ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img,该文件应存放在英文路径下。然后用Win32 Disk Imager工具将ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img烧录到microSD卡,Win32 Disk Imager工具下载地址https://win32-disk-imager.en.lo4d.com/download。烧录过程很简单,打开Win32 Disk Imager工具,在[映像文件]栏中填入待烧录的镜像文件路径,在[设备]栏中填入要烧录的microSD卡,最后点击[写入]等待烧录进度完成就行了,如图3。
1.4.上电开机
给树莓派3主板连接上HDMI显示器、鼠标、键盘,并插入刚刚烧录好系统的microSD卡,就可以上电了,如图4。
第一次开机,系统需要用户填写一些必要的设置项,首先是系统语言设置,选择默认的语言English就行了,如图5。
然后是wifi连接设置,这里选择先不联网,这样系统配置速度会快很多,等后面我们再进行联网,如图6。
然后是时区设置,我们在中国,说以用鼠标点击地图中的中国区域,会自动锁定到Shanghai时区,如图7。
然后是键盘设置,直接默认就行了,如图8。
然后是用户名和密码设置,为了方便记忆,我将用户名和密码都设置成了ubuntu;这里需要特别注意,由于我们的系统用于机器人的开发,为了让机器人上电就能自动进入系统,我们需要勾选[Log in automatically]选项,也就是让系统开机自动登录。如图9。
然后就进入系统配置过程了,耐心等待配置进度条完成,如图10。
耐心等待,所有配置完成后,系统会自动重启一次,重启完成后,就可以看到ubuntu-mate-16.04系统的真容了,如图11。如果我们不想每次开机都看到这个欢迎界面,可以去掉勾选框中的勾,关闭就行了,下次就不会出现了。
最后,就可以见到ubuntu-mate-16.04系统的真容了,如图12,到这里系统安装就成功了。
2.安装ros-kinetic
安装好系统ubuntu-mate-16.04后,就可以安装对于我们机器人开发非常重要的ROS系统了,根据ubuntu的版本与ROS行版本之间的对于关系,这里我们安装ros-kinetic这个发行版。
2.1.连接wifi网络
由于安装需要通过网络在线进行,所以需要先连接上wifi,在桌面右上角找到wifi样式的图标,在下拉栏中选择[Edit Connections…],如图13。
在弹出来的窗口中,点击[Add]来添加我们的网络连接,并选择[Wi-Fi]连接类型,最后点击[Create…]来创建,如图14。
在网络连接的配置窗口中,首先设置[General]参数,为了让系统开机自启动后能自动连接该网络,勾选前两项,如图15。
然后设置[Wi-Fi]参数,SSID栏填入自己家wifi的名字(我家的wifi名字叫error),Mode栏选择Client,Device栏下拉填入自己的无线网卡号,如图16。
然后设置[Wi-Fi Security]参数,Security栏填入自己家wifi的加密方式(一般的加密方式都是WPA&WPA2 Personal),Password栏填入wifi的连接密码,最后点击[save]保存设置好的参数,如图17。
最后找到[Enable Networking]选项,去掉选项前面的勾,然后再勾上,让网络配置生效;稍等片刻,我们配置的wifi连接error将自动连接上,这样就连接网络完成了,如图18。
为了让机器人启动后,我们能通过网络远程访问,这里建议大家在树莓派上设置成静态IP分配,首先打开命令行终端用ifconfig查看一下当前分配给树莓派的IP地址,将这个IP地址绑定成静态IP,这样可以保证该IP不会与其他设备发生IP冲突,如图19。
然后,对上面创建的网络连接的[IPv4 Settings]参数进行设置,Method栏选择Manual,Addresses栏填入静态IP参数(静态IP设为192.168.0.117,子网掩码设为255.255.255.0,网关设为192.168.0.1),DNS servers栏填入192.168.0.1,最后保存就行了,只需要重启网络静态IP就设好了,如图20。
2.2.安装ros-kinetic
其实在ubuntu上安装ROS,有很详细的ROS官方教程,感兴趣的朋友可以直接参考官方教程http://wiki.ros.org/kinetic/Installation/Ubuntu。由于官方教程用英文书写,为了方便大家阅读,我将官方教程翻译过来,方便大家学习,下面正式进入安装。温馨提醒,由于不同的编辑器对过长的句子换行的规则不同,下面的命令被自动换行后可能影响正常的阅读,请直接参阅官方教程中的命令http://wiki.ros.org/kinetic/Installation/Ubuntu。
(1)设置ubuntu的sources.list
打开命令行终端,输入如下命令:
(2)设置keys
打开命令行终端,输入如下命令:
(3)安装ros-kinetic-desktop-full完整版
打开命令行终端,分别输入如下两条命令:
小技巧,如果安装过程提示“下载错误”,请耐心重试上面的两条命令,这个错误多半是由于网络故障造成的。
(4)初始化rosdep
打开命令行终端,分别输入如下两条命令:
(5)配置环境变量
打开命令行终端,分别输入如下两条命令:
(6)安装rosinstall
打开命令行终端,输入如下命令:
(7)测试ros安装成功与否
打开命令行终端,输入如下命令:
如果此时出现以下内容
那么恭喜你,ROS已经成功的安装上了!!!
3.装机后一些实用软件安装和系统设置
虽然我们顺利安装了ubuntu-mate-16.04系统,并且在系统上装好了ROS-kinetic发行版,为了后面跟高效和便捷的开发,这里将进行一些非常实用软件的安装和系统设置。
3.1.开机自动登录
装完系统后第一次开机,会要求设置用户名和密码,这里应该设置用户开机自动登录,只有登录后树莓派3才能自动连接到无线网络,从而才能远程控制。如果装机时已经设置了,请直接跳过这一部分;如果你搞忘记或遗漏了,没有设置开机自动登录,也不要紧,用下面的的方法进行自动登录设置。
打开文件/usr/share/lightdm/lightdm.conf.d/60-lightdm-gtk-greet.conf,在[seat:*]节点下修改或添加以下代码
3.2.超级用户root密码设置
装完ubuntu-mate-16.04系统后,root用户默认是没有密码的;用普通用户ubuntu的sudo权限去设置root用户的密码。
反正我们是用于学习,出于方便记忆的考虑,所以和之前设置ubuntu的用户名和密码一样,这里设置root的用户名和密码也一样,也就是root用户的密码也是root。
root密码设置成功后,su root登录进去验证一下,如果能登录就设置成功了。
3.3.扩展SWAP空间
由于后续在树莓派3上需要编译一些大型的程序和运行复杂的SLAM算法,默认的物理内存1GB是不够用的,常常造成卡机死机等现象,这里需要添加SWAP扩展空间,其实就是当系统内存不足时会用硬盘上SWAP分区作为虚拟内存。
由于我的microSD卡是32GB的,所以可以多分配一些给SWAP,所以分配4GB给SWAP空间。具体步骤:
3.4.连接wifi网络
为了让机器人启动后,我们能通过网络远程访问,需要给机器人配置好网络连接,并分配静态IP,让机器人开机后就能自动连接wifi。关于设置的内容已经在上面安装ros-kinetic
详细介绍了,有需要的直接前去翻阅就行。
3.5.安装chromium浏览器
前一段时间,在ubuntu-mate-16.04上安装ROS后,ubuntu-mate-16.04系统自带的Firefox浏览器不能用了,Firefox最近对这个故障进行了修复。不过为了保险起见,还是推荐安装谷歌为linux系统推出的浏览器chromium,跟我们平时用的闻名于世的chrome浏览器是差不多的。安装很简单,就一条命令。
3.6.安装vim、ssh工具
vim是Linux中一款很经典的代码文本编辑器,不论是本地还是远程编辑文本都很强大;ssh功能很强大,不紧可以提供用户远程登录控制系统和编辑文件,还提供命令终端下的scp远程文件传输。安装很简单,几条命令就搞定。
3.7.通过ssh远程登录到机器人
树莓派3主板是安装在miiboo机器人上的,由于机器人要在地上自由移动,给机器人上的树莓派配一个HDMI显示器和鼠标键盘用于程序调试显然是不方便的。一个很好的方法是,工作端PC和机器人连接到同一个路由器完成局域网组网,然后在PC端用ssh远程登录到机器人,这样就可以在工作PC端对机器人上的程序和文件进行调试开发了。
ssh远程登录方法:
一旦PC端打开的终端窗口ssh远程登录机器人后,就可以在该终端下像在机器人上使用终端一样进行操作了。PC端可以打开多个终端窗口ssh远程登录机器人,这样在不同的终端下可以开启机器人上不同的程序。
3.8.在工作PC端远程编辑机器人上的文件
已经介绍了通过ssh远程登录机器人的方法,其实可以直接在登入的终端下用vim对机器人上的文件进行查看编辑。但是,如果需要同时编辑多个文件,或对一个软件项目源码进行编辑,vim就不方便了。
这里推荐在PC端安装IDE开发工具(比较推荐atom,不过sublime text也不错,根据个人喜好选择吧),然后将机器人上的系统文件夹远程挂载在PC端系统,这样就可以在PC端上用IDE开发工具直接对远程挂载过来的文件及文件夹进行编辑了。
在PC端安装IDE开发工具atom很简单,直接在ubuntu软件中搜索atom,然后点击安装就行了,如图21。
将机器人上的系统文件夹远程挂载在PC端系统,首先打开[文件]管理器,找到左侧栏的[连接到服务器],在服务器地址栏输入远程文件地址(如sftp://192.168.0.117/home/ubuntu,这里的sftp是协议,192.168.0.117是远程设备IP地址,/home/ubuntu是远程设备中想要被挂载的文件夹请根据实际替换),然后点击[连接],这是需要输入远程设备的登录名和密码,如图22。
挂载好后,就可以使用各种我们喜欢的编辑工具对文件夹中的文件进行编辑了,如图23,不过远程文件系统挂载会比较占用网路带宽,不用时建议尽量断开。
4.PC端与robot端ROS网络通信
PC端与robot端ROS网络通信的设置,其实很简单。就是要在PC端和机器人端都要指明master和hostname这两个东西,我们都知道ROS基于的是一个分布式的通信机制,支持多机通信,并且只能有一个master设备作为对其他分部式设备的统一管理。
由于大部分节点算法都是运行在机器人上,PC端只是用于远程调试,为了系统的效率与稳定性,我把机器人端作为master。如图24。
首先,配置机器人端的ROS网络参数,打开机器人用户目录下的~/.bashrc配置文件,在最后添加两个环境变量,如图25。
不难发现在机器人上mater和host的IP是一样的,因为机器人被指定为了整个ROS网络的master设备。修改好后,需要重启系统使设置参数生效。
然后,配置PC端的ROS网络参数。这里需要提醒一下,需要让PC端与机器人出于同一局域网下,如果PC端使用的是虚拟机运行ubuntu建议用物理桥接的方式给虚拟机连网。打开PC端用户目录下的~/.bashrc配置文件,在最后添加两个环境变量,如图26。
不难发现PC端上master填的是机器人IP地址,host为PC本地IP。修改好后,需要重启系统使设置参数生效。
设置好PC端与robot端ROS网络通信,在正是进行ROS多机通信时,需要首先在机器人上启动节点管理里master,启动命令是roscore,然后就可以在相应的机器上启动需要的节点了。
5.Android手机端与robot端ROS网络
通信
刚刚介绍了PC端与robot端ROS网络通信,在有些情况下,使用Android手机端来调试监控机器人会更方便。于是,参考ROS官网给的开发demo,我用ros-java库也做了一个能跟robot端进行ROS网络通信的APP,我给这个APP取名叫Android_for_miiboo_robot.apk。如果大家对这个APP感兴趣,可以持续关注我,我会把这个APP共享给大家。这里就来介绍一下Android手机端与robot端ROS网络通信的配置。
首先,是配置机器人端的ROS网络参数,和前面一样,需要在机器人端~/.bashrc中指定master与host,由于前面配置PC端与robot端ROS网络通信时已经配好了,所以就无需重复配置了。为了便于在局域网下的Android手机通过网络能迅速找到机器人,需要在机器人上开启专门广播自己IP的节点,这样Android手机就能自动搜索并完成Android手机端与robot端ROS网络通信的连接。机器人IP广播节点我已经写好了,只需要通过命令启动:
然后,是配置Android手机端的ROS网络参数,其实将Android手机连接到同一个wifi后,打开miiboo机器人的APP,APP会自动扫描到master(也就是机器人)的IP地址,只需要点击CONNECT就可完成连接。连接完成后,Android手机端与robot端ROS网络通信就打通了,接下来APP就可以用ROS网络通信来操控机器人了。如图27。
这里顺便介绍一下,miiboo机器人APP的功能,功能清单如下。
功能1:手动遥控miiboo机器人移动
功能2:建图/导航模式切换
功能3:显示地图
功能4:点击地图点指定导航
功能5:视频监控
6.树莓派USB与tty串口号绑定
底盘、激光雷达、IMU这三个传感器都使用串口与树莓派通信,为了防止每次开机这三个设备的串口号发生变动,需要将串口号进行绑定与重映射。
创建rules文件:
rules文件前的序号越大优先级越小,将优先级设置的小一点;创建文件/etc/udev/rules.d/99-miiboo-usb-serial.rules,文件内容如图28。
确定新插入串口设备的属性:
在输出的数据中从上到下找(如KERNELS=="1-1.4.3:1.0"形式的项),下一个不带“:”的KERNELS就是我们要找的,将下面这些参数
ATTRS{idProduct}
ATTRS{idVendor}
KERNELS
的取值填入上面创建的rules文件中对应的位置,然后在SYMLINK+中给这个设备取一个别名,MODE设为0777。
将底盘、雷达、IMU依次插入树莓派3的USB口,重复执行上面确定新插入串口设备的属性这一步,直到将这3个串口都绑定完成。这里将底盘、雷达、IMU分别ttyUSB*名称分别映射成别名miiboo、lidar、imu,这样在不改变底盘、雷达、IMU插入树莓派3的USB口物理孔位顺序时,不论上电开机后这3个串口被系统分配的ttyUSB*实际是多少,我们都可以用映射好的别名/dev/miiboo、/dev/lidar、/dev/imu来访问底盘、雷达、IMU串口,并且不用担心用户访问权限不足的问题。这里特别说明,miiboo机器人的底盘、雷达、IMU插入树莓派3的USB口物理孔位顺序,如图29,请不要改变这个顺序。
使绑定设置生效:
重启机器人使绑定设置生效,命令如下。
机器人重启后通过命令查看绑定是否生效,看到下面的输出就说明绑定成功了,如图30。
7.开机自启动ROS节点
在后续教程学习完后,基本上所有的机器人算法就开发的差不多了。于是,我们就需要在机器人上电开机时,自启动想要启动的ROS节点,让机器人立马进入工作状态。
由于我自己尝试过网上的教程,将ROS节点启动命令放入系统开机自启动脚本的方法,亲测不成功。后来仔细研究才知道,需要系统完全启动,建立起ROS运行的必须环境后,ROS节点程序才能开始工作,所以系统开机自启脚本行不通。
于是,经过我自己的研究,找到了一种简单的方法,将要启动的roslaunch命令加入机器人的~/.bashrc文件的末尾。这样在系统启动后,执行用户自动登录时,~/.bashrc会被调用,这样就可以实现ROS节点启动了。关于用户自动登录的设置可以参考前面的相关内容。
添加到~/.bashrc文件末尾的内容如下,根据自己的需要,将命令替换成自己的ROS节点启动命令。
设置完成后,sudo reboot就可以了。
后记
为了防止后续大家找不到本篇文章,我同步制作了一份文章的pdf和本专栏涉及的例程代码放在github和gitee方便大家下载,如果下面给出的github下载链接打不开,可以尝试gitee下载链接:
github下载链接:https://github.com/xiihoo/DIY_A_SLAM_Navigation_Robot
gitee下载链接:https://gitee.com/xiihoo-robot/DIY_A_SLAM_Navigation_Robot
技术交流
QQ技术交流群:117698356
参考文献
[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.