ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版)
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo
1. 前言 :
Hello world 程序,在我们编程界,代表学习某种语言编写的第一个程序。对于 ROS 机器人 *** 作系统来说握乱,这个 Hello World 程序就是 : 写一个简单的消息发布器(发送) 和 订阅器(接收)。
2. 准备工作 :
C++ 的程序都会存放在每个程序包的 src 文件夹里。 Python 不同,Python 程序都存放在 scripts 文件夹中, 反正意思都是 源文件 包。
Step 1 . 所以,先在 beginner_tutorials 软件包中创建一个 scripts 文件夹:
$ roscd beginner_tutorials$ mkdir scripts$ cd scripts123
3. 编写消息发布器节点程序:
如果你懒得去写的话,你可以使用 wget 命令, 在 github 上获取一个 talker.py 源代码。如何获取呢 ?
Step 2 . 开一个终端,输入下面的命令就可以获取 talker.py :
$ wget
-devel/rospy_tutorials/001_talker_listener/talker.py$ ls
talker.py123
但是我建议你亲自动手,写一写:手动创建一个 talker.py 文件在 /scripys 文件夹里:
$ roscd beginner_tutorials/scripts$ gedit talker.py12
将这上面链接里的代码手动输入到 talker.py 文件中。(我就不将代码贴上来了)
下面我来讲解一下代码:
Step 3 . 最后一步,给这个 talker.py 文件加上可执行权限:
$ chmod +x talker.py1
这样,一个发布器就编写完了。我们不要急着去运行它,现在我们编写一个订阅器,来接收这个发布器发布的话题:
4. 编写消息订阅器节点程序:
Step 4 . 和发布器一样,我们使用wget命令获取订阅器的源代码 listener.py:
$ roscd beginner_tutorials/scripts/$ wget
ials/indigo-devel/rospy_tutorials/001_talker_listener/listener.py$ ls
listener.py talker.py1234
但是,我还是雀皮前建议你自己动手写一下。
好吧,下面我们开始讲解 listener.py 里面的代码,这个listener.py程序的代码简单:
Step 5 . 最后不要忘了给这个listener.py 加可执行权限:
$ chmod +x listener.py1
5. 运行 :
对于python 来说,我们不需要使用 catkin_make 命令对 ~/catkin_ws 工作空间进行编译。因为python文件本身就是可执行文件(前提是我们给它添加可执行权限)。
OK,发布器 和 订阅器 都创建完了。下面我们运行它们,看看效果:
Step 6 . 新打开一个终端,先执行 roscore 命令:
$ roscore1
Step 7 . 新打开一个终端,启动 发布器 :
$ rosrun beginner_tutorials talker.py 1
Step 8 . 新打开一个终端,启动 订阅器 :
$ rosrun beginner_tutorials listener.py 1
运行效果:
Step 9 . 我们来使用 rostopic list ,看看当前的话题有哪些:
$ rostopic list
/chatter
/rosout
/rosout_agg1234
其中 /chatter 就是我们在发布器里面发布的 ROS话题。
6. 扩展,编写一个启动脚本文件 :
还记得上一顷清节,我们讲的ROS的启动脚本文件吧,下面我们来编写一个launch文件,来将 talker.py 和listener.py 文件的启动工作交个这个launch文件来做:
Step 10 . 来到 beginner_tutorials程序包的 /launch 路径下,新建一个 hello_world_topic.launch 文件:
$ roscd beginner_tutorials/launch$ gedit hello_world_topic.launch #使用你自己喜欢的文本编辑器12
Step 11 . 输入下面的代码:
<launch>
<node pkg="beginner_tutorials" name="talker" type="talker.py" />
<node pkg="beginner_tutorials" name="listener" type="listener.py" /></launch>1234
Step 12 . 现在,将之前打开的终端都关闭,我们启动这个脚本: (开一个终端 : Ctrl+Alt+T)
$ roslaunch beginner_tutorials hello_world_topic.launch1
运行结果:
上面截图的输出显示: talker.py 和 listener.py 脚本运行成功。但是并没有出现刷屏的现象。这是为什么? 为了证明这个脚本程序真的成功的运行了,我们来试一试:
Step 13 . 重新开一个终端,输入下面的命令:
$ rosrun list$ rostopic list$ rostopic echo /chatter123
Step 14 . 现在 Ctrl+C 结束监听 /chatter 话题。使用 rqt_graph 对当前启动的节点可视化:
$ rqt_graph1
这些足以说明,hello_world_topic.launch 启动脚本文件,启动成功。
总结: 发布器 和 订阅器 是很简单的, 就是简单的发布一个 自定义的话题。
我之前使用说过:节点之间通讯的方式有两种 : 话题(rostopic) 和 服务(rosservice)
所以,接下来,我们会讲:使用ROS服务来完成ROS版 Hello World 程序的例子。但是在这之前,我们需要学一学:如何创建自定义的ROS消息和ROS服务,以便 ROS 服务版的 Hello World 程序的编写。
所以下一讲,我们来学习:如何创建自定义的ROS消息和ROS服务。
人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。当今人工智能主要是利用电子技术成果和仿生学方法,从大脑的结构方面模拟人脑的活动,即结构模拟。下面我带大家一起看看2017年计算机人工智能的热门好书有哪些:
1、《Arduino机器人制作指南》 Gordon McComb 科学出版社
《Arduino机器人制作指南》是一本机器人科技入门的“大百科全书”,不仅系统地讲解基于Arduino的机器人编程技术,还详细介绍机器人科技必涉的传感器技术、运动控制技术、人工智能技术等。
2、《PVCBOT超简单机器人设计与制作》 梁玮 人民邮电出版社
PVCBOT是难得的团队,几年来非常专心执着的开发基础在PVC的机器人教材,给很多爱好者和小朋友带来欢乐和新知识。这本新书持续的这个精神,带来更进阶的愉快和知识!——国内第一个创客空间——新车间创始人 李大维
3、《机器人技术入门》 魏巍 化学工业出版社
《机器人技术入门》一书图文并茂,是一本实用性比较强的入门级图书。主要具有以下特点:简化基础理论知识,注重图书的实用性和先进性。介绍了机器人技术的基本原理,以及机器人发展历史、应用分类、技术特点、模型及控制等内容。
4、《群体智能与多Agent系统交叉结合》 唐贤伦 科学出版社
《群体智能与多Agent系统交叉结合——理论、方法与应用》可以为信息科学、自动化技术等领域从事智能优化、计算智能、多Agent系统、多机器人协作研究的.相关专业技术人员提供参考,也可以作为相关专业的本科生、硕士生、博士生、教师教材。
5、《ROS机器人程序设计》 马丁内斯 机械工业出版社
国内首本引进ROS机器人程序设计的译著,让你全面了解 ROS系统的各种工具。提供了各种实际的示例代码供读者学习和理解ROS的软件框架。本书可以帮助读者从对ROS一无所知到能够通过ROS系统完成小型机器人系统的开发和编程工作。
6、《机器人学及其智能控制》 郭彤颖,安冬 人民邮电出版社
《机器人学及其智能控制》系统地介绍了机器人的基本组成、工作原理和应用实例,内容涉及机器人技术的发展简史、工业机器人的运动学和动力学禅羡、机器人控制技术、用于机器人的各种传感器、机器人轨迹规划、移动机器人的定位与导航,以及机器人在工业领域和服务领域的应用。
7、《绝衫Fluent14.5流贺宏拍场分析从入门到精通》 胡仁喜 机械工业出版社
《Fluent14.5流场分析从入门到精通》全面介绍了FLUENT 14.5流场分析的各种功能和基本 *** 作方法。全书共分为12章,分别介绍了流体力学基础、GAMBIT基础知识、FLUENT基础知识、Tecplot软件、二维流动和传热的数值模拟、三维流动和传热的数值模拟、湍流模型模拟、多相流模型模拟、滑移网格模型模拟、动网格模型模拟、组分传输与气体燃烧的模拟和UDF使用等知识。
8、《机器视觉》 伯特霍尔德·霍恩 中国青年出版社
《机器视觉》:这本书是计算机视觉的“圣经”!如果任何人想要学习计算机视觉的基本内容,一定要以这本书作为起始点。千万不要错过!尤其是,这本经典著作对于书中概念的杰出的介绍方法。我强烈地将这本不可或缺的书推荐给所有学习计算机视觉的人。
9、《机器人创新设计》 景维华,曹双 清华大学出版社
景维华、曹双编著的《机器人创新设计——基于慧鱼创意组合模型的机器人制作》以慧鱼模型为基础,希望帮助青少年爱好者踏入机器人创新制作的大门,培养青少年对科学与工程学科的兴趣,发掘青少年的创新潜能。
10、《机器学习系统设计》 里彻特 人民邮电出版社
《机器学习系统设计》是实用的Python机器学习教程,结合大量案例,介绍了机器学习的各方面知识。《机器学习系统设计》不仅告诉你“怎么做”,还会分析“为什么”,力求帮助读者掌握多种多样的机器学习Python库,学习构建基于Python的机器学习系统,并亲身实践和体验机器学习系统的功能。
最近几年各种移动机器人开始涌现出来,不论是轮式的还是履带式的,如何让移动机器人移动都是最核心的工作。要让机器人实现环境感知、机械臂控制、导航规划等一系列功能,就需要 *** 作系统的支持,而ROS就是最重要的软件平台之一,它在科研领域已经有广泛的应用。不过有关ROS的书籍并不多,国内可供的学习社区就更少了。本期硬创公开课就带大家了解一下如何利用ROS来设计移动机器人。分享嘉宾李金榜:EAI科技创始人兼CEO,毕业于北京理工大学,硕士学位。曾在网易、雪球、腾讯技术部搏改有多年linux底层技术研发经验。2015年联合创立EAI科技,负责SLAM算法研发及相关定位导航软件产品开发。EAI科技,专注机器人移动,提供消费级高性能激光雷达、slam算法和机器人移动平台。移动机器人的三个部分所谓的智能移动,是指机器人能根据周围的环境变化,自主地规划路线、避障,到达目标地。机器人是模拟人的各种行为,想象一下,人走动需要哪些器官的配合?首先用眼睛观察周围环境,然后用脑去分析如何走才能到达目标地,接着用腿走过去,周而复始,直到到达目标地址为至。机器人如果要实现智能移动,也需要眼、脑和腿这三部分的紧密配合。腿“腿”是机器人移动的基础。机器人的“腿”不局限于类人或类动物的腿,也可以是轮子、履带等,能让机器人移动起来的部件,都可以笼统地称为“腿”。类人的腿式优点是:既可以在复杂路况(比如爬楼梯)下移动、也可以更形象地模仿人的动作(比如跳舞),缺点是:结构和控制单元比较复杂、造价高、移动慢等。所以大部分移动的机器人都是轮式机器人,其优势在于轮子设计简单、成本低、移动快。而轮式的也分为多种:两轮平衡车、三轮、四轮和多轮等等。目前最经济实用的是两个主动轮+一个万向轮。眼睛机器人的眼睛其实就是一个传感器。它的作用是观察周围的环境,适合做机器人眼睛的有激光雷达、视觉(深度相机、单双相机)、辅助(超声波测距、红外测距)等。“脑”机器人的大脑就负责接收“眼睛”传输的数据,实时计算出路线,指挥腿去移动。其实就是要把看到的东西转换为数据语言。针对如何描述数据,如何实现处理逻辑等一系列问题。ROS系统给我们提供一个很好的开发框架。ROS简介ROS是建立在linux之上的 *** 作系统。它的前拿孙身是斯坦福人工智能基敏判实验室为了支持斯坦福智能机器人而建立项目,主要可以提供一些标准 *** 作系统服务,例如硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理。ROS是基于一种图状架构,从而不同节点的进程能接受、发布、聚合各种信息(例如传感,控制,状态,规划等等)。目前ROS主要支持Ubuntu *** 作系统。有人问ROS能否装到虚拟机里,一般来说是可以的,但是我们建议装个双系统,用Ubuntu专门跑ROS。实际上,ROS可以分成两层,低层是上面描述的 *** 作系统层,高层则是广大用户群贡献的实现不同功能的各种软件包,例如定位绘图,行动规划,感知,模拟等等。ROS(低层)使用BSD许可证,所有是开源软件,并能免费用于研究和商业用途,而高层的用户提供的包则使用很多种不同的许可证。用ROS实现机器人的移动对于二维空间,使用线速度+角速度可以实现轮式机器的随意移动。线速度:描述机器人前后移动的速度大小角速度:描述机器人转动的角速度大小所以控制机器人移动主要是要把线速度角速度转换为左右轮的速度大小,然后,通过轮子直径和轮间距,可以把线速度和角速度转化为左轮和右轮的速度大小。这里有一个关键问题就是编码器的选择和pid的调速。编码器的选择:一般编码器和轮子是在一个轴上,目前来说,速度在0.7m/s以下的话,编码器选600键到1200键之间都ok。不过需要注意的是,编码器最好用双线的,A、B两线输出,A向和B向输出相差90度,这样可以防抖动。防抖动就是可以在之后里程计算时可以更准确。左轮和右轮的速度大小的控制,通过轮子编码器反馈,通过PID实时调整电机的PMW来实现。实时计算出小车的里程计(odom),得到小车移动位置的变化。计算车的位置变化是通过编码器来计算的,如果轮子打滑等情况,那么计算的变化和实际的变化可能不同。要解决这个问题,其实是看那个问题更严重。要走5米只走了4.9米重要,还是要走180度只走了179度重要。其实角度的不精确对小车的影响更大。一般来说,小车的直线距离精确度可以控制在厘米范围内,在角度方面可以控制精准度在1%~2%。因为角度是比较重要的参数,所以很多人就用陀螺仪来进行矫正。所以有时候大家问小车精度有多高?其实现在这样已经精度比较高了,难免打滑等问题,不可能做到百分之百的精准。小车在距离和角度方面做到现在这样对于自建地图导航已经是可以接受的,要提高更高的精度可能就要其他设备辅助,比如激光雷达来进行辅助,激光雷达可以进行二次检测进行纠正。激光雷达数据的存储格式,它首先会有一个大小范围,如果超出范围是无效的。还有就是有几个采样点,这样就可以激光雷达可以告诉你隔多少度有一个采样点。另外最后那个Intensities是告诉大家数据的准确率,因为激光雷达也是取最高点的数据,是有一定的准确率的。上面的ppt其实就是用激光雷达扫了一个墙的形状。激光雷达扫出一个静态形状其实没有意义,雷达建图的意义其实在于建立房间的地图。如何绘制地图?第一步是收集眼睛数据:针对激光雷达,ROS在sensor_msgs包中定义了专用了数据结构来存储激光消息的相关信息,成为LaserScan。它指定了激光的有效范围、扫描点采样的角度及每个角度的测量值。激光雷达360度实时扫描,能实时测出障碍物的距离、形状和实时变化。第二步就是把眼睛看到的数据转化为地图:ROS的gmapping把激光雷达的/scan数据转换为栅格map数据,其中黑色代表障碍物、白色代表空白区域,可以顺利通行、灰色:未知领域。随着机器人的移动,激光雷达可以在多个不同方位观测同一个位置是否有障碍物,如果存在障碍物的阈值超过设置值是,就标定此处是存在障碍物;否则标定不存在障碍物。把障碍物、空白区域和未知领域的尺寸用不同灰度表示出来,就是栅格地图。便于下一步定位和导航。有时候会出现很直的墙,机器人却无法直着行走,这时的问题可能就是机器人的轮子出现打滑等其他问题,而走歪了,这时绘制出的地图也可能是歪的。这种情况可以通过加一个陀螺仪来避免这个情况。因为激光雷达的特性,有时候遇到黑色或镜面会导致测距不准。目前的解决方法就是不用激光雷达,或者用激光雷达和超声波进行辅助处理。ROS的地图是分多层的,我可以在不同高度放多台激光雷达来一起叠加,共同绘制一张地图。地图绘制结束之后,就可以进行定位和导航等工作。如何定位和导航?定位:其实是概率性的定位,而不是100%的精度。根据激光雷达扫描周围障碍物的形状,与地图的形状做匹配,判断机器人所在位置的概率机器人的定位是否成功,与地图特征有很大关系,如果区域特征明显,那么机器人就很容易判断自己的位置。如果出现难以定位的问题,可能需要人给指定初始位置,或者加led来进行位置识别,或者其他的定位设备来协助定位。目前的视觉通过色彩或者光的技术越来越多。导航:全局路径规划+局部调整(动态避障)导航其实就是全局定位,首先根据现有地图进行规划,但是在运行过程中会进行局部的路线规划。但是总体还是根据全局路径来走。导航中工作量还很大,比如扫地机的路径规划和服务机器人的路径规划是不一样的,扫地机器人可能要全覆盖的有墙角的地图,而服务机器人主要围绕指定的路径或者最短路径来进行规划,这部分是ROS工作量最大的一块。路径规划根据不同应用场景变化比较大,但是ROS提供基础的路径规划的开发包,在这个基础上我们会做自己的路径规划。机器人描述和坐标系变换在导航时,哪些区域可以通过,取决于机器人形状等信息,ROS通过URDF(UnifiedRobotDescriptionFormat)就是描述机器人硬件尺寸布局,比如轮子的位置、底盘大小、激光雷达安装位置,这些都会影响到坐标系的转换。坐标系遵循的前提是每个帧只能有一个父帧,再往上进行一些眼神或者关联。激光雷达的安装位置直接影响/scan输出数据。所以激光雷达和机器人的相对位置是需要做坐标变换,才能把激光雷达的数据转化为机器人视角的数据。ROS的坐标系,最终归结为三个标准框架,可以简化许多常见的机器人问题:1)全局准确,但局部不连续的帧(’map”)2)全局不准确,但局部光滑框架(’odom”)3)机器人自身框架(’base_link”)多种传感器(像激光雷达、深度摄像头和陀螺仪加速度计等)都可以计算base_link和odom的坐标关系,但由于“每个帧只能有一个父帧”,所以只能有一个节点(比如robot_pose_ekf融合多传感器)发布base_link和odom的坐标关系。Baselink自身的坐标系,因为不同元件装在机器人上不同位置,都要对应到baselink的坐标系中,因为所有的传感器都是要通过机器人的视角来“看”。有些朋友问我,激光雷达在建地图的时候,小车移动后地图就乱了,这是因为小车的底盘坐标系和激光雷达的坐标系没有标定准确。map和odom之间的关联因为小车移动需要一个局部联系,比如小车在向前走,不停的累加,这是里程计的作用,map起到全局的、不连续的作用,经过激光雷达和map对应。如果要学习ROS的话,坐标系的变化是重要的点。坐标系的变换还有一个点,就是每个帧都只有一个父帧,有时候两个坐标都和它有关联的话,就是A和B关联,B再和C关联,而不是B/C都和A关联。三个坐标帧的父子关系如下:map–>odom–>base_link其实,map和odom都应该和base_link关联,但为了遵守“每个帧只能有一个父帧”的原则,根据map和base_link以及odom->base_link的关系,计算出map与odom的坐标关系并发布。odom->base_link的坐标关系是由里程计节点计算并发布的。map->base_link的坐标关系是由定位节点计算出来,但并不发布,而是利用接收odom->base_link的坐标关系,计算出map->odom的坐标关系,然后发布。只有里程计的时候,没有激光雷达,也可以跑,但是要先根据预设地图进行简单避障。精彩问答Q:还有ROS的实时性有什么改进进展吗?A:实时改进要看ROS2.0的设计,其实ROS2.0的进展网上有公开。但是实际上他的进展离实际应用还有一定距离,至少今年下半年还达不到稳定,不过可以去研究下他的代码,他对内存管理,线程管理,在实时性上有了很大改善。Q:vSLAM对内存和CPU要求颇高。实际工程中,李老师使用的是什么硬件配置?可以做多大的地图呢?A:确实如此,目前来说我们还是使用激光雷达和传感器辅助来进行,这个和地图大小没有太大关系,主要是与地形障碍物复杂程度有关。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)