1. ROS 基本概念:
计算图级-------是 ROS 处理数据的一种点对点的网络形式。程序运行时,所有进程及它们所进行的数据处理,将会通过一种点对点的网络形式表现出来,即通过节点、节点管理器、话题、服务等来进行表现。
ROS 中的基本计算图级概念包括:节点、节点管理器、参数服务器、消息、服务、话题和包。这些概念以各种形式来提供数据。
- 1.1 节点( Node )
一个节点就是 ROS 功能包中的一个可执行文件,节点之间可以通过 ROS 客户端库(如roscpp 、 rospy )相互通信。一个机器人控制系统由许多节点组成,这些节点各司其职,如,一个节点控制激光距离传感器,一个节点控制轮子的马达,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的整个视图 ...... - 1.2 节点管理器( Master )
节点管理器是 ROS 名称服务,能够帮助节点找到彼此。节点通过与节点管理器通信来报告他们的注册信息。值得注意的是,当这些节点和节点管理器通信时,它们可以接受其他注册节点的信息,并能保持通信正常。当这些注册信息改变时,节点管理器也会回调这些节点。所以,没有节点管理器,节点将不能相互找到,也不能进行消息交换或者调用服务。 - 1.3 参数管理器( Parameter Server )
是节点管理器的一部分。其允许数据通过在一个中心位置的关键词来存储。 - 1.4 消息( Message )
消息是一种 ROS 数据类型,节点之间通过消息来互相通信。 - 1.5 话题( Topic )
话题是用于识别消息的名称,节点可以发布消息到话题,也可以订阅话题以接收消息。一个话题可能对应有许多节点作为话题发布者和话题订阅者,当然,一个节点可以发布和订阅许多话题。一个节点对某一类型的数据感兴趣,它只需订阅相关话题即可。一般来说。话题发布者和话题订阅者不知道对方的存在。发布者将信息发布在一个全局的工作区内,当订阅者发现该信息是它所订阅的,就可以接收到这个信息。 - 1.6 服务( Service )
我们可以看出,发布 / 订阅模式是一种多对多的传输方式,显然这种传输方式不适用于请求 / 回复的交互方式。请求 / 回复交互方式经常被用于分布式系统中。请求服务通过 Service 来进行, Service 被定义为一对消息结构:一个用于请求,一个用于回复。一个客户通过发送请求信息并等待响应来使用服务。( ROS中的请求 / 回复交互方式好像是一个远程程序调用。) - 1.7 消息记录包( Bag )
消息记录包是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。
2. 基本命令: roscore, rosnode, rosrun
ros 命令的说明及参数可以通过 < 命令 > -h (或 --help )来查看
例如:rosnode -h
- 2.1 roscore
在运行所有有关具体操作的 ROS 程序之前首先要运行该命令,然后打开新标签页运行其他 ROS 程序。
roscore
- 2.2 rosnode
显示当前运行的 ROS 节点信息。
列出活跃的节点:
rosnode list
rosnode info 命令返回的是关于一个特定节点的信息:
rosnode info /rosout
- 2.3 rosrun
rosrun
可以运行 package 中的可执行文件 , 不需要知道可执行文件的位置
用法: rosrun [package_name] [node_name]
运行 turtlesim 包中的节点 turtlesim_node :
rosrun turtlesim turtlesim_node
通过命令来改变节点名称为 my_turtle :
rosrun turtlesim turtlesim_node __name:=my_turtle
在新标签页中运行命令:
rosrun turtlesim turtle_teleop_key
需要注意的是,应选中 turtle_teleop_key 所在的终端窗口,即最后打开的新标签页,以确保键盘输入能够被捕获。
在新的标签页用rosnode list
命令查看此时运行的 ROS 节点 :
rosnode list
可以看到,除了节点 turtlesim ,现在又多出了节点 teleop_turtle 。
可以用 rosnode ping 命令来测试节点:
rosnode ping my_turtle
总结:
roscore= ros+core : master (provides name service for ROS) + rosout(stdout/stderr) +parameter server (parameter server will be introducedlater)
rosnode = ros+node : ROS tool to get information about a node
rosrun = ros+run : runs a node from a given package
3. ROS Topic
用键盘控制小海龟运动这一过程的通信机制是怎样的呢?其实,这两个节点是通过一个 ROS 话题( Topic )来相互通信的, turtle_teleop_key 在这个话题上发布键盘输入的的消息,而 turtlesim 则订阅该话题以接收该消息。下面通过 rqt 功能包和 rostopic 命令来查看相关信息:
- 3.1 rqt 功能包
通过 rqt_graph 来查看当前系统的运行情况。在新的标签页运行如下命令:
rosrun rqt_graph rqt_graph
如图所示,节点 turtlesim_node 和节点 turtle_teleop_key 正通过一个名为 /turtle1/cmd_vel 的话题来相互通信。
除了使用 rqt_graph ,还可以用 rqt_plot 来实时显示一个发布到某个话题上的数据变化图形。这里我们将
使用 rqt_plot 命令来绘制正在发布到 /turtle1/pose 话题上的数据变化图形。首先,在一个新终端中运行
rqt_plot
命令。rosrun rqt_plot rqt_plot
在弹出的新窗口左上角的一个文本框里面可以添加需要绘制的话题。在里面输入/turtle1/pose/x 后按enter 键或点击 “ +”号按钮,并对/turtle1/pose/y 重复相同的过程。就会在图形中看到 turtle 的 x-y 位置坐标图。
- 3.2 rostopic
使用 rostopic 命令工具能获取有关 ROS 话题的信息。
运行下面命令查看 rostopic 子命令:
rostopic -h
1,rostopic echo
:显示某个话题上发布的数据。
用法:rostopic echo [topic]
rostopic echo /turtle1/cmd_vel
此时终端没有任何数据,切换到 turtle_teleop_key 节点运行时所在的终端窗口,通过键盘方向键控制小海龟移动,然后再切换回原来的终端窗口。此时出现发布到话题上的数据。
2, rostopic list
:能够列出所有当前订阅和发布的话题。
先看一下 rostopic list
子命令需要哪些参数。运行命令:
rostopic list -h
使用 verbose 选项,以列出相关话题的详细信息。运行命令:
rostopic list -v
显示了有关所发布和订阅的话题的详细信息,其中方括号中表示的是话题的类型。
3,rostopic type
:用来查看所发布话题的消息类型。
用法: rostopic type [topic]
运行如下命令:
rostopic type /turtle1/cmd_vel
上面的 geometry_msgs/Twist
即为话题 /turtle1/cmd_vel 的消息类型,这在执行命令 rostopic list -v 时
也有所体现。
下面用 rosmsg 命令来查看消息的详细情况:
rosmsg show geometry_msgs/Twist
4, rostopic pub
:把数据发布到当前某个正在广播的话题上。通过此命令可以通过直接在终端发送命令来控制小海龟
用法:rostopic pub [topic] [msg_type] [args]
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'```
以上命令会发送一条消息给 turtlesim ( -1 表示命令只发布一次),这样小海龟就会以 2.0 大小的线速度和 1.8 大小的角速度开始移动。要想保持这个运动, turtle 需要一个 1Hz 稳定频率的命令流来保持移动状态。
使用 `rostopic pub -r` 命令发布一个稳定的命令流:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
此时,我们再通过 rqt_graph 来查看当前系统的运行情况,即在新的标签页,运行:
`rosrun rqt_graph rqt_graph`
![](http://upload-images.jianshu.io/upload_images/3846387-a746e2a910fe981b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
由上图可以看出, rostopic pub 发布消息到话题 /turtle1/cmd_vel , rostopic echo 从该话题接收消息输出到终端,所以此时我们可以在新的终端用 rostopic echo 命令查看不断发布到话题的数据。
5, rostopic hz :命令可以用来查看数据发布的频率。
用法: rostopic hz [topic]
之前我们用 rostopic pub -r 命令发布一个 1HZ 的稳定命令流,现在我们用 rostopic hz 命令查看一下 :
`rostopic hz /turtle1/cmd_vel`