ROS(Robot Operation System)新手村速查手册
基本概念
Workspace
Workspace间彼此相互独立,包含Package
进入目录,创建src文件夹后(空的就可以),可以使用”catkin_make [targets] [-DCMAKE_VARIBLES…]”来构建项目,该命令可被视作于”mkdir build;cd build;cmake;make;make install”
Packege
包含设置、配置、结点信息等,至少应该包含package.xml文件和CMakeList.txt文件
1 | 创建新package |
Node
是一个可执行文件,通过ROS与其他Node直接通信
rosout:相当于stdout/stderr
roscore:相当于主结点+rosout+parameter server
可以使用如下命令运行某包下某结点
1 | rosrun turtlesim turtlesim_node |
Topic
运行刚才的乌龟,打开一个新窗口并输入
1 | rosrun turtlesim turtle_teleop_key |
这个时候就可以用键盘操作乌龟了
为什么呢
1 | rosrun rqt_graph rqt_graph |
如果运行了乌龟结点和乌龟跑跑结点,可以在新的弹出窗口看到他们被列了出来,中间通过单箭头连接,箭头上的条件为形如”/xxx/xxx”的文字
“/xxx/xxx”就是Topic,两个结点之间正在通过这个Topic进行通信
箭头指向订阅者,在本例中即乌龟订阅了乌龟跑跑结点
1 | rostopic echo "/xxx/xxx" |
图形化结点状态
1 | rosrun rqt_plot rqt_plot |
打开之后输入要打印的topic,即可以坐标轴的形式查看Topic中的信息
Service
为Node提供另一种数据交互方式,允许Node发送request接收response
1 | rosservice list |
比如可以
1 | rosservice call /spawn 2 2 0.2 "" |
rosparam
可以理解为ROS提供的字典服务,Service将数据存放于此
1 | rosparam set /turtlesim/background_r 150 |
rqt_console
rqt_console: 可以展示Node输出内容,在下方的
rqt_logger_level: 可以更改Logger的等级(Debug\Info\Warn\Error\Fatal)
ros_launch
在Node下创建文件夹launch,并在里面编写launch文件,即可使用roslaunch,使用后会自动根据launch脚本内容进行初始化
1 | roslaunch beginner_tutorials turtlemimic.launch |
具体应用
msg and srv
msg
基本使用步骤:
在Node目录(roscd)下建立xxx.msg文件,并写入消息格式
进入package.xml,修改以下内容
1
2<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>其中,generation在构建时起作用,runtime在运行时起作用
进入CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17find_package(
message_generation
//如果有先前的东西不要删除
)
catkin_package(
CATKIN_DEPENDS message_runtime
)
add_message_files(
//注释里有
FILES
//你的消息文件
)
generate_messages(
//这个应该会有,取消注释即可
DEPENDENCIES
std_msgs
)至此,消息创建完成,使用rosmsg show
/ 查看是否创建成功,如果打印了刚才输入的消息体结构,则为成功
srv
srv和msg使用一套构建和运行依赖,虽然他们叫messagexxx,但是同时对msg和src可用
进入CMakeList.txt
1
2
3
4
5add_service_files(
//注释里有
FILES
//你的消息文件
)使用rosmsg show
/ 查看是否创建成功,如果打印了刚才输入和输出的消息体结构,则为成功
Publisher and Subscriber
- 在ros中,stdin、stdout、stderr会被定向到运行rosrun的终端窗口,但建议还是使用ROS_INFO或其他ROS内建函数
- CMakeListd.txt: include_directories(include ${catkin_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS})
Publisher
1 |
|
Subscriber
1 |
|
使用
修改CMakeList.txt,加入
1
2
3
4include_directories(
${catkin_INCLUDE_DIRS}
)
不然#include "ros/ros.h"引不进来编译
1
2roscd <packageName>
catkin_make启动ros环境
1
roscore
rosrun启动节点(打开新终端后启动)
Service and Client
Service
Service=srv+Subscriber,也是作为一个Node在工作,拥有自己的uri,可以收到req,回复res
req和res的格式在srv文件里被定义,下面将演示如何使用
这是一个srv file,规定入参为两个int64的整数,出参为一个int64的整数
1
2
3
4
5# srv file
int64 a
int64 b
---
int64 sum之后我们可以编写一个cpp文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//.h文件会根据srv文件自动生成,不用自己编写
bool add(test::AddTwoInts::Request &req,
test::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();
//文件基本结构和listener一致
return 0;
}
Client
1 |
|
使用
修改CMakeList.txt
1 | add_executable(add_two_ints_server src/add_two_ints_server.cpp) |
之后运行rosrun就可以了
实用工具
rosed
.bag file
录制一段时间内的topic:msg,生成.bag文件以在今后重复发送
开始录制:
1 | rosbag record -a |
查看内容:
1 | rosbag info <filename> |
重复播放:
1 | rosbag play <filename> |
局限性:
一些操作对时间间隔非常敏感,因此rosbag录制的脚本有可能难以完全复制操作
.bag数据回放与分析
直接播放
- 打开终端窗口,设定需要监听的topic,并将其输出到文件要监听几个topic到几个文件,就打开几个终端
1
2
3rostopic echo /obs1/gps/fix | tee topic1.yaml
将/obs1/gps/fix的内容输出到topic1.yaml文件里
tee命令 输出到stdout和文件 - 播放rosbag之后就可以在相应的文件里看到rosbag中对应topic的内容了
1
2time rosbag play --immediate demo.bag --topics /topic1 /topic2
time:记录运行时间
使用ros_readbagfile
点此查看配置教程
读取:
1 | 仅输出到stdout |
方法二的好处
- ros_readbagfile读取速度快
- ros_readbagfile可以一次提取多个topic内容
roswtf
在遇到困难时使用roswtf,可以协助检查潜在的逻辑/设置问题