1、1,ROS - Robot Operating System: 现状与应用实例,李宝全,南开大学 :2014-7-3,南开大学首届机器人学博士生论坛,2,ROS- Robot Operating System,What & Why,现状,How & Results,几个应用例程,Sum- mary,综合实例:体感远程控制,3,应用火爆的ROS,ROS Repositories (50) Map:,4,应用火爆的ROS,Robotics & Automation Magazine, IEEE 该杂志上设立了专题讨论区:ROS Topics 下方图片是在最新一期中ROS Topics的论文,5,应
2、用火爆的ROS,新加坡南洋理工大学(NTU)机器人相关实验室大家都在用,已经形成了全民一起上的局面 所见的应用设备: Pioneer3AT/DX Kinect AR.Drone TurtleBot,6,ROS体系,Main:由Willow Garage公式维护核心部分程序Universe:全球范围的代码,由其它个人/组织维护相关知识库(Repository),即功能包(例如先锋机器人的ROSARIA,Kinect的openni_tracker, 语言识别pocketsphinx),7,几点说明,虽然ROS的名字为“机器人操作系统”,但不是真正的操作系统,只是说它可以提供类似于操作系统的一些服务
3、,比如底层通讯, 分布式控制。对于机器人的相关功能,不使用ROS也能实现. 但ROS使得机器人软件搭建的工作更方便,效率更高。,8,ROS的程序的核心,节点 即可执行文件 由.cpp文件编译生成而来(指C+)节点之间的通讯 节点间信息的发布与接收 Publish Subscribe,9,节点,将整个工程(Project)模块化,每个节点即为一个模块。 每个节点都可以单独维护,比如现在有N个节点已经在运行了,用户可以再编写第N+1个节点,然后编译,然后运行,即有N+1个节点共同运行。 每个节点有唯一的名字 节点之间可借助网络跨主机共同运行.,10,节点之间的通讯,发布者Publisher 订阅者
4、Subscriber 话题: 发布者与订阅者之间的通讯方式 话题的名称: Topic:发布者与订阅者之间数据传输“管道”的名字,为一字符串 消息: Message: 传输数据的类型,例如int, char,自定义类型。,11,ROS- Robot Operating System,What & Why,现状,How & Results,几个应用例程,Sum- mary,综合实例:体感远程控制,12,ROS的几个例程,Hello world 图像 先锋机器人P3AT/P3DX KinectSkeleton Voice Network通讯,13,Hello World程序,节点: 2个 节点tal
5、ker (talker.cpp) : 包含一个发布者 节点listener (listener.cpp) : 包含一个接收者 节点间的通讯: Topic(话题的名称):“chatter” Message(传递的数据类型):std_msgs:String String为 ROS自定义的数据类型 String中包含唯一变量为 std:string data,14,Hello World程序,15,Hello World程序,16,Hello World程序,17,Hello World程序,18,ROS的几个例程,Hello world 图像 先锋机器人P3AT/P3DX KinectSkelet
6、on Voice Network通讯,19,ROS的几个例程: 图像,图像的发布: 对应ROS中的Publisher. 以如下三个图像源举例: Kinect的RGB摄像头 笔记本内置摄像头 外接USB摄像头 图像的接收: 对应ROS中的Subscriber 图像的处理: 可以与OpenCV相结合 (OpenCV与ROS均属于Willow Garage公司, 所以.) 用户可以在该步骤中进行任意的图像处理操作(“so you can do everything in this step”) 图像的显示: 与OpenCV相结合,20,图像的发布: Kinect的RGB摄像头,首先对Kinect设备
7、进行配置, 并进行初始化 由于Kinect与ROS相互支持, 因此配置过程非常简便 初始化Kinect的过程就是发布一些列Topic的过程, 这些Topic包括: /camera/rgb/image_color: 该话题即对应于我们需要的RGB图像数据 至此图像发布的任务完毕 若想把图像显示出来, 需要进行下一节“图像的接收与显示” /camera/rgb/image_raw: RGB图像的原始数据 /camera/grey : 这是灰度图像 /camera/depth: 这是场景深度图像,21,图像的发布: Kinect的RGB摄像头,图: Rviz中显示出的Kinect发布的点云信息,22
8、,图像的发布: 笔记本内置摄像头,对于笔记本内置USB摄像头的图像获取, 要比Kinect复杂. 这是由于ROS对Kinect的支持包括了图像Topic的发布, 而对于计算机的内置/外置USB摄像头, 需要我们自己做些操作 下载usb_cam包: https:/ . 包含如下3个文件 /usb_cam.h /usb_cam.cpp: 由于是在Ubuntu (12.04)系统下进行的, 因此里面用到了Linux的V4L2视频驱动与服务 /usb_cam_node.cpp 摄像头的图像在此节点中发布,23,图像的发布: 笔记本内置摄像头,24,图像的发布: 外置USB摄像头,也需要利用包usb_c
9、am 由于外接USB摄像头的设备名为video1,因此将设备名的语句修改为除此之外, 其它操作与上一节的内置摄像头图像发布一致,25,图像的接收,处理与显示,ROS的图像数据使用sensor_msgs/Image的消息格式 CvBridge: 属于ROS的库, 在vision_opencv(堆stack) /cv_bridge(包package) /image_geometry中. 用以转换sensor_msgs/Image至cv:Mat 该部分功能: 从相应Topic中获得sensor_msgs:Image图像信息(接收者),并将其转化为cv:Mat的形式, 并显示图像。 当然, 该部分首先
10、需要图像源来发布一个图像Topic,例如上节的Kinect, 内置USB摄像头, 外接USB摄像头,26,图像的接收,处理与显示,27,图像的接收,处理与显示,28,图像的接收,处理与显示,上页的image_converter节点对应于图像发布源为Kinect, 若想要获得外置/内置摄像头的图像时, 将订阅者的Topic改为 “/image_raw”即可.改为因此将该节点修改后重新编译并运行, 便可以继续获取另一个图像源的图像. 这也体现了ROS的代码维护非常灵活.,29,图像的接收,处理与显示,30,ROS的几个例程,Hello world 图像 先锋机器人P3AT/P3DX KinectS
11、keleton Voice Network通讯,31,先锋机器人P3AT/P3DX,P3AT/P3DX的配置 角速度和线速度控制量的发布 控制量发布的节点: 对应Publisher 控制量的接收 控制量接收的节点: 对应Subscriber 即控制机器人的运动,32,P3AT/P3DX的配置,由于P3AT是串口通讯, 我的笔记本上仅有USB口, 因此首先需要配置USB转串口.安装ROSARIA ARIA是ActivMedia公司为先锋机器人提供的驱动与服务 由于该公司也支持ROS, 因此发布了ROSARIA版本,33,角速度和线速度控制量的发布,话题名称“/RosAria/cmd_vel“ 该
12、话题名称要与下一节接收节点中的一致消息类型为ROS自定义的: geometry_msgs:Twist 在该Twist数据结构中, 包括了角速度控制量与线速度控制量,34,角速度和线速度控制量的发布,35,控制量的接收,首先下载包rosaria: https:/ 该包中含有RosAria.cpp文件 将该文件编译为节点RosAria, 并运行该节点 节点RosAria的功能: 接收上节的Twist数据结构(即订阅者), Twist中含有角速度与线速度的数据. 将控制量发送给先锋机器人, 即让机器人做相应运动.,36,控制量的接收,37,ROS的几个例程,Hello world 图像 先锋机器人P
13、3AT/P3DX KinectSkeleton(人体骨骼识别) Voice Network通讯,38,KinectSkeleton,由于用到了Kinect的骨骼识别, 因此首先需要安装NiTE之后下载包openni_tracker: https:/ “/tf” Message为tf2_msgs:TFMessage, 一个TFMessage的对象包括了一个关节的位置与姿态信息,39,KinectSkeleton,40,KinectSkeleton,41,KinectSkeleton,图: Rviz显示出的发布的tf的信息,42,ROS的几个例程,Hello world 图像 先锋机器人P3AT/
14、P3DX KinectSkeleton Voice Network通讯,43,Voice,语音识别 语言发布 综合: 声音的接收与发声,44,Voice: 语言识别,包pocketsphinx的安装与配置 pocketsphinx用以语言识别, 并发布(Publish)识别结果String识别结果的接收与显示 将pocketsphinx发布的String其获取(Subscribe)后从屏幕上显示,45,Voice,46,Voice: 语言发布,包sound_play的安装与配置 利用程序来控制发声,47,Voice: 综合: 声音的接收与发声,利用pocketsphinx对语言进行识别, 并以
15、String的消息类型来发布 接收pocketsphinx发布的String 将String显示到屏幕上 发声: 将String朗读出来 当然也可以朗读其它语句, 即实现了人机之间的对话,48,Voice: 综合: 声音的接收与发声,49,ROS的几个例程,Hello world 图像 先锋机器人P3AT/P3DX KinectSkeleton Voice Network通讯,50,Network通讯(以两主机为例),ROS的分布式特点: 对两主机进行简单配置后, 若有相同的Topic, 则节点之间即可跨主机利用网络进行通讯. 因此网络通讯/控制变为十分简单. 实验场景: 取名为”hal”的电
16、脑上连接先锋机器人P3AT, 并连接Wifi 取名为”marvin”的电脑(我的笔记本)没有连接设备, 但与”hal”连接了同一个Wifi 目标: 让”marvin”将先锋机器人的控制命令通过Wifi发送给”hal”, 然后”hal”再把此命令发送给先锋机器人,51,Network通讯(以两主机为例),52,ROS- Robot Operating System,What & Why,现状,How & Results,几个应用例程,Sum- mary,综合实例:体感远程控制,53,ROS综合实例: 实验目标,通过网络, 远程控制机器人的运动 使用者在Kinect前移动, 当距离Kinect超过
17、1米时, 让远方的机器人做前进运动; 当距离Kinect小于1米时, 让机器人后退; 并且机器人的运动速度与使用着距Kinect 1米的误差成正比. 将上一章 “几个应用例程” 结合在了一起.,54,ROS综合实例: 实验场景,取名为”hal”的电脑上连接先锋机器人P3AT, 并连接Wifi取名为”marvin”的电脑(我的笔记本)连接了Kinect, 并与”hal”连接了同一个Wifi,55,ROS综合实例:实现方法,通过Kinect读取用户的骨骼位置(KinectSkeleton) 根据用户的头部位置, 主机“marvin”来设计P3AT的线速度量. 通过Wifi将机器人的速度控制量传到主
18、机“hal”上 “hal”将速度控制量发送到P3AT上,56,ROS综合实例: 框架,57,ROS综合实例: 视频展示,1_Kinetct-P3AT_TrackingPeople.mp4 2_ControlThroughNetwork.mp4 3_withMe 综合.mp4,58,总结与展望,总结 ROS的应用已非常火爆 介绍了ROS的几个典型应用, 并给出了一综合实例 展望 ROS整合了世界范围内的很多很强大的功能, 比如语言的识别与发布, 骨骼位置获取, 可以使机器人更智能. ROS的模块化特点, 使得代码易于维护 ROS本身是基于分布式的, 因此网络通讯/控制变为十分简单 ,59,Q & AThanks!,