博舍

机器人操作系统ROS 机器人 服务器

机器人操作系统ROS

同样,从个人微信公众号Nao(ID:qRobotics)搬运。

前言

先放一个ROSIndustrial一周年剪辑视频。

ROS已经发布八周年了,在国外科研机构中非常受欢迎。目前,以美国西南研究院为首的几位大佬开始尝试将ROS应用在工业机器人中,上面这个视频就是ROS-I项目一周年的进展情况。

为了说明讲清楚ROS,我就从ROS是什么,为什么使用ROS,如何使用ROS三个方面展开。

△出自今年《机器人视觉与应用》课程本人制作的课件

 

是什么

ROS是RobotOperatingSystem的缩写,原本是斯坦福大学的一个机器人项目,后来由WillowGarage公司发展,目前由OSRF(OpenSourceRoboticsFoundation,Inc)公司维护的开源项目。

1、首先是一个操作系统

根据wikipedia定义,OSissystemsoftwarethatmanagescomputerhardwareandsoftwareresourcesandprovidescommonservicesforcomputerprograms。也就是说操作系统是用来管理计算机硬件与软件资源,并提供一些公用的服务的系统软件。而ROS也自称是一个OS。

△计算机OS与机器人OS对比示意图

如上图所示,计算机的操作系统将计算机硬件封装起来,而应用软件运行在操作系统之上,不用管计算机具体应用的是什么类型的硬件产品。这能大大提高软件开发效率(否则大家只能都写汇编了)。

同理,ROS则是对机器人的硬件进行了封装,不同的机器人、不同的传感器,在ROS里可以用相同的方式表示(topic等),供上层应用程序(运动规划等)调用。

 

2、是一种跨平台模块化软件通讯机制

ROS用节点(Node)的概念表示一个应用程序,不同node之间通过事先定义好格式的消息(Topic),服务(Service),动作(Action)来实现连接。

△ROS分布特点

△三种通讯方式的特点

三种通讯方式的优缺点可看上表,由于很多模块化编程工具都有类似功能,这里就不具体展开了。

基于这种模块化的通讯机制,开发者可以很方便地替换、更新系统内的某些模块;也可以用自己编写的节点替换ROS的个别模块,十分适合算法开发。

此外,ROS可以跨平台,在不同计算机、不同操作系统、不用编程语言、不同机器人上使用。

 

3、是一系列开源工具

△几种ROS工具示意图:左上rqt_plot,右上rqt_graph,左下Rviz,右下TF

如上图所示,ROS为开发者提供了一系列非常有用的工具,可以大大提高我们开发的效率。

rqt_plot:可以实时绘制当前任意Topic的数值曲线;

rqt_graph:可以绘制出各节点之间的连接状态,和正在使用的Topic等;

TF:TF是Transform的简写,利用它,我们可以实时知道各连杆坐标系的位姿,也可以求出两个坐标系的相对位置。

Rviz:超强大的3D可视化工具,可以显示机器人模型、3D电影、各种文字图标、也可以很方便二次开发;

△在Rviz里显示机器人模型、3D点云、物体模型等

△在Rviz里也可以实现方便交互功能

除此之外,ROS还有很多其他有用的开源工具等待大家探索。

 

4、是一系列最先进的算法

△ROS包含许多先进的机器人开源项目

除了ROS之外,世界上已经有很多非常优秀的机器人开源项目,但是ROS正逐渐将它们一一囊括在自己的范畴里。例如:

PS:我跟ROS的其他几个开发者也正在努力将LinuxCNC整合进ROS

OROCOS:这个开源项目主要侧重于机器人底层控制器的设计,包括用于计算串联机械臂运动学数值解的KDL、贝叶斯滤波、实时控制等功能。

OpenRave:这是在ROS之前最多人用来做运动规划的平台,ROS已经将其中的ikfast(计算串联机械臂运动学解析解)等功能吸收。

Player:一款优秀的二维仿真平台,可以用于平面移动机器人的仿真,现在在ROS里可以直接使用。

OpenCV:大名鼎鼎的机器视觉开源项目,ROS提供了cv_bridge,可以将OpenCV的图片与ROS的图片格式相互转换。

OMPL:现在最著名的运动规划开源项目,已经成了MoveIt的一部分。

Visp:一个开源视觉伺服项目,已经跟ROS完美整合。

Gazebo:一款优秀的开源仿真平台,可以实现动力学仿真、传感器仿真等,也已被ROS吸收。

△左下角gazebo,右下角Rviz

当然,除了吸收别的优秀开源项目,ROS自己也发展出许多非常优秀的项目和库。

ORK:一个物体识别与位姿估计开源库,包含LineMod等算法,但实际使用效果还不是太理想。

△LineMod识别效果

PCL:一个开源点云处理库,原本是从ROS中发展起来的,后来由于太受欢迎,为了让非ROS用户也能用,就单独立了一个PCL的项目。

Gmapping:这其实是在OpenSlam项目继承过来的(后来发展和改动较大),利用gmapping可以实现laser-basedSLAM,快速建立室内二维地图。

△gmapping建立二维地图

Localization:基于扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)的机器人定位算法,可以融合各种传感器的定位信息,获得较为准确的定位效果。

△robot_localization示意图

Navigation:基于Dijkstra、A*算法(全局规划器)和动态窗口法DWA(局部规划器)的移动机器人路径规划模块,可以在二维地图上实现机器人导航。

△navigation示意图

MoveIt:这个是专注于移动机械臂运动规划的模块,下次讲运动规划入门的时候再详细介绍它。

△MoveIt对UR5进行运动规划

当然,除了这些最先进算法外,ROS还有各种机器人、传感器驱动等内容。

 

5、是一个最活跃的机器人开发交流平台

个人认为,这应该是最重要的一点。除了ROS外,现在有需要其他的项目可以代替或者部分代替ROS的功能:OpenRave运动规划,V-rep仿真。但是这些项目的社区远没有ROS活跃。

ROS版本定期更新、主要模块有专人维护、问答区活跃、各maillists也非常活跃、开发者非常热衷交流分享。如果深入到ROS社区,可以学到很多东西。

 

为什么

首先,用过工业机器人的人肯定知道,不同工业机器人的开发系统基本都不一样,示教、编程方法也不同,一个熟练使用Motoman的工程师很可能并不会使用Kuka机械臂。就算是同种机器人,由于固件版本的更新换代,也可能造成程序的不兼容(我在UR上就遇到过这个问题)。这就大大影响了机器人的推广普及。

△左:不同机器人的示教器;右:UR固件版本不兼容

对此,ROS可以用统一的方式来封装机器人(URDF模型+机器人驱动),用户只需要在ROS中编写应用程序,并不用关心机器人的控制方式。如果所有机器人都采用了这种方式,那么机器人必将得到更广泛地应用(对系统集成商的要求会降低)。其次,现在越来越多机器人厂商开始尝试使用ROS,包括占据最多工业市场份额的机器人四大家族和各种流行的研究型机器人;甚至有如Rethink的Baxter,只能使用ROS控制。研究机器人的如果不去学习ROS的话,以后可能就会面临不会使用机器人的问题。

△使用ROS的机器人

再者,机器人是一个复杂且涉及面极广的学科,从下往上包括机械设计、电机控制、传感器、轨迹规划、运动学与动力学、运动规划、机器视觉、定位导航、机器学习、高级智能等等。一个研究生基本不可能在几年时间内掌握所有领域。

对于一个做上层规划的研究生,如果不用ROS的话,往往需要花费非常长时间用于搭建实验系统,从而大大挤压了真正用在发明新知识的时间。例如,我做运动规划,就必须先把机械臂运动学正逆解、物体识别算法、碰撞检测算法等完成才有可能开始做运动规划。造轮子的事就交给专业造轮子的人做吧。

所以,对于科研人员来说,ROS可以帮助你快速搭建机器人软件系统,同时其模块化的设计可以让你方便地用自己的算法替换其中某一模块,让你专注于自己的研究点。

最后,就是对于创业或者参加比赛的人来说,ROS可以帮助你快速搭建原型样机。原型样机出来了,自然比只有设计说明书的人有优势。为防止做广告嫌疑,创业的例子就不说了,就拿我们去年参加的一个创业大赛来讲。我们组四个人用了不到两个月时间完成了下面这个超市购物机器人的软硬件设计与制作,功能包括避障、防跌、人员跟随、蓝牙校正(跟踪对的人)、手势识别、商品自动计价、自动支付等。

嗯,我的公众号Nao(qRobotics)的头像就是在这个项目时设计的。

△去年参加某创业大赛的作品MarketBot

 

如何

这方面已经可以找到很多答案了,但是学习这种东西只能靠自己多练习了,我只简单从我个人角度给出几个建议吧。

首先,就是要先了解ROS的基本架构和开发方式。我个人是强烈推荐直接看ROS官网上的教程ROS/Tutorials的BeginnerLevel(多看几遍),同时充分使用ROS的问答社区ROSAnswers与各模块的MailLists,很多基础问题可能前人都遇到过。

其次,在了解ROS的基本架构与开发方式后,就可以有针对性地看自己所关心的部分了。如做移动机器人的同学就去看Navigation教程;做物体识别的就去看ORK教程;做运动规划的就去看MoveIt教程。这一步最好能跟有实际机器人练手(如果没有的话,就用gazebo仿真)。由于一些模块的教程不够清楚(如MoveIt),一定要多练习,甚至是去看部分源码,先保证自己会用ROS实现一些功能。

对于ROS与实际机器人的连接,建议仔细看看action(编写机器人驱动package)、URDF(机器人描述文件)的教程(或者ros_control)。如下图,我为SDA5F机器人编写了URDF文件,并修改了motoman_driver中的action,使得在ROS环境中用MoveIt规划控制双臂机器人运动。

△SDA5F双臂机器人与其URDF模型

最后,就是进阶阶段了。我要强调一句“ROS只是一个工具”,你会用ROS做SLAM并不能说明你会做SLAM。对于自己研究的内容,必须沉下心去看教材和论文,去理解每种算法背后的原理,知道如何调整算法参数、如何改进算法,最终能够自己编写某部分代码,并替换ROS的相应模块(如自己写运动学正逆解替代KDL等)。做研究,交流非常重要。如果你改进ROS某一算法后,最好能与package的原作者交流,将自己的修改merge到原项目中,在交流中提高自己与package的水平。当然,如果对算法有疑问,也可以直接咨询作者,ROS里的贡献者大都非常愿意分享和交流。

当然,在问别人之前,请一定要保证自己充分熟悉了官方Tutorials,而不是朝别人发一堆编译错误截图,然后问这是怎么回事。提问的艺术真的非常重要,有时候不是对方不愿意跟你交流,而是对方不愿意手把手带你过Tutorials。

 

结尾

很多人在争论是否应该使用ROS、是否应该在产品上使用ROS、是否应该在工业中使用ROS。但是从我个人的角度上看,ROS对于服务机器人上层算法开发和研究而言是一个很棒的工具,作为学术研究使用的话,可以大大加快实验平台搭建过程。

有问题和意见欢迎大家直接在下面留言。

【备注:所有带公众号“qRobotics”水印的图片版权归本人所有,未经允许,不得转载。】

欢迎扫描下方二维码关注我的微信公众号Nao(ID:qRobotics),博客会比公众号迟推送一周左右。

UR机器人通信端口和协议

1概述

UR机器人作为目前使用广泛的协作机器人,其开放了基于TCP/IP的远程控制功能,提供了多个多类型的端口,用于工业总线控制,或者用户自行编程控制,以下记录整理此方面的信息。

2UR机器人通信2.1UR通信协议

UR机器人可通过TCP/IP通信,向机器人发送控制命令,以及从机器人获取状态信息。

2.2UR通信端口

UR机器人通信时提供了以下接口,我们可以根据自己需要,使用其中的一种或多种。表1机器人作为服务器的通信端口

端口端口描述502ModbusTCP协议,机器人作为服务器22SSH/SFTP(安全文件传输协议)29999Dashboard功能30001第一客户端端口,自动返回机器人状态与补充消息30002第二客户端端口,自动返回机器人状态与消息30003实时反馈端口,自动返回机器人状态与消息,125Hz实时反馈接口

表2机器人作为客户端的通信端口

端口端口描述自定义由UR脚本函数定义502ModbusTCP协议,机器人作为客户端3UR机器人通信端口类型3.1ModbusTCP端口(502端口)

Modbus是OS模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户端/服务器通信,互联网组织保留系统端口502访问Modbus,Modbus是一个请求/应答协议,并且提供功能码规定的服务。UR机器人既可以作为ModbusTCP服务器,也可以作为ModbusTCP客户端,两者的主要区别在于消息请求方的不同。通过UR机器人的相关Modbus地址,我们可以访问机器人的很多信息,进而可以在上位机上解析这些信息并显示。下表为Modbus地址

地址类型描述0-33Register可以访问机器人的所有IO128-255Register可配置寄存器256-265Register机器人状态270-315Register关节位置、速度、电流、温度、模式等信息400-425RegisterTCP位置、速度、偏移等信息768-770Register工具端状态0-159Bit可以访问机器人的所有IO260-265Bit机器人状态

示例:本人利用502端口实现了TCP/IP协议的UR控制和状态读取,见文章:《第一次编程操作UR10协作机器人的记录》,其中简单介绍了Modbus命令的构造,并使用260、270、400三个地址读取UR状态和位置信息。

3.2Dashboard端口(29999端口)

上位机可以通过29999端口直接发送一些简单的指令给机器人,这些指令是UR自己定义的,这种功能被称为Dashboard。我们可以通过一些Dashboard指令,远程切换、加载程序,同时可以启动、暂停、停止程序,实现上位机对UR的远程控制。

3.3上位机编程端口(30001/30002/30003端口)

UR机器人提供了这三个端口,用于远程控制编程。其功能如下表所示

端口名称功能30001第一客户端端口客户端可发送脚本代码至服务器,服务器自动以5Hz的频率返回机器人状态与补充消息到客户端30002第二客户端端口客户端可发送脚本代码安全文件传输协议,服务器自动以5Hz的频率返回机器人状态与消息到客户端30003实时反馈端口客户端可发送脚本代安全文件传输协议,服务器自动以125Hz的频率返回机器人状态与消息到客户端3.3.1URScript简介

UR机器人有3种编程方式:Polyscope编程、脚本编程以及C-API编程:

Polyscope编程:指的是程序在示教器上被编辑,机器人然后执行,这是UI层的编程方式;C-API编程:是在研发层上的编程方式;脚本编程:URScript,是UR公司在Python语言基础上,自己研发的语言,是在脚本层上控制机器人的编程语言,我们使用的主要是这种脚本编程。3.3.2机器人的控制

上位机作为客户端,通过30001/30002/30003其中一个特定的编程端口,与机器人控制器建立TCP/IP连接,就可以在上位机上按照URScript语言格式编写脚本程序,直接发送给机器人控制器,机器人就可以执行相应动作了。示例:本人利用30003端口实现了TCP/IP协议的UR控制,见文章:《第一次编程操作UR10协作机器人的记录》,其中介绍了三个常用URScript指令,即MOVEL、MOVEP、STOPL,并利用其实现了UR的运动控制。

3.3.3机器人状态读取

30001~30003这三个端口共同特点是,一旦客户端打开端口,就会按照一定的频率收到来自机器人的信息,30003端口是实时反馈端口,客户端每8ms(125Hz)就收到一次来自机器人的信息。而其它两个端口只能每200ms(5Hz)收到一次来自机器人的信息。客户端通过这三个端口收到的机器人信息稍有不同,通过30003端口收到的信息是最丰富的,包含了通过30001和30002收到的大部分信息。因此,通过实时反馈端口30003,客户端收到机器人的信息频率是最高的,内容也是最全的。按照参考文献说法:通过30003每次收到的数据包是1044个字节,以标准格式排列,极少数情况下客户端会收到小于1044个字节。经个人实际测试,30003端口每次会收到1108字节,与上述描述稍有不同,本人试图解析了这些信息,限于篇幅,下一篇文章“UR机器人返回信息格式解析“详细介绍30003端口返回信息的解析。

4一个概念——TCP

另外需要说明一点的是,在UR控制里出现了两个TCP概念,要注意区分(刚接触UR时,看示教器和说明书,很迷糊了一阵子,所以这里说明一下,有同样疑惑的可以参考)

网络协议的TCP:网络协议中TCP/IP的含义是TransmissionControlProtocol/InternetProtocol;UR的TCP:含义是ToolCenterPoint,指的是机器人工具的中心点,TCP位置指的是机器人工具中心点位置,同理TCP坐标系,指的是固连在机器人工具终端的坐标系。参考文献

https://wenku.baidu.com/view/c78aa35c0722192e4436f61c.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇