##整理结合机器人操作系统(ros)浅析和网址http://wiki.ros.org/cn
node几乎是无处不在,这个东西相当于可执行文件,目前我更愿意把它当做cpp文件,通过catkin_make之后生成可执行文件。
不用说了,没有message就是哑巴了。还是这是血液吧,不然传递机制是无法建立起来的
topic就像是QQ群一样,提供一个平台。当有人发了一条消息后,QQ群告诉任何一个加群的人,有没有红包啥的。显然这是一种通过第三方传递的方式,也就是间接传递。发红包的人就是publisher,看群消息的人就是subscriber,然后是MESSAGE传递,这就很简单了,就是水群。
service有点像两人私聊的意思,或者是很多人找一个人私聊。跳过了topic平台,它与topic区别就在于是消息直接传递还是间接传递。水群就是间接传递,多对多传递。私聊就是直接传递,一对一。
在ros中似乎和正常编程有点不一样,估计VS背后也是这么搞的,只不过ros用户体验不是太高。比如beginner_tutorials::AddTwoInts::Request这一句,把工作包当做命名空间,把里面的AddTwoInts.srv文件当做一个类,不知道VS底层机制是不是这样。当然,ros的c++实现毕竟是借助c++的,还是有不少地方是相似的。
启动节点(也称运行ROS程序)的基本命令是rosrun
rosrun [package_name] [node_name]
rosrun package-name executable-name
eg:rosrun turtlesim turtlesim_node
可以像执行任 何其他程序一样直接执行 turtlesim_node:
这里可以看出,一个节点相当于一个cpp文件,运行之后产生一个类似于exe的可执行文件。
可以使用 rosrun 命令显式设置节点的名称,语法 如下:
rosrun package-name executable-name __name:=node-name
Rosrun只是简便了操作,也可以直接找出下面的命令进行操作
/opt/ros/indigo/lib/turtlesim/turtlesim_node
rosnode list
rosnode info node-name
在 ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:
rqt_graph
这是图形界面,比较容易理解
在这个命令中,r 代表 ROS,qt 指的是用来实现这个可视化程序的 Qt 图形界面(GUI)工具包。
rqt_graph 本身就是一个节点。
rosout 节点是一个特殊的节点,通过 roscore 自动启动。其作用有点类似于控制台程序中使用的标准输出(即 std:: cout)。/rosout前面的反斜杠“/”表明该节点名称属于全局命名空间。
所有的节点发布都向话题/rosout 发布消息,该话题由同名的/rosout 节点订阅。这个话题的作用是用来生成各个节点的文本日志消息。
ROS 会根据上下文来推测我们讨论的是/rosout 节点还是/rosout 话题。
rosnode kill node-name
还可以用 Ctrl-C 命令终止节点。但使用这种方法时可能不会在节点管理器中注销该节点,因此会导致已终止的节点仍然在 rosnode 列表中。此时可以使用下面的命令将节点从列表中删除:
rosnode cleanup
rostopic -h
rostopic list –h
打印消息内容为了查看某个话题上发布的消息 , 可以利用
rostopic echo topic-name
这条命令将会在终端里显示出指定话题里发布的任何消息
eg:
rostopic echo /turtle1/cmd_vel
topic之间的通信是通过在节点之间发送ROS消息实现的。对于发布器(如turtle_teleop_key)和订阅器(如turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面的消息类型决定
rostopic type [topic]
eg:
rostopic type /turtle1/cmd_vel
Type 在文本输出中表示数据类型。
查看消息类型详情
rosmsg show message-type-name
eg:
rosmsg show turtlesim/Color
rosmsg show turtlesim/Velocity
rostopic pub –r rate-in-hz topic-name message-type message-content
这条命令重复地按照指定的频率给指定的话题发布指定的消息。该命令最后的参数 message-content 应该按顺序提供消息类 型中所有域的参数值。
eg:
rostopic pub –r 1 /turtle1/cmd_vel geometry_msgs/Twist ’[0,0,0]’ ’[0,0,1]’
rostopic pub
这条命令将会发布消息到某个给定的话题。
-1
这个参数选项使rostopic发布一条消息后马上退出。还有 –r,表示重复,还有-l,锁存模式,虽然也只是发布一次消息,但是会确保该话题的新订阅者也会收到消息。实际上,锁存模式是默认的模式。 同样也可以从文件中读取消息(利用-f参数)或者从标准的输入(把-f参数和消息的内容从命令中都删掉)中读取。两种情况下,输入应该符合rostopic echo的输出格式。
/turtle1/command_velocity
这是消息所发布到的话题名称。
turtlesim/Velocity
这是所发布消息的类型。
--相当于分割,前面是rostopic控制的参量,后面是node自己的参量
(双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。这在参数里面包含有破折号-(比如负号)时是必须要添加的。包名和其含有的消息类型放在一起将有助于猜测它的含义
’[0,0,0]’ ’[0,0,1]’
Node需要的两个参数
rostopic hz [topic]
eg:
rostopic hz /turtle1/pose
rostopic bw就是测试带宽
rosservice type [service]
eg:
rosservice type clear
:
std_srvs/Empty
rosservice call [service] [args]
eg:
rosservice call clear
服务清除了turtlesim_node的背景上的轨迹。
通过查看再生(spawn)服务的信息,我们来了解带参数的服务:
rosservice type spawn| rossrv show
rosservice call spawn 2 2 0.2 ""
这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。名字参数是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除服务器参数
rosparam list 列出服务器参数名
rosparam get /
显示参数服务器上的所有内容:
存储这些信息以备今后重新读取。这通过rosparam很容易就可以实现
rosparam dump [file_name]
rosparam load [file_name] [namespace]
现在我们将所有的参数写入params.yaml文件
eg:
rosparam dump params.yaml
甚至可以将yaml文件重载入新的命名空间,比如说copy空间:
rosparam load params.yaml copy
读取
rosparam get copy/background_b
rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。一般情况下,使用ROS_DEBUG_STREAM机器会忽略这条命令,但是要想输出,可以更改日志等级(目前是这样理解的)
rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level
roslaunch可以用来启动定义在launch文件中的多个节点。
roslaunch [package] [filename.launch]
eg:
roscd beginner_tutorials
roscd beginner_tutorials
通过roslaunch命令启动launch文件:
roslaunch beginner_tutorials turtlemimic.launch
这条命令会进行全面而深入的检测,包括检测你的环境变量、 安装的文件以及运行的节点。例如,roswtf 将会检测在安装过程 中 rosdep 初始化是否完成,任何节点是否出现了意外的挂起或者
终止,以及活跃的节点是否正确地和其他节点相连接等。可惜的 是,由 roswtf 检测的完整列表只能在 Python 源码中才能找到。
使用rosbag info检查看它的内容
rosbag info
回放bag文件以再现系统运行过程
rosbag play
rosbag play -r 2
录制数据子集
rosbag record -O subset /turtle1/command_velocity /turtle1/pose
rosbag record/play命令的局限性:
录制并不完整,可能在某些方面有应用吧。。。。。。
Bool
Byte
ByteMultiArray
Char
ColorRGBA
Duration
Empty
Float32
Float32MultiArray
Float64
Float64MultiArray
Header
Int16
Int16MultiArray
Int32
Int32MultiArray
Int64
Int64MultiArray
Int8
Int8MultiArray
MultiArrayDimension
MultiArrayLayout
String
Time
UInt16
UInt16MultiArray
UInt32
UInt32MultiArray
UInt64
UInt64MultiArray
UInt8
UInt8MultiArray