ros的核心部分 通信
通讯方式:
Topic
service
parameter service
actionlib
topic
1 概念
异步指的是:
对于发布者(pub)不用等消息返回的状态,只需要发送就行了 并且可以有多个订阅者(sub)
对接收 者来说 有消息到了就处理,没有就做别的事情
topic内容的数据类型(相当于类)有非常严格的格式要求
pkg中的每条message相当于对象
Message 定义在.msg文件中(pkg/msg/.msg)
2 常用命令
rostopic
列出当前所有的topic
rostopic list
显示某个topic属性
rostopic info /topic_name
显示某个topic的内容
rostopic echo /topic_name
向某个topic发布内容
rostopic pub /topic_name
rosmsg
列出系统上所有的msg
rosmsg list
显示某个msg内容
rosmsg show /msg_name
Service
1
同步通信方式
node之间通过请求和响应(request-reply)的方式通信
nodeB给外界提供一个服务,其他node可以提出请求服务,得到请求就来做b就来处理,处理完再回复给a
同步指的是client 请求后会一直阻塞等待,等到服务器端返回了结果才会继续执行
topic 与 service 对比
2
srv: service通讯的数据格式
定义在*.srv文件中 (和msg类似)
格式:
横线上面是请求的消息
横线下面时返回的消息
srv只能嵌套msg(huamn_pose[]) 不能嵌套srv
同时还需要修改package.xml和CMakeList.txt文件
指定srv 或者msg 再编译或者运行时所需要的依赖,
3 rosservice rossrv
列出当前所有活跃的serbice
rosservice list
显示某个service的属性
rosservice info service_name
调用某个service
rosservice call service_name args
rossrv 对应 rosmsg
列出系统上所有的srv
rossrv list
显示某个srv内容
rossrv show srv_name
例子
还是运行roslaunch robot_sim_demo robot_spawn.launch
rosservice list查看有哪些服务
这里我们查看/gazebo/delete_light服务 的内容
rosservice info /gazebo/delete_light
type就是srv。。。。想调用这个服务,就得看它是怎么定义的
request只有一个参数 light_name 格式是string 返回是布尔型 和字符串是否成功 和状态信息
吧sun这个light_name删掉
rosservice call /gazebo/delete_light “light_name: ‘sun’”
添加删除用service比较好,知道结果删没删除 还有set、get的五福都是在你需要的时候给你
parameter Server
roscore时会启动 master rosout 和parameter Server
parameter Server 储存各种参数的字典 (放一些不常改变的参数,配置) 可用命令行,launch文件和node(api)读写
launch文件中的配置 感觉有点像调用函数返回值
例子
rosparam list 查看参数设置
查看下重力参数
把当前参数存到一个yaml文件中
rosparam dump test.yaml yaml文件是可以查看
vi test.yaml
一般习惯把一些算法的参数写到yaml文件中然后roslaunch 加载
加载: 命令行加载 rosparam load test.yaml launch文件加载 把参数和代码分离开了 只用改参数的代码就行了
Action
升级版的service
例如执行一个任务需要很长的时间,中间想中断这个进程,或者想知道是死机了还是处于一个等待状态
goal :希望动作能实现的目标
cancel:中间可能需要取消掉这个任务
回传:
status::server所处的状态
result:处理完的结果
feedback:实时状态
一般用在长时间的任务,例如小车的导航,走多少米,机械臂的运动等等,还有一些抢占的任务(被打断执行其他任务)
文件类型 *.action 类比 service的的srv topic的msg
文件格式:
有3部分: 分别是goal result 和feedback
2个例子:
server端是3个洗碗机 client发布goal要哪个洗碗机工作,server提供完成进度feedback,result返回一共洗完了多少碗的最终结果。
还有常用的navigation 导航
goal是目标的位姿 result是空的永远不结束 feedback当前的位姿