前言
在编写ROS程序前,先了解一下基本的一些命令与概念,这些命令和内容在之后都比较
常用,所以需要牢牢记住!
一、ROS常用命令
1.要找到一个软件包的目录,使用 命令
rospack find
2.查看软件包 : 要查看软件包目录下的文件,使用如下命令:
rosls package-name
3如果想“访问”某软件包目录,可以将当前目录切换至此软件包目录,使用如下命令:
roscd package-name
ps:命令eog是图像查看器
4.查看节点列表ROS提供了一些方法来获取任意时间运行节点的信息。要获得运行节点列表,使用如下命令 :
rosnode list
rosout 节点是一个特殊的节点,通过 roscore 自动启动。其作用有点类似于控制台程序中使用的标准输出(即 std:: cout)。
/rosout前面的反斜杠“/”表明该节点名称属于全局命名空间。
5.查看节点 要获得特定节点的信息,使用如下命令:
rosnode info node-name
6.终止节点 要终止节点,使用如下命令:
rosnode kill node-name
终止和重启节点通常不会对其他节点有较大影响;即使节点间正在相互交换消息(message),
这些连接也会在节点终止时断开,在节点重启时重新连接。
还可以用 Ctrl-C 命令终止节点。但使用这种方法时可能不会在节点管理器中注销该节点,因此会导致已终止的节点仍然在 rosnode 列表中。这虽然没有什么坏处,但可能会让用户对当前系统的行为感到困扰。此时可以使用下面的命令将节点从列表中删除:
rosnode cleanup
ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题里。消息传递的理念是:
当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。
ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节
点传递到订阅节点,中间并不经过节点管理器转交。
7.在 ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:
rqt_graph
在这个命令中,r 代表 ROS,qt 指的是用来实现这个可视化程序的 Qt 图形界面(GUI)工具包。
turtlesim 遥控系统的工作原理
当你按下一个键时,/teleop_turtle 节点会以消息的形式将这些运动 控 制 命令发布到话题 /turtle1/cmd_vel ; 与此同时 , 因 为turtlesim_node 订阅了该话题,因此它会接收到这个些消息,控制海龟按照该预定的速度移动。
8.话题列表为了获取当前活跃的话题,使用如下命令 :
rostopic list
9.打印消息内容 为 了 查 看 某 个 话 题 上 发 布 的 消 息 , 可 以 利 用
rostopic 命令的如下形式:
rostopic echo topic-name
10.测量发布频率 有两个命令可以用来测量消息发布的频率以及这
些消息所占用的带宽:
rostopic hz topic-name
rostopic bw topic-name
这些命令订阅指定的话题,并且输出一些统计量,其中第一条命令输出每秒发布的消息数量,第二条命令输出每秒发布消息所占的字节量。即使你一点都不关心这个特定的频率,但是这些命令对调试很有帮助,因为它们提供了一种简单的方法来验证这些消息确实有规律地在向这些特定的话题发布。
11.查看话题利用 rostopic info 命令,你可以获取更多关于话题的信息:
rostopic info topic-name
12.查看消息类型 要想查看某种消息类型的详情,使用类似下面的命令 :
rosmsg show message-type-name
Type 在文本输出中表示数据类型。
理解消息的类型很重要,因为它决定了消息的内容。也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息,以及这些信息是如何组织的。
上述输出的格式是域(field)的列表,每行一个元素。每一个域由基本数据类型(例如 int8、bool、或者 string)以及域名称定义。上述输出告诉我们 turtlesim/Color 包含三个无符号 8 位整型变量 r,g 和 b。任何话题的消息只要是 turtlesim/Color 类型,都由上述三个域的值定义。
该 例 中 , linear 和 angular 都 是 复 合 域 , 其 数 据 类 型 是geometry_msgs/Vector3。缩进格式表示命名为 x,y 和 z 的域是对应的上级两个域之一的成员。也就是说,geometry_msgs/Twist 消息包含六个成员,并且以两个向量的形式组织,分别为 linear 和angular。其中每个数值都是基本数据类型 float64,即每个数值都是 64 位浮点型数据。
消息类型的命名
理解消息类型的命名和 ROS 里其他的程序一样,每条消息类型都属于一个特定的包。消息类型名总会包含一个斜杠,斜杠前面的名字是包含它的包:
package-name/type-name
例如,turtlesim/Color 消息类型按如下方式分解:
这样分解的好处是:
1.最直接地,把包的名字包含在消息类型名里能避免命名冲突。
例如, geometry_msgs/Pose 和 turtlesim/Pose 是有区别的消息类型,它们包含了不同的(但概念上是类似的)数据。
2.当我们编写 ROS 程序的时候,如果也用到了其他包的消息类型,那么我们需要声明对它们的依赖关系。把功能包的名称和消息类型名一起写出来会使得这些依赖关系看上去更明朗。
3.最后一点,包名和其含有的消息类型放在一起将有助于猜测它的含义。例如,消息类型 ModelState 单独出现可能会让人产生迷惑,但是以 gazebo/ModelState 的形式出现后,就会指明这个消息类型是 Gazebo 仿真器中的一部分,而且很有可能包含了这个仿真器中某个模型的状态信息。
一个简单的的例子
在终端输入
rosrun turtlesim turtlesim_node __name:=A
rosrun turtlesim turtlesim_node __name:=B
rosrun turtlesim turtle_teleop_key __name:=C
rosrun turtlesim turtle_teleop_key __name:=D
我们可能以为或许你以为每个远程操作节点分别连接了一个小海龟节点,因此生成了两个独立可控的仿真。
不过结果是当遥控节点之一发送按键命令时,两个海龟都会有同样的运动来响应。
基于话题和消息的通信机制是多对多的,即多个发布者和多个订阅者可以共享同一个话题。
节点之间的松耦合关系
我们的 turtlesim 节点之间——更一般的,对于绝大多数设计精巧的 ROS 节点——是松耦合的。每个节点都不需要显式知道其他节点的存在与否;它们的唯一交互方式是间接地发生在基于话题和消息的通信层。这种节点之间的独立性,以及其支持的任务可分解特性(即复杂任务分解成可重用的小模块),是 ROS 最关键的设计特性之一。
“生产”消息的程序(例如 turtle_teleop_key)只管发布该消息,而不用关心该消息是如何被“消费”的。
“消费”消息的程序(例如 turtlesim_node)只管订阅该话题或者它所需要消息的所有话题,而不用关心这些消息数据是如何“生产”的。
此外,ROS 为更加直接的一对一通信提供了一种称为服务(services)的机制。
总结
感觉今天的笔记有点杂乱,,看起来有点累,可能还没有熟练掌握如何写CSDN吧。不过我看的书上就是这么讲的哇,也许前面的概念就是挺繁杂的。
参考书籍:
《a gentle introduction to ROS》[美] Jason M. O’Kane 著