ROS 基本概念以及经常使用的命令。
ROS 文件系统
1 | # 获取软件包有关信息 |
ROS package
1 | # 查看一级依赖包信息,内容大致为 packages.xml 所示信息 |
ROS 服务和参数
服务是节点之间通讯的一种方式 {request –> response}
1
2
3 xxx@...$ rosservice list
xxx@...$ rosservice type [service-name]
xxx@...$ rosservice call [service-name] [args]参数服务器操作
1
2 xxx@...$ rosparam list
xxx@...$ rosparam set/get [param-name]
ROS 调试
1 | xxx@...$ rosrun rqt_console rqt_console |
ROS 节点
1 | # 显示当前运行的 ROS 节点信息 |
ROS 话题
通过 rqt_graph 命令显示当前系统运行情况动态图,能准确了解系统的整体框架!
1
xxx@...$ rosrun rqt_graph rqt_graph
其他的有关 ROS topic 的命令对于了解整个系统数据流向,数据信息(如频率,数据类型等)有极大的辅助作用!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 显示某个话题上发布的数据
xxx@...$ rostopic echo /[topic]
# 分别显示所有发布和订阅的话题及其类型的详细信息
xxx@...$ rostopic list -v
# 显示某个topic所有的发布节点和订阅节点
xxx@...$ rostopic info /[topic]
# 查看数据类型
xxx@...$ rostopic type /[topic]
# 发布数据到topic
# {-1} 发布一条消息后马上退出,option
# {-r ?} 稳定频率?hz的命令流,option
xxx@...$ rostopic pub {-1} /[topic] [msg_type] {-r ?} -- [args]
# 查看数据发布频率
xxx@...$ rostopic hz /[topic]
# 查看数据变化图形
xxx@...$ rosrun rqt_plot rqt_plot
1.节点中如何按照一定频率发布 topic1
2
3
4
5ros::Rate loop_rate(double frequency);
while(ros::ok()){
ros::spinOnce();
loop_rate.sleep();
}
- ros::spin() blocks until ros invokes a shutdown(频率与callback函数相关!!)
- ros::spinOnce() handles the event and return immediatey(可控频率!)
2.节点中如何订阅 topic1
2
3ros::NodeHandle n;
ros::Publisher pub = n.advertise(const std::string &topic,
uint32_t queue_size, bool latch=false);
3.消息调试可能的步骤!!!1
2
3xxx@...$ rostopic list -v
xxx@...$ rostopic info /<topic-name>
xxx@...$ rosrun tf view_frame
使用 roslaunch
启动定义在 launch 文件中的多个节点1
xxx@...$ roslaunch [package] [file-name.launch]
roslaunch 在大型系统中的使用技巧
高层次的 launch 文件应该简短,利用 include 指令将系统的组成部分和 ROS parameter 引用过来即可。
1
<include file="$(find package-name)/.../..." />
当一个给定类型的消息在不同的情况下发布在不同的 topic 上,可以使用 remapping。
1
<remap from="topic-name" to="xxx"/>
参数
1
2
3
4
5
6# 声明和使用
<param name="xxx" value="xxx"/>
$(arg name)
# 通过*.yaml文件加载
# 通过 ns 划分 namespace
<rosparam file="*.yaml" command="load" [ns="xxx"] />launch 文件的重用以及参数覆盖(当前文件声明覆盖外部文件声明)应少用为妙。
tf 坐标变换树
tf 变换树定义了不同坐标系之间的平移和旋转变换关系,通过 rqt_tf_tree 命令查看当前系统 tf 变换树 能够有效的对系统缺漏做出判断!
1 | # 查看the tree of frame |
ROS 使用 tf 来决定机器人的位置和静态地图中的传感器数据,但是 tf 中没有机器人的速度信息,所以导航功能包要求机器人能够通过里程计信息源发布包含速度信息的里程计(数据类型: nav_msgs/Odometry), “/odom”
rosbag 数据操作
记录数据
1
2xxx@...$ rosbag record -o <file-name> /scan /tf /<topic-name>...
# CTRL+C to generate <file-name>.bag数据仿真
1
xxx@...$ rosbag play <file-name>.bag --clock
保存 SLAM 地图
1 | xxx@...$ roslaunch hector_slam_example hector_hokoyo.launch |
Hector SLAM is running and the real-time map is constructing under map server
建图完成后从 map server 获取地图数据,进行保存1
xxx@...$ rosrun map_server map_saver -f <file-name>
会在当前目录生成地图数据
.pgm 和.yaml