ROS Basics

  ROS 基本概念以及经常使用的命令。

ROS 文件系统

1
2
3
4
# 获取软件包有关信息
xxx@...$ rospack find [package-name]
# 查看环境变量(ROS_PACKAGE_PATH)
xxx@...$ export | grep ROS

ROS package

1
2
3
4
5
# 查看一级依赖包信息,内容大致为 packages.xml 所示信息
xxx@...$ rospack depends1 [package-name]

# catkin_make 构建,基于 cmake
xxx@...$ catkin_make [make-targets] [-DCMAKE_INSTALL_PREFIX=xxx]

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
2
3
4
5
6
xxx@...$ rosrun rqt_console rqt_console

xxx@...$ rosrun rqt_logger_level rqt_logger_level

# 检查 ROS 系统
xxx@...$ roswtf

ROS 节点

1
2
3
4
5
6
7
8
9
10
11
12
# 显示当前运行的 ROS 节点信息
xxx@...$ rosnode list

# 返回一个特定节点信息
xxx@...$ rosnode info /<node-name>

# 启动某个节点,需要明确该节点属于哪个package
xxx@...$ rosrun [package-name] [node-name]

# 在运行所有 ROS 程序节点前 master 节点必须先要运行起来
# roslaunch 会自动先启动 master 节点
xxx@...$ roscore

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.节点中如何按照一定频率发布 topic

1
2
3
4
5
ros::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.节点中如何订阅 topic

1
2
3
ros::NodeHandle n;
ros::Publisher pub = n.advertise(const std::string &topic,
uint32_t queue_size, bool latch=false);

3.消息调试可能的步骤!!!

1
2
3
xxx@...$ rostopic list -v
xxx@...$ rostopic info /<topic-name>
xxx@...$ rosrun tf view_frame

使用 roslaunch

  启动定义在 launch 文件中的多个节点

1
xxx@...$ roslaunch [package] [file-name.launch]

  roslaunch 在大型系统中的使用技巧

  1. 高层次的 launch 文件应该简短,利用 include 指令将系统的组成部分和 ROS parameter 引用过来即可。

    1
    <include file="$(find package-name)/.../..." />
  2. 当一个给定类型的消息在不同的情况下发布在不同的 topic 上,可以使用 remapping

    1
    <remap from="topic-name" to="xxx"/>
  3. 参数

    1
    2
    3
    4
    5
    6
    # 声明和使用
    <param name="xxx" value="xxx"/>
    $(arg name)
    # 通过*.yaml文件加载
    # 通过 ns 划分 namespace
    <rosparam file="*.yaml" command="load" [ns="xxx"] />
  4. launch 文件的重用以及参数覆盖(当前文件声明覆盖外部文件声明)应少用为妙。

tf 坐标变换树

  tf 变换树定义了不同坐标系之间的平移和旋转变换关系,通过 rqt_tf_tree 命令查看当前系统 tf 变换树 能够有效的对系统缺漏做出判断!


1
2
3
4
# 查看the tree of frame
xxx@...$ rosrun rqt_tf_tree rqt_tf_tree
# 查看一对不同坐标间的变换
xxx@...$ rosrun tf tf_echo [reference_frame] [target_frame]

ROS 使用 tf 来决定机器人的位置和静态地图中的传感器数据,但是 tf 中没有机器人的速度信息,所以导航功能包要求机器人能够通过里程计信息源发布包含速度信息的里程计(数据类型: nav_msgs/Odometry), “/odom”

rosbag 数据操作

  1. 记录数据

    1
    2
    xxx@...$ rosbag record -o <file-name> /scan /tf /<topic-name>...
    # CTRL+C to generate <file-name>.bag
  2. 数据仿真

    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

文章目录
  1. 1. ROS 文件系统
  2. 2. ROS package
  3. 3. ROS 服务和参数
  4. 4. ROS 调试
  5. 5. ROS 节点
  6. 6. ROS 话题
  7. 7. 使用 roslaunch
  8. 8. tf 坐标变换树
  9. 9. rosbag 数据操作
  10. 10. 保存 SLAM 地图