ROS前期学习中一些容易忽视的细节
1.ROS消息中的数据类型
在程序中能用C++类型就用C++类型,ROS消息中的数据类型是ros自行封装的结构体。
2.ROS服务(server)是阻塞的
当client.call(srv)时,程序阻塞在这里,等待server返回执行结果,所以服务是同步通信。相对的话题发布与接收都互不相干,属于异步通信。
下图是对比:
3.Action
Action是服务server与topic之外的第三种通信方式,用的不多。用作server服务的补充,当执行需要较长时间时,提供时时执行反馈,可以随时停止的功能。
(*.action消息格式)
4.切记rviz只是显示器件
rviz通过订阅话题将数据显示在图形化窗口上,与gazebo仿真工具有明显差别。
5.rqt,bag等工具
rqt_graph显示node与topic数据流向,rqt_plot绘制话题消息动态变化曲线,bag记录、回放数据。
6.有用被忽略的指令:
$ rosrun rqt_tf_tree rqt_tf_tree查看tf 树
$ roscd [pkg_name] 转到包路径
$ rosdep install [pkg_name]安装包所有依赖
$ rosls [pkg_name] 列出包里面的文件
$ rostopic info [topic] 查询话题详细内容
$ rosnode info [topic] 查询节点详细内容
$ rostopic type [topic] 列出消息类型 eg:/cmd_vel
$ rosmsg show [msg_name] 列出消息包含的具体变量
$ rostopic pub -1 [topic] [msg_name] - - XX XX 按1Hz发布消息
$ rostopic info [topic]
$ rostopic echo、rosserver call
7.理解NodeHandle,NodeHandle都是C++中的类
话题订阅命令语句中
ros::NodeHandle n;
ros::NodeHandlebase_infoSub = n.subscribe("/base_info", 10, &Inspection::
base_infoCallback, this);
n是NodeHandle对象和base_infoSub是ros::Subscriber类对象,n.subscribe是ros::Subscriber类成员函数。其中第三个参数是函数指针,接收到话题时,调用回调函数实现对数据的处理。This是缺省参数。
在这里再次理解回调函数,当其他类封装函数接收到数据时,如果要处理数据要用其他类的函数处理,此时就用回调函数。(当然也可以不封装处理,把数据传递出来,再进行处理)
8.ros::spin(),ros::spinOnce()
当程序执行到ros::spin()时,会调用消息对列中的消息,执行回调函数,程序会阻塞在此,一直监听消息队列,进行回调处理。
当程序执行到ros::spinOnce()时,会调用对列中的消息,执行回调函数,程序向下一句程序执行。
9.ROS参数服务器
ROS参数服务器提供一个字典,方便设置参数,常用作那些不常修改的参数,但调试修改方便,无需编译源程序。
设置方式:
1.程序中设置
2.lauch文件中设置(加载yaml文件或指令)
10.tf与tf tree
link<—>frame一一对应,两个frame之间有一个broadcast对象发布坐标变化关系,tf维护发布的每一个tf变换,连接成tf tree。
eg: world<—>map
这里的map是指frame,下一点里面的/map指话题,slam出来保存的地图。由map_server发布。
11./map
地图其实就是topic:一般是/map、一张静态地图
12.Slam包
订阅: 1./tf base—>odom 2./scan
发布: 1./tf map(frame不是话题)—>odom(误差修正值) 2./map 3./… 4. /…
13.costmap插件有两张地图,三层
1.static layer (/map)静态地图
2.Obstacle layer ()动态、支持3d点云
3.Inflation layer 膨胀障碍(机器人体积)
14.Mapserver 提供地图
发布:topic:/map
15.AMCL包
订阅:1./tf base<—>odom 2./scan 3./map
发布:1./tf map<—>odom(误差修正值) 2./amcl_pose 3./map