写在前面
turtlebot由于价格低廉,深受很多开发者所青睐。如今turtlebot已经发布了第二代产品——turtlebot 2e,相比第一代,它的价格更加便宜,而且我们可以不再使用标准的netbook作为它的上位机,例如我们可以使用价格更为低廉的Arm嵌入式微型计算机龙板410c(DB41c,大概500元左右)、树莓派(大概300元左右)等等。当然,如果有特殊需求,我们也可以使用NVIDIA公司出品的Jetson TK1,价格也不算贵,大约1500元。这篇文章中,我们就以Jetson TK1为例来介绍如何使用自定义上位机。
安装ROS
我们可以在ROS官方wiki中找到ROS安装教程——安装ROS桌面完整版,如果看英语有困难的话可以参考这篇博客:在Jetson TK1上安装ROS(机器人操作系统)。
NOTE:如果你用的不是Jetson TK1,而是其他的嵌入式开发板,建议使用官方的镜像文件安装,这个镜像文件中的ubuntu系统默认已经安装ROS和turtlebot的相关软件,因此只需安装镜像文件即可。这里是镜像文件的下载地址:
使用该镜像文件安装ubuntu,可以采用比较常用的USB启动盘的方法,具体可以自行Google。
安装turtlebot相关功能包
当你安装好ROS系统之后,需要安装turtlebot功能包,你可以使用下面的命令进行安装:
sudo apt-get install ros-indigo-turtlebot ros-indigo-turtlebot-apps ros-indigo-turtlebot-interactions ros-indigo-turtlebot-simulator ros-indigo-kobuki-ftdi ros-indigo-rocon-remocon ros-indigo-rocon-qt-library ros-indigo-ar-track-alvar-msgs
NOTE::安装之前,最好使用sudo apt-get update
命令更新软件列表。
这一步可能会报错,但是没关系,貌似Jetson TK1上有些功能包装不了,不过那些装上的也就足够了。
NOTE:如果不怕麻烦的话,你也可以使用源码安装上述功能包。但是,笔者在使用源码安装时,需要安装gazebo才能完成编译,可是我无论如何也安装不了gazebo,最后只得放弃,我也只好认为Jetson TK1无法使用安装gazebo(使用源码安装除外),按这样说Jetson TK1源码安装turtlebot功能包将会是一件很麻烦的事。如果您有其他的好方法,欢迎您在我的博客下留言。
相关配置
环境变量
对于turtlebot功能包,一些环境变量会由环境变量的钩子程序所设置。当我们打开一个新的终端时,钩子程序就会自动运行。
特定底盘的设置
首先你需要知道你的底盘是create还是kobuki,然后针对不同的底盘进行不同的设置。
kobuki底盘
为了使我们的Jetson TK1检测到底盘的ftdi USB接口,我们需要对设备管理器(udev)规则进行转换。这样的话,kobuki底盘就可以通过/dev/kobuki
而不是/dev/ttyUSBx
进行数据传输,而前者较后者更加可靠。
如果你前面使用的是deb包来安装turtlebot的功能包的话,运行下面的命令完成设备管理器(udev)规则的转换:
> . /opt/ros/indigo/setup.bash
> rosrun kobuki_ftdi create_udev_rules
如果你使用的是源码安装,可以运行下面的命令:
# From the devel space
> . ~/turtlebot/devel/setup.bash
> rosrun kobuki_ftdi create_udev_rules
create底盘
为了保证加载正确的硬件配置,我们需要设置一些环境变量:
> export TURTLEBOT_BASE=create
> export TURTLEBOT_STACKS=circles
> export TURTLEBOT_3D_SENSOR=asus_xtion_pro (也可以选择kinect、astra)
> export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB0 (视情况而定,如果是ttyUSB1,就改成export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB1)
为了方便起见,我们可以将上面的这些命令写到.bashrc
文件里去,这个文件是个隐藏文件,默认在用户目录下。当然你也可以将它们写到devel/setup
文件里去,或者更好的办法是在你的工作空间的根目录下另创建一个setup.bash
文件。这样的话,即使你清空你的编译它们仍然会存在,下面是一个简单的例子:
# Get the location of your workspace (i.e. the location of this script)
export MY_WORKSPACE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ -d ${MY_WORKSPACE}/devel ]; then
source ${MY_WORKSPACE}/devel/setup.bash
fi
# Export the turtlebot variables
export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=kinect
export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB0
另外,我们还需要一个十分重要的配置。由于/dev/ttyUSBx
端口的使用需要dialout组,所以你必须保证当前的用户在这个组中,我们可以使用下面的命令:
> sudo adduser username dialout
在这个命令中username
就是你在ubuntu下登录的用户名。之后你必须注销登录,然后再重新登录进去,或者直接重启才能使设置生效。
当你执行完上面的操作之后,你可以运行下面的命令查看是否设置成功:
> groups
如果在输出结果中可以找到你的用户名的话,说明配置成功。至此,Jetson TK1上的的基本设置已经配置好。下面我们需要完成PC端的配置。
PC端的安装
turtlebot在使用时,常常需要另一个单独的PC来协助完成工作。因此,我们需要在另一台性能相对较好的PC上进行配置。
同样,这台PC仍需要安装ROS、turtlebot相关功能包等,因此完全可以参考上文中对上位机的配置。另外,安装之后的配置也和上位机的配置相同。
网络配置
为了使PC端与robot端(即上面我们所用的Jetson TK1上)进行正常通信,我们需要进行一些简单的配置。当然,我们这里所说的通信是指使得两端在同一个ROS网络内,即只运行一个节点管理器roscore
,无论是PC端还是robot端都可以识别到这个节点管理器。在这个配置中,我们需要多次用到IP地址。关于ubuntu如何查看IP地址,网上有很多资料。这里我们假设robot端IP地址为192.168.1.144,PC端的IP为192.168.1.5。
ssh配置
首先,由于robot端并不经常直接连接输入设备,如鼠标或者键盘,通常的做法是远程访问robot端。我们可以在robot端的电脑上安装ssh服务器:
sudo apt-get install openssh-server
安装好之后,我们可以在PC上通过ssh远程登录robot端:
ssh username@192.168.1.144
上述命令中username
是指robot端电脑的登录的用户名。
ROS配置
在这个配置中,我们假设节点管理器运行在robot端,当然你也可以运行在PC端。
在robot端打开.bashrc
文件,可以使用gedit ~/.bashrc
或者vim ~/bashrc
。在该文件末尾添加如下命令:
#The localhost IP address = IP address for the Master node
export ROS_MASTER_URI=http://localhost:11311
#The IP address for the Master node
export ROS_HOSTNAME=192.168.8.144
NOTE:#
后面是注释。
在上述命令中,ROS_MASTER_URI
的值为http://localhost:11311
,这是因为我们将节点管理器运行在robot端,所以上面的节点管理器的URI就是本地,即localhost
。这里我们用robot端的IP地址标识ROS的主机名字。
然后,在我们的PC端同样也是打开.bashrc
文件,在末尾添加下面的命令:
#The IP address for the Master node
export ROS_MASTER_URI=http://192.168.8.144:11311
#The IP address for your device/host IP address
export ROS_HOSTNAME=192.168.8.5
上面ROS_MASTER_URI
设置的是节点管理器所运行的电脑的IP地址,由于我们在robot端运行节点管理器,所以这里的IP就是robot端的IP。同样,这里PC端的主机名字也用它的IP地址标识。
时间同步
在ROS网络中,机器之间的时间同步非常重要,因此我们需要两端的时钟保持一致。我们可以安装chrony数据包来使两台电脑的时钟保持同步,在两台电脑上分别运行下面的命令安装chrony:
sudo apt-get install chrony
安装完成之后,chrony守护进程会自动启动并且开始让你的计算机与数台互联网服务器直接同步时间。
网络连接测试
通过ssh远程登录robot端,然后启动节点管理器roscore
:
roscore
然后在PC上,运行下面的命令:
rostopic list
如果上面的配置都正确的话,你可以得到下面的输出:
/rosout
/rosout_agg
另外,为了保持时间同步,最好在PC上运行下面的命令:
sudo ntpdate -b 192.168.1.144
上面命令中的IP地址为robot端的IP地址。
基础测试
如果你没有其他硬件需要配置的话,就可以对你的“JetsonBot”进行测试了。
将你的Jetson TK1安装在turtlebot上,接通电源(最好使用单独的电池供电),并使用UART转USB线将二者连接起来。然后,打开turtlebot的开关启动turtlebot。
为了方便起见,我们最好在PC端使用ssh远程控制Jetson TK1。我们可以以最小模式运行turtlebot机器人,测试一下上述配置是否成功:
roslaunch turtlebot_bringup minimal.launch
如果你听到turtlebot发出清脆的响声,而且没有产生“ERROR”或者“FATAL”等错误时,说明启动正常。
NOTE:可能会产生一些警告,这些警告可能是由于未检测到3D传感器或者电源所造成的警告,暂时可以不用理会。下一篇博客中我们会对这些配置做详细介绍。
碰撞传感器的测试
在Kobuki底盘上有三个碰撞传感器,分别位于底盘的正前方、左前方和右前方,该传感器可以帮助检测是否碰到障碍物。我们可以使用下面的命令进行测试:
rostopic echo /mobile_base/events/bumper
这时,你会看到下面的输出:
state: 0
bumper: 0
---------
state: 0
bumper: 0
NOTE:由于我们已经进行了ROS网络配置,所以该命令既可以运行在PC端也可以运行在robot端,下面的命令也是这样。另外,对于有些turtlebot,可能在碰撞传感器未被触发时(即产生碰撞),不会产生任何输出,不过也没关系,继续后面的测试。
上面的结果表示没有任何碰撞。
你可以手动地模拟碰撞,即用力压一下正前方的一个传感器,这时,你可以看到下面的输出:
state: 1
bumper: 1
下面我们来一起看看这个输出的含义。变量state
可以是0(释放)和1(压迫),变量bumper
可以是0(左)、1(中间)、2(右),分别代表三个传感器。因此,上面的输出表示的含义就很清楚了:中间的传感器被压迫。
当你释放前方的传感器时,可以看到下面的输出:
state: 0
bumper: 1
对其他的碰撞传感器重复上述操作以完成测试。
悬崖传感器的测试
悬崖传感器顾名思义是负责检测悬崖的,比如走到楼梯边缘的时候,该传感器就会发出相应的信息。和碰撞传感器一样,悬崖传感器也有三个,分别位于底盘的底部的正前方,左侧以及右侧。运行下面的命令即可测试该传感器:
rostopic echo /mobile_base/events/cliff
你这时应该会观察到下面的输出:
state: 0
sensor: 0
---------
state: 0
sensor: 0
NOTE:也许有些turtlebot在悬崖传感器未被触发时,不会产生任何输出,不过也没关系,继续后面的测试。
参考碰撞传感器的输出结果,我们会很容易理解这里的输出结果。这里同样是有两个变量:state
的值可以为0代表地面;为1代表悬崖。变量sensor的值可以为0、1、2,分别代表三个位置的传感器。
现在,我们把turtlebot抬起来,这时你应该会观察到下面的输出:
state: 1
sensor: 0
---------
state: 1
sensor: 1
---------
state: 1
sensor: 2
键盘控制测试
在你的PC上运行下面的命令:
roslaunch turtlebot_teleop keyboard_teleop.launch
这时你就可以根据提示对你的turtlebot进行控制了:
至此,turtlebot的基本配置已经讲完。另外由于篇幅原因,有些内容并未涉及。对于一些高级内容,我会在后面的博客中进行补充。
参考资料
- CSDN博客:ros_arduino_bridge功能包集的使用
- CSDN博客:ROS的安装、卸载以及Turtlebot包的安装
- ROS turtlebot教程——http://wiki.ros.org/turtlebot/Tutorials/indigo
- 硅步教育——http://edu.gaitech.hk/turtlebot/turtlebot-tutorials.html
- ROS by example vol 1,[美]R.帕特里克•戈贝尔,中山大学出版社