-
Notifications
You must be signed in to change notification settings - Fork 0
/
ros的topic
142 lines (120 loc) · 6.16 KB
/
ros的topic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
1 创建工作空间:
mkdir -p ~/dev/catkin_ws/src
cd ~/dev/catkin_ws/src
catkin_init_workspace
cd ~/dev/catkin_ws
catkin_make
生成build和devel文件,工作空间创建完成.
编译某个包:catkin_make --only <packagename>
清除编译的文件: catkin_make clean
2 echo "source opt/ros/<ros版本>/setup.sh">>~/.bashrc
3 创建ros的功能包和综合功能包
cd ~/dev/catkin_ws/src
catkin_creat_pkg [packege_name] [depend1] [depend2] [depend3]
这些依赖项包括了常见的消息类型,std_msg包含了常见的消息类型,表示基本数据类型和其他基本的消息构造,如多维数组,
roscpp包括使用C++完成ROS的各种功能
4 对于节点的操作命令
rosnode info <节点>
rosnode ping
rosnode machine
rosnode kill
rosnode cleanup
5 对于topic的消息
rostopic bw TOPIC 显示主题所使用的带宽
rostopic echo TOPIC 将消息输出到屏幕
rostpic find TOPIC
rostopic list
rostopic pubs TOPIC 将数据发布到主题
rostopic type TOPIC 输出主题的类型
6. 服务是能够使节点之间相互通信的另外一种方法,服务允许节点发送请求和接收响应.
命令:
rosservice args/service 输出服务参数
rosservice call/service 根据命令行参数调用服务
rosservice find msg-type 根据消息类型查询服务
rosservice info /service 输出服务信息
rosservice list 列出服务活动清单
rosservice type/service 输出服务类型
rosservice uri/service 输出ROSRPC URI
7.创建节点:
两个节点:一个发布数据,另一个接收这些数据.这是两个节点之间最基本的通信方式,也就是操作数据并使用这些数据来做些工作.
pub节点:
example1_a.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
//ros/ros.h包含了使用ROS节点所必要的文件,而std_msgs/String.h包含了我们要使用的消息类型:
int main(int argc,char **argv)
{
ros::init(argc,argv,"example1_a"); //启动该节点并设置其名称,这个名称是唯一的
ros::NodeHandle n; //设置节点进程的句柄
//将节点设置为发布者并将所发布的主题和类型的名称告知节点管理器.第一个参数是缓存区的大小,名称为message.
//如果主题发布速度较快,那么将缓存区设置为1000个消息
ros::Publisher chatter_pub = n.advertise<std_msgs::string>("message" , 1000);
ros::Rate loop_rate(10); //设置发送数据的频率为100HZ;
while(ros::ok()) //当收到Ctrl+c或者节点停止当前运行命令时,ros::ok()会执行停止节点运行的命令
{
std_msgs::String msg;
std::stringstream ss;
ss<<"I am the example1_a node";
msg.data = ss.str();
//创建一个消息变量,变量的类型必须符合发送数据的要求.
//ROS_INFO ("%s",msg.data.c_str());
chatter_pub.publish(msg); //消息被发布
ros::spinOnce(); //ros会更新并读取所有主题
loop_rate.sleep(); //按照10HZ的频率将程序挂起
}
return 0;
}
sub节点:
example1_b.cpp
#include "ros/ros.h"
#inlcude "std_msgs/String.h"
//每次节点收到一条消息时将调用此函数,我们就可以使用或处理数据.
void chatterCallback(const std_msg::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc ,char **argv)
{
ros::init(argc,argv,"example_b");
ros::NodeHandle n;
//创建一个订阅者,并从主题获取以message为名称的消息数据,设置缓存区为1000个消息,处理消息的回调函数messageCallback
ros::Subscriber sub = n.subscribe("message" , 1000 ,chatterCallback);
ros::spin();//节点开始读取主题和在消息到达时,回调函数messageCallback被调用的循环,当用户按下ctrl+C节点会退出消息循环,于是循环结束.
return 0;
}
1.topic命令:
//查看现有的topic
rostopic list
//查看topic的内容
rostopic echo /task_data
功能包:
ros的功能包是指一种特定的文件结构和文件夹组合.这种结构如下所示:
include/package_name/: 此目录包含了需要的库的头文件.
msg/: 如果开发非标准的消息,可以存放文件在此文件夹.
scripts/: 其中包含bash/python或者其他脚本的可执行脚本文件.
src/: 这是存储程序源文件的目录,可以为节点创建文件夹或者其他方式组织.
srv/: 这表示服务(srv)类型.
CMakeLists.txt: 这是生成CMake的生成文件.
package.xml 这是功能包清单文件
创建/修改/使用功能包命令:
rospack: 查找功能包
rospack find <功能包名字>
catkin_create_pkg 创建一个新的功能包
catkin_make 编译工作空间
rosdep 此命令安装功能包的依赖项
rqt_dep 查看包的依赖关系图
package.mxl文件必须在功能包中,用来说明此功能包的相关各类信息.如果你发现在某个文件夹中包含此文件,那么这个文件夹可能是一个功能包或者综合功能包
打开一个package.xml文件,可以看到包的名称,依赖关系等信息,功能包清单的作用是为了更容易的安装和分发这些功能包.
package.xml文件中两个典型的标记<build_depend>和<run_depend>
<build_depend>标记会显示当前功能包安装之前必须先安装哪些包.这是因为新的包会使用其他包的一些功能.
<run_depend>标记显示运行功能包代码所需的包.
综合功能包:
用于引用其他功能特性类似的功能包,例如导航包/ros_tutorials等
定位综合功能包:
rosatack find ros_tutorials
消息:
ros使用一种简化的消息类型来描述ros节点发布的数据值,通过这样的描述语言,ros可以实现多种编程语言生成不同类型消息的源代码
创建的新的消息类型放在msg/文件下,都以.msg为扩展名.
服务:
ROS使用了一种简化的服务描述语言来描述ROS的服务类型.直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信.服务之间的存储功能包的srv子目录下.srv文件中.