3. 通信架构
3.1 master 和 node
-
master
每个node启动时都要向master注册
管理node之间的通信
-
roscore
启动roscore:
roscore
master: 节点管理器
rosout:日志输出
parameter server: 参数服务器
-
node
ros的进程
pkg里的可执行文件运行的实例
-
rosrun
启动一个node
rosrun [pkg_name] [node_name]
-
rosnode
列出当前运行的node信息:
rosnode list
显示某个node的详细信息:
rosnode info [node_name]
结束某个node
rosnode kill [node_name]
-
roslaunch
启动master和多个node
roslaunch [pkg_name] [file_name.launch]
自动启动master ,launch文件规定各个节点的启动规则
-
launch 文件
launch文件照着模板改就行了。
3.2 通信方式
-
topic
-
Service
-
Parameter Service
-
Action
3.2.1 Topic
节点间通过node通信,一个发,一个收
是ros中的异步通信方式,node间通过publish-subscribe机制通信
异步通信:发送之后不用返回信息,没有阻塞现象
多个node可以往同一个/topic
发消息,多个node也可以订阅同一个/topic
3.2.2 Messasge
-
topic内容的数据格式(类,结构体),是一种格式规范,每一条消息的数据格式
-
Message相当于类
/topic
里面具体publish
的消息就是对象 -
会被用来生成不同语言的源代码。
-
定义在
pkg/msg/*.msg
文件中 -
msg文件实际上就是每行声明一个数据类型和变量名,可以使用的数据类型如下:
基本msg包括:
bool,int8,int16,int32,int64,uint
float32,float64,string
time,duration,header
可变长数组:array[] (相当于vector)
固定长度数组array[C]
-
具体message例子
-
在ROS中有一个特殊的数据类型: Header,它含有时间戳和坐标系信息。在msg文件
的第一行经常可以看到Header header的声明。 下面是一个msg文件的样例,它使用了Header, string,和其他另外两个消息类型。 -
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
-
有时候消息是这样的:
- topic_demo/gps
- 应该是package_name/msg_name
3.2.3 相关命令1
查看/topic
间的关系图:rqt_graph
3.2.4 Service
topcic是publish和subscribe的单向模式,有时候可能满足不了我们的要求
是ros中的同步通信方式,node间通过request-reply方式通信
同步:nodeA request请求后,会一直等待结果,可能会发生阻塞.
topic:接收信息后,会调用Callback函数对数据进行处理
3.2.5 srv
srv定义Service通信的数据格式,定义在*.srv文件中
相当于topic的message
bool start_detect # request的格式
---
my_pkg/HumanPose[] pose_data # reply的格式
# srv只能嵌套msg,不能嵌套srv
3.2.6 相关命令2
3.2.7 自定义格式需要额外添加的
-
要确保msg文件被转换成为C++, Python和其他语言的源代码,就必须确保package.xml包含以下两条语句。
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend> [run->exec]
<package>
不要有format=2.0
-
在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。
3.2.8 Parameter Server
-
用命令行读写参数服务器
-
launch文件读写参数服务器
-
node方式读写
后面roscpp,rospy再学
3.2.9 Action
类似Service,带有状态反馈的通信方式
通常用在长时间、可抢占的任务中