Turtlebot入门篇
0、什么是TurtleBot?
我自己的理解就是:TurtleBot是一款移动机器人,就是主要研究让机器人自主决定应该想那个方向走,怎么绕过障碍物,最终到达目的地。与之对应还有很多机器人,比如google的机器人(主要是仿生,且不容易摔倒,摔倒了也能自己爬起来)。我喜欢的方向是机器视觉,主要目标是让TurtleBot去感知环境,不会撞到障碍物,而且可以辨识目标。所以在TurtleBot上采用vSLAM技术,后面主要讲的也是主要与之相关的。
1、本篇目标
TurtleBot实现简单的目标跟踪
1.1、概述
TurtleBot主要由3部分组成(从上到下):Kinect2,笔记本,移动底座,最后加支架。
硬件不多说,这边博客主要是讲解中间重点部分软件的安装和测试。图中标记的1,2,3,是后面讲解的大致顺序。
2、硬件,软件环境
硬件:
- TurtleBot2(其实主要指的是kobuki移动底座和其支架)
- Microsoft Kinect2(注意我这使用的是Kinect2)
- 笔记本(根据需求自己选购)
软件:
- 操作系统:Ubuntu
- 机器人操作系统:ROS
- 软件库:libfreenect2,iai_kinect2
3、系统、ROS安装
在说安装软件之前简单的说说TurtleBot机器人,这是TurtleBot的官网http://www.turtlebot.com/,里面有代理商,你可以去找。
下来当然是要安装操作系统和ROS(机器人操作系统)。在这里需要注意的是:
- 建议安装Ubuntu,因为ROS对它支持的比较好
- 要注意ROS的版本和Ubuntu的版本是有对应的,不是随意的组合(我刚开始就在这吃亏了)
这两东东的安装,有两种方式:
- 先安装Ubuntu,在安装ROS。至于怎么安装Ubuntu,网上的资料很多(建议直接装到真机上,不要用虚拟机,不是很好用)。
ROS安装,ROS有很多版本供您选择。但是要注意,只有ROS Indigo之后的才支持Kinect2。这是ROS的官网http://wiki.ros.org/。在这里有详细的安装教程。 - 简单方式,直接使用别人封装好的Ubuntu镜像,因为这样在Ubuntu上已经安装好了ROS。(我采用的就是这种方式,Ubuntu14.04,ROS_Indigo)。镜像的地址:http://wiki.ros.org/turtlebot/Tutorials/indigo/Turtlebot%20Installation
好了,经过这个步奏你应该已经装好了这两个软件。你可以在终端中运行下面命令试试,看有没有报错:
roscore
如果没有表示,你已经安装好了。在这个基础之上,你应该按照ROS官网教程配置自己的工作空间http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment,我建议使用catkin方式。
4、Kinect2驱动安装
需要做的事情有两件:编译安装libfreenect2和iai_kinect2。幸运的是这两个作者都在的github中写了详细的安装过程。
- libfreenect2 https://github.com/OpenKinect/libfreenect2
- iai_kinect2 https://github.com/code-iai/iai_kinect2
其实上面说的不是非常的准确,libfreenect2是驱动Kinect2让他工作的,我们只要编译安装好之后就不用管了。iai_kinect2其实是一个工具集,主要包括:1、相机标定工具;2、深度数据配准工具;3、libfreenect2和ROS之间的转换工具,确切的说就是将Kinect2的数据流转换给ROS,这样我们就可以借助ROS上的工具对数据流进行处理了;4、查看数据流的工具
因为Kinect是RGBD相机,我们需要知道怎么将深度信息和彩色信息对应,知道这个对应的过程就叫做相机标定。在
https://github.com/code-iai/iai_kinect2/tree/master/kinect2_calibration
中有详细的标定过程。下面简单说说刚才说的那个“对应”的形式化表示:
$$
\left[
\begin{matrix}
u\
v\
1
\end{matrix}
\right]
= kR
\left[
\begin{matrix}
x\
y\
z
\end{matrix}
\right]
+T
$$
其中$u,v$表示对应的RGB图像中的点,$x,y,z$表示与之对应的空间中的点,这个坐标原点在相机的镜头处。$R$是旋转矩阵,$33$,$T$是平移向量,$31$。$R,T$就是我们求的对应关系。
在这一步你应该可以通过测试程序看到Kinect前的图像,表示你已经安装好Kinect2的驱动了,并且可以通过iai_kinect2将Kinect2的数据转给ROS了。
若果有错误,请重新按照步奏再做一遍
5、测试ROS和TurtleBot底座通信是否正常
这里主要是硬件连接和终端命令执行。保证硬件连接正确后就以在在终端中执行命令了:
> roscore
然后打开底座的电源。
ctrl+alt+t新打开一个终端,执行下面命令:
> roslaunch turtlebot_bringup minimal.launch
再打开一个终端,执行下面命令:
> roslaunch turtlebot_teleop keyboard_teleop.launch
下来你就可以按照提示信息按相应的键遥控溜达你的机器人了(i:前进;,:后退;j:左转;l:右转;k:刹车)
注意:确保你机器人的电池有足够的电量。
参考:http://learn.turtlebot.com/2015/02/01/6/
5.1、roslaunch turtlebot_bringup minimal.launch 异常处理
解决办法如下:
- 如果出现异常情况,首先确认TurtleBot的移动底座的开关是否打开,笔记本和底座的连线是否连接完好
- 如果确认上面的没有问题,还时出现下面的问题:
提示找不到设备,分析原因就可能是驱动不对。修改的beg的办法就是查看源码修改相应的参数:
我们执行的命令是:“roslaunch turtlebot_bringup minimal.launch”,那么我们就
> roscd turtlebot_bringup
进入“turtlebot_bringup”,然后
> cd launch
找到minimal.launch文件复制一份,并将其命名为“my_minimal.launch”。使用编辑将其打开
> gedit my_minimal.launch
可以看到代码的第二行就是设置TurtleBot移动底座的类型,在代码中提供了“create,roomba”两种类型。但是我的是“kobuki”,我只在这里修改运行后报错(改为)。然后我就找这个参数最后传给了谁,发现只有两个文件用到这个参数:robot.launch.xml和mobile_base.launch.xml。直接将包含有mobile_base.launch.xml的代码修改为:
<include file="$(find turtlebot_bringup)/launch/includes/my_mobile_base.launch.xml">
具体怎么改,继续往下看:
关闭当前文件,执行命令:
> cd includes
你就会发现mobile_base.launch.xml就在这里,打开mobile_base.launch.xml:
> cat mobile_base.launch.xml
查看源码,发现在第四行,我们传进来的base参数原来别加入到了路径当中。路径指的就是当前的路径,你执行“ls”命令后就会发现有create和roomba文件夹,同时你也会看见有kobuki文件夹,进入kobuki文件夹,你会发现有“mobile_base.launch.xml”文件,将这个文件复制一份,并命名为“my_mobile_base.launch.xml”,然后将
<remap from="mobile_base/commands/velocity" to="cmd_vel"/>
的注释去掉。要不然你用他的驱动底座后收不到“cmd_vel”话题下的消息。然后回退到上层目录,将mobile_base.launch.xml复制一份,并且命名为:“my_mobile_base.launch.xml”。然后打开它,直接将
<include file="$(find turtlebot_bringup)/launch/includes/$(arg base)/mobile_base.launch.xml">
修改为:
<include file="$(find turtlebot_bringup)/launch/includes/kobuki/mobile_base.launch.xml">
然后打开底座电源,链接好线,执行(注意使用的是my_minimal.launch):
> roscore
> roslaunch turtlebot_bringup my_minimal.launch
> roslaunch turtlebot_teleop keyboard_teleop.launch
现在你就可以溜达你的机器人了~~~
++++++++++++++++++++++++++++基本的环境已经配置好了++++++++++++++++++++++++++++
6、主程序
在基本的环境配置好了基础之上,我们将处理从kinec2拿到的数据,然后向底座发命令,让其执行响应的移动操作。
刚开始,我们当然不是从头写程序,而是先看别人的代码然后进行响应的修改。首先推荐一本书(ros_by_example http://download.csdn.net/detail/a_cainiao_a/9477742),我们这里用的代码都是这本书上的。先安装必要的工具:
> sudo apt-get install ros-indigo-turtlebot-bringup \
ros-indigo-turtlebot-create-desktop ros-indigo-openni-* \
ros-indigo-openni2-* ros-indigo-freenect-* ros-indigo-usb-cam \
ros-indigo-laser-* ros-indigo-hokuyo-node \
ros-indigo-audio-common gstreamer0.10-pocketsphinx \
ros-indigo-pocketsphinx ros-indigo-slam-gmapping \
ros-indigo-joystick-drivers python-rosinstall \
ros-indigo-orocos-kdl ros-indigo-python-orocos-kdl \
python-setuptools ros-indigo-dynamixel-motor-* \
libopencv-dev python-opencv ros-indigo-vision-opencv \
ros-indigo-depthimage-to-laserscan ros-indigo-arbotix-* \
ros-indigo-turtlebot-teleop ros-indigo-move-base \
ros-indigo-map-server ros-indigo-fake-localization \
ros-indigo-amcl git subversion mercurial
然后克隆代码:
> cd ~/catkin_ws/src
> git clone https://github.com/pirobot/rbx1.git
> cd rbx1
> git checkout indigo-devel
> cd ~/catkin_ws
> catkin_make
> source ~/catkin_ws/devel/setup.bash
> rospack profile
下面我们就是将一些launch文件进行修改,我们修改的时候并不是在原文件上修改而是同名复制一份前面加“my_”的,例如原文件叫:“minimal.launch”,我们复制的就叫:“my_minimal.launch”。修改的主要内容是:修改数据流输入的话题;下面我们只是说在复制后的文件中怎么改,去掉“my_”就是原文件名了。
> roscd rbx1_vision
> cd launch
> gedit my_face_tracker2.launch
将这两句
<remap from="input_rgb_image" to="/camera/rgb/image_raw"/>
<remap from="input_depth_image" to="/camera/depth_registered/image_raw"/>
改为
<remap from="input_rgb_image" to="/kinect2/qhd/image_color"/>
<remap from="input_depth_image" to="/kinect2/sd/image_depth"/>
> roscd rbx1_apps
> cd launch
> gedit my_object_tracker.launch
将这句
<remap from="camera_info" to="/camera/rgb/camera_info"/>
改为
<remap from="camera_info" to="/kinect2/qhd/camera_info"/>
7、启动主程序
启动的时候每一句话一个终端,我在这就一块给出了:
> roscore
> roslaunch turtlebot_bringup minimal.launch 或者 roslaunch turtlebot_bringup my_minimal.launch
> roslaunch kinect2_bridge kinect2_bridge.launch
> roslaunch rbx1_vision my_face_tracker2.launch
> roslaunch rbx1_apps my_object_tracker.launch
尽可能让你的脸出现在视频监视窗口中,并且让程序找到你的脸,然后你左右移动,就会看到TurtleBot发生响应的转动,因为这个程序尽可能的将你的脸放在画面的中间。
Turtlebot入门篇的更多相关文章
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- 一个App完成入门篇(七)- 完成发现页面
第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...
- [原创]Linq to xml增删改查Linq 入门篇:分分钟带你遨游Linq to xml的世界
本文原始作者博客 http://www.cnblogs.com/toutou Linq 入门篇(一):分分钟带你遨游linq to xml的世界 本文原创来自博客园 请叫我头头哥的博客, 请尊重版权, ...
- 转:OSGi 入门篇:模块层
OSGi 入门篇:模块层 1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 本文 ...
- 转:OSGi 入门篇:生命周期层
OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
- 【three.js详解之一】入门篇
[three.js详解之一]入门篇 开场白 webGL可以让我们在canvas上实现3D效果.而three.js是一款webGL框架,由于其易用性被广泛应用.如果你要学习webGL,抛弃那些复杂的 ...
- [Maven]Apache Maven 入门篇
作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...
随机推荐
- First day in 阿里
周五上午10点半的飞机,为了便宜选了CA的空客320的飞机,结果体验很差.飞机涂了层风骚的粉紫色,机内较旧,也很小,经过所谓的头等舱简直惨不忍睹.对比起去年飞去北京乘的波音真是没法比,波音上每个人都有 ...
- RecyclerView使用时遇到的问题
一.概述 二.常见问题: 1.如何为RecyclerView的Item设置点击事件? 1.1 问题描述 类似于下列方法 RecyclerView.setOnItemClickListener(OnCl ...
- webshell下执行命令脚本汇集
cmd1.asp <object runat=server id=shell scope=page classid="clsid:72C24DD5-D70A-438B-8A42-984 ...
- bzoj3991: [SDOI2015]寻宝游戏--DFS序+LCA+set动态维护
之前貌似在hdu还是poj上写过这道题. #include<stdio.h> #include<string.h> #include<algorithm> #inc ...
- SQL异常:ORA-00936: missing expression
select * from t_user where id in()当条件in的内容为空时抛 java.sql.SQLException: ORA-00936: missing expression ...
- isset 和empty 两个函数的用法
关于用php 获取当前脚本的url很多朋友会说很简单,但是要获取很详细的就要经过多次判断哦. $PHP_TIME = time();$PHP_SELF = isset($_SERVER['PHP_SE ...
- Python的全局变量
应该尽量避免使用全局变量.不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性.对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误.这种错误是很难 ...
- Mongo使用脚本更新数据
SQL Server中我们经常要使用脚本来刷一些数据,在mongo中我们也可以使用mongo的脚本来刷mongo的数据 首先在命令窗口中链接到本地的mongo库 load("[脚本的地址]& ...
- redis 自启动
第一步: 在/etc/init.d/目录下建立一个名字为 redis 的启动脚本 cd /etc/init.d touch redis 然后在这个脚本中添加如下脚本 <注意修改自己的PIDFI ...
- define宏定义和const常变量区别
1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换.因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存.const定义的常量,在程序运行时在常量表中 ...