摘要
智能机器人的发展已经渗透到人们日常生活的各方各面,日益在人们日常生活中发挥着重要的作用,并且智能机器人跟踪技术是机器人研究领域的一个重要研究方向。云计算正不断应用到各种场景,传统机器人的计算存储等能力受限于其板载设备,将云计算与机器人结合用于提升机器人能力是机器人未来发展的趋势之一。
本毕业设计课题基于turtlebot实现机器人目标追踪,需要将物体识别迁移到云服务器,云服务实时的通过对图像计算做出移动指令,最终实现目标追踪。
采用机器人操作系统(ROS)与Client/Server(客户端/服务端)通信相结合来实现本课题。首先客户端用来接受kinenct所采集的图像,将物体识别到服务器;其次服务器端实时的对图像进行计算处理,利用机器人跟踪技术,并将产生的控制命令返回给客户端,最终远程实现对机器人的跟踪控制。
关键词:目标跟踪;ROS机器人程序设计;C/S通信框架;远程控制;云机器人

3 基于ROS的控制移动

3.1 基于ROS的坐标系
给机器人发送运动命令指挥机器人运动之前,了解在ROS中机器人运动使用的测量单位和坐标系统规则。
ROS使用右手约定来定位坐标轴。食指、中指和拇指分别代表指向x、y、z的正轴,对于轴的旋转方向为逆时针方向。如果将拇指指向任何轴的正方向,则手指会沿着正旋转的方向卷曲。对于移动机器人应用ROS,x轴代表前方,y轴代表左侧,z轴代表上方。基于右手定则,机器人围绕z轴的正旋转是逆时针方向,而负旋转是顺时针方向。
ROS使用国际公制系统,线速度始终以米/秒(m/s)为单位,角速度以弧度/秒(rad/s)为单位。
3.2 运动控制水平
控制一个可移动机器人可以在一系列级别下完成,并且ROS为这些不同级别的控制都提供了响应的方法。
在本项目中,我们选择的是基座控制器级别(Base Controller)。驱动程序和PID控制程序一般被组合在一起,封装成一个节点,称作基座控制器Base controller。在抽象的下一个级别,机器人的期望速度是以真实世界的单位来指定的,例如每米的米和弧度。通常也会运用某些形式的PID(Proportional Integral Derivative 比例积分导数)控制。这些方面体现了ROS尽可能地使机器人按照我们期待的行为方式去运动。
基座控制器程序必需始终运行在一个安装有引擎驱动控制程序的计算机上,而且在启动机器人时,它会是第一个被启动的节点。如果我们的机器人配有了基座控制程序,ROS会提供一些工具是操作者向机器人来发布运动命令,可以使用命令行发布或者是写在ROS节点中运行命令。在这个级别上,与基座控制器相连接的硬件设备是什么并不重要,我们在编程时可以仅关注了在机器人物理世界中的线速度与角速度,编写的任何代码都可以在具有ROS接口的任何基座控制器上工作。
基座控制器节点通常向称为/odom的话题上发布里程数据,然后监听/cmd_vel话题接收运动命令。所以在实验中,我们需要利用ROS提供的接口,往/cmd_vel话题上发送相应的运动命令。
3.3运动命令Twist
ROS向基座控制器发送运动命令使用的是Twist消息类型。话题的名称可以使用自定义的任何字母组成,但是通常我们使用/cmd_vel来命名与Twist相关的命令话题,/cmd_vel是“command velocities”的缩写形式。基座控制器节点订阅/cmd_vel话题,然后将话题上的Twist消息转换为机电信号,驱动机器人轮子转动。
如果我们想要发送命令控制机器人运动,更重要的就是要了解发送的消息消息类型,即Twsit,下面展示了Twsit消息详细的定义。
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
可以看出的是,Twist消息由两部分的子消息构成,每一个子消息都是一个三维向量。一个代表线速度分量,一个代表角速度分量。对于一个在二位平面(如地板)中操作的差速驱动机器人,我们只需要线速度的x分量和角速度的z分量。这是因为对于只能在二位平面运动的这类机器人,他只能沿着纵轴前后运动,或者围绕其垂直轴旋转。所以,机器人的线速度分量y和z永远都为零,角速度的x轴和y轴也都为零。
假设我们想让机器人以每秒0.1米的速度向前运动,那么我们可以在命令行指定Twist命令如下格式:‘{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}’;
如果我们想让机器人以每秒1弧度的速度逆时针旋转,那么我们可以在命令行指定Twist命令如下格式:‘{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}’
如果让机器人直行的同时左旋,同时设置x和z两个参数即可。

4 基于ROS图像采集

4.1 ROS中图像处理的相关类库
研究图像处理,计算机视觉,3D重构,离不开开源的库,利用现成的,已开发好的库,可以高效、快速地构建自己的视觉应用。下面,给大家简单介绍几个常用的相关库:
1.OpenCV(Open Source Computer Vision Library):搞计算机视觉和图像处理的不能不提到这个库,里面有大量图像处理,视觉,机器学习的算法,并且不断壮大,更新当中。
2.PCL(Point Cloud Library):PCL是一个开源、跨平台的点云处理库,基于BSD协议,可免费用于商业和研究应用,适用于Windows、Linux、MacOS、Android平台。PCL框架涵盖当前最先进的点云处理相关算法,涉及滤波、特征估计、表面重建、注册、模型拟合、分割等。支持3D摄像头。
3.OpenNI:用于3D感知,支持Kinect、ASUS Xtion Pro Live等3D摄像机。
4.ReconstructMe:3D实时感知、扫描系统。
5.PrimeSense:Kinect、ASUS Xtion Pro Live均使用PrimeSense的核心。这里有关于3D摄像机的各种知识,内容。
6.OpenKinect:Kinect的一个相关Wiki,有各种Kinect开发相关的内容。
7.Face:在线识别,检测人脸、表情等。现已经被facebook收购。

4.1 在ROS中使用Kinect摄像头
Kinect拥三个摄像头,中间的摄像头是 RGB 彩色摄影机,用来采集彩色图像。左右两边摄像头,其中一个是红外线发射器,负责发射红外光;另外一个是红外线CMOS摄影机,负责接收红外光,共同构成了3D结构的深度感应器。
使用kinect的一大优点就是可以获得传感器的深度数据,即传感器和物体的距离,并且可识别的范围区间是60cm-10m。3D结构的深度感应器用来采集深度数据(现实中物体与摄像头的距离)。彩色摄像头RGB采集到的数据是色彩数据,RGB彩色摄像头最大支持成像分辨率是1280960,红外摄像头采集到的数据是深度数据,红外摄像头最大支持成像分辨率是640480。我们通过调用ROS的image_view包来直接显示摄像头的数据库,便能通过Kinect得到一幅彩色图像和一幅深度图像(如图4.1所示)
在这里插入图片描述

                   图4.1 Kinect采集的彩色图像和深度图像

4.2 使用rviz显示图像
rviz是我们经常使用的ROS工具,把图像显示在rviz中才更有应用价值。rviz已经为我们提供好了显示图像的接口,使用起来非常简单。首先按照上一节的方法运行kinect节点,然后打开rviz: 使用命令rosrun rviz rviz。如图4.2添加示意图。
本项目中rviz中需要添加两个marker:pointcloud和camera。

在这里插入图片描述

                                    图4.2 添加示意图

camera创建一个以机器人视角的新窗口,窗口中显示的是图片,使用sensor_msgs/Image消息。显示一个点云数据,选项:描述模式,累积等,使用sensor_msgs/PointCloud2消息。

5 ROS中的Nodelet节点

ROS的数据通信是以XML-RPC的方式,在graph结构中以topic,service和param的方式传输数据,天生的数据交互存在一定的延时和阻塞。Nodelet 包就是改善这一状况设计的,使得多个算法运行在同一个过程中,并且算法间数据传输无需拷贝就可实现。详见http://wiki.ros.org/nodelet。简单的讲就是可以将以前启动的多个node捆绑在一起manager,使得同一个manager里面的topic的数据传输更快,数据通讯中roscpp采用boost shared pointer方式进行publish调用,实现zero copy。
5.1 Nodelet节点的特点
1 nodelets间数据传输zero copy,有效避免数据copy和网络传输代价。nodelet主要想要实现的功能是,在单台机器上的单个进程中,同时跑多个算法,且在消息传入进程时,该进程内的算法都可以获得消息而不需要复制。
2支持pulgin的方式动态加载。
3.使用C++ ROS的接口方式。
5.2 nodelet基类
1 定义基类nodelet::Nodelet,Nodelet的使用需要继承一个基类,需要注册插件,任何nodelet继承自它可以使用plugin的方式动态加载。
2 提供命名空间,参数可remap 。nodelet为了满足零复制成本,允许不同的算法动态加载到相同节点,然而他们各自的命名空间不同,因此看上去像是多个节点一样,但是他们的确是在同一个进程中。
3 nodelet的manager的过程可以加载更多的nodelets. 同一个manager过程的nodelet数据传输zero copy。Nodelet的主要应用对象是高吞吐量的数据流,像视频数据这种使用nodelet就比较合适。其中机器人实时跟踪模块就继承了nodelet。把他们放在同一个进程中防止信息的拷贝以及网络阻塞。

6 项目整体架构设计

6.1 项目整体架构
6.1.1 云应用框架
本课题中,我将云应用的架构分为两部分,第一部分是面向机器人的服务其中包括两方面的内容。一方面计算或存储任务,它位于云支撑平台上,负责对机器人上的复杂任务进行处理以及对机器人上的大量数据进行远程存储。另一方面是,位于机器人上的复杂数据采集以及计算存储任务上传和接收模块。
由机器人自主发起的运行流程为:
1)机器人采集环境信息
2)机器人向云服务请求计算/存储服务
3)云应用针对服务进行计算/存储
4)云应用返回服务结果/控制机器人动作
第二部分是面向用户的服务,由外界自主发起的运行流程为:
1)外界通过云端向机器人发起控制服务
2)针对控制服务进行计算
3)云应用控制机器人动作
这两个流程使得该云应用架构形成了基于服务面向控制的架构,如图6.1所示。

在这里插入图片描述

图6.1 云应用架构图

文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐