本章记录了ROS的基本概念、基本操作,以及跑起来了两个基础的小程序,对于ROS的安装比较简单,一笔带过
1.ROS安装
ROS的安装非常简单,再浏览器上搜索基本按照流程来都可以实现。这里给出官方的教程: 帮助文档
关于环境变量
ROS需要根据一些环境变量来定位文件。使用以下命令执行:
source /opt/ros/版本/setup.bash
版本可以是melodic,indigo等等,根据自己而定。
然后输入以下命令确认环境变量设置正确:
export | grep ROS
如果设置完成,会看到很多环境变量的值,否则,无输出。
尤其重要的是,以上命令只对当前shell起作用,为了使每一个shell都有用,我们需要操作账户根目录(操作如下)下的.bashrc文件,并再最后一行添加刚才的代码。
gedit ~/.bashrc
.bashrc应该是每个shell开启后会自启动的一个文件,类似于初始化
2.开启一个小例子
启动三个终端,分别执行以下命令:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
将鼠标聚焦在第三个窗口,按键上下左右可以操作乌龟运动
运行效果应如上图,后边的概念介绍将以此展开。
3.ROS的相关基本概念
下文将记录packages,master, node, topic,message和一些工具等等。
I . packages(功能包)
介绍
在ROS中所有软件都被组织为package的形式,最小结构包含cmakelist和package.xml。之前的两个tursim_node和turtle_teleop_key都属于turtlesim包。
注意:ROS软件包和操作系统软件包管理器中的包概念相似,但不等同:安装一个操作系统软件包可以添加一个或多个ROS软件包。
II . The Master(节点管理器)
The master是执行ROS软件的重要部分,负责节点之间的相互通信,要启动the master就要使用如下命令开启节点管理器:
roscore
除特殊情况外不应该关闭(Ctrl-C)节点管理器。
如果ROSCORE中断,重新打开后,当前运行的节点将无法建立新的连接。
打开the master的方式除了显示的roscore命令,还有roslaunch后文介绍。
III . Nodes(节点)
ROS的运行实例被称为节点(node)。
- 运行实例(running instance)很重要,如果同时执行相同程序的多个副本,确保每个副本采用不同的节点名,则每个节点被当作不同节点。
在小例子中我们启动了两个节点: - 第一个是turtle_teleop_key的实例化,创建可视化窗口和海龟运动;
- 第二个teleop是teltoperation(遥操作)的缩写,指的是人通过远程发送指令控制机器人。
IV . 话题和消息
介绍
ROS节点间进行通信所利用的机制就是消息传递。消息有组织的存放在话题里。
- 消息传递的理念:一个节点可发布消息到一个或多个话题,一个节点可订阅一个或多个话题。
- The master负责发布方和订阅方能找到对方
- 消息是直接从发布节点到订阅节点,不经过The master.
rqt_graph工具
终端输入:
rqt_graph
可打开查看节点连接关系:椭圆表示节点,有向边表示其两端节点间的发布-订阅关系。下图表示:/teleop_turtle节点向/turtle1/cmd_vel发布消息,而/turtlesim节点订阅。
上图是隐藏了debug,如果取消hide/debug的话,会调出很多节点,包括rosout等等。默认隐藏了调试节点(rqt_graph也是一个节点)。
- 所有节点都向话题/rosout发消息,该话题由同名的/rosout节点订阅
比较好的一种设置方式是:将下拉选项中的nodes only改为nodes/topics(all), 并取消除debug以外的所有复选框。
优点是: 矩形表示话题,椭圆形表示节点。 - 小海龟并不关心或不知道哪些消息发布了cmd_vel消息,任何向这个话题发布消息的程序都可以控制小海龟。
用命令行发消息
多数时候发布消息的工作由特定的程序执行,但其实也可以通过rostopic命令行手动发布命令。
rostopic pub –r rate-in-hz topic-name message-type message-content
topic-name:话题名
message-content:按顺序提供消息类型中,所有域的参数值。
控制小海龟沿着Z轴(垂直于电脑屏幕)旋转如下:
rostopic pub –r 1 /turtle1/cmd_vel geometry_msgs/Twist ’[0,0,0]’ ’[0,0,1]’
明显的缺点是:开发者必须记住消息作用域和类型顺序。另一种替代方式是以YAML字典的形式给出一个参数,该参数将所有作用域进行赋值。
再理解消息类型
我们会发现ROS中每条消息都属一个特定的包。因此消息类型名总会包含一个斜杠,前边的名字就是包含它的包。
例如:Tur/Color
- 消息类型: Tur/Color
- 类型名称:Color
- 功能包名: Tur
既避免了命名冲突,又方便理解。
基本文件架构
这里借用奥特学院的一张图:
4.问题检查
当ROS运行出现问题时,运行如下命令进行深入而全面的检测。
roswtf
检查内容包括:环境变量、安装的文件以及运行的节点。可惜的是roswtf检测的完整列表只能在python源码中才能找到。更多详见官方文档:点击此处
5.展望
明日整理一下关于ROS的常用命令以及今天遗留的关于消息的补充知识。。◕‿◕。