以小海龟为例
查看话题列表
rosnode list
发布话题消息
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist"linear:
x:1.0
y:0.0
z:0.0
angular:
x:0.0
y:0.0
z:0.0"
发布服务请求
rosservice call /spawn :x:5.0
y:5.0
theta:0.0
name:'turtle2'"
话题记录rosbag record -a-O cmd_record
话题复现rosbag play cmd_record.bag
工作空间是一个存放工程开发相关文件的文件夹
src:代码空间
build:编译空间
devel:开发空间
install:安装空间
创建工作空间:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
echo $ROS_PACKAGE_PATH
如何实现一个发布者
初始化ROS节点
向ROS Master注册节点信息,包括发布的话题名还有话题中的消息类型
创建消息数据
按照一定频率循环发布消息
如何实现一个订阅者
初始化ROS节点
订阅需要的话题
循环等待话题消息,接收到消息后进入回调函数
在回调函数中完成消息处理
如何实现一个客户端
初始化ROS节点
创建一个Client实例
发布服务请求数据
等待Server处理之后的应答结果
| 角色 | 通信模式 | 适用场景 | 是否需要回复 |
|---|---|---|---|
| Publisher 发布者 | 话题、持续流式广播 | 传感器高频数据(激光、图像、里程计)、持续速度指令 | 无回复,单向发送 |
| Client 客户端 | 服务、单次请求响应 | 单次指令、状态查询、开关控制、带反馈操作 | 必须等待服务端返回结果 |
当你需要主动发起一次性任务、查询数据,并且需要获取执行结果反馈时,必须创建客户端Client
虽然只会用到一个软件包里面的某个节点但是下载时候还是会把整个包都下载下来,节点不能脱离包而单独存在
创建Package软件包
创建在~/catkin_ws/src文件夹里面
catkin_create_pkg<包名><依赖项名> 用catkin工具创建一个Package软件包
rospy roscpp std_msgs 这三个为依赖包,即通用项
指令
roscd 在终端中进入指定软件包的文件地址
这个地址里面存放的全是ROS的Package包
这些包的来源
/opt/ros/<ROS版本>/share 软件包来源
sudo apt-get install ros-<ROS版本>-desktop-full 基础包
sudo apt-get install ros-<ROS版本>-xxx 独立扩展包
而这些通过apt下载的这些软件包都是现成的可执行文件,可以直接运行,而catkin工作空间的软件包都是源码文件,需要编译成可执行文件才能运行
像这样成功编译
下面运行第一个ros节点
先启动roscore
确定ROS核心处于运行状态
终端执行 rosrun <包名> <节点文件名>
恭喜你!第一个node程序成功出现
ctrl shift +w 可以强制终止该终端
欧克终于结束一个简单的Package 和node
步骤大致如下:
1、使用catkin_create_pkg创建一个软件包
2、在软件包的src文件夹下创建一个cpp源码文件
3、在节点的源码文件中include包含ros的头文件
4、构建一个main函数,并在函数的开头执行ros::init()初始化
5、构建while循环,循环的条件为ros::ok()
6、在CMakeLists.txt中设置节点源码的编译规则
7、编译运行
下面开始Topic话题还有Message消息(ROS的主要通信方式)
在ROS中的众多节点是如何通讯的
1、话题Topic是节点之间进行持续通讯(消息在一直不停的发送接收)的一种形式
2、话题通讯的两个节点通过话题的名称建立起话题通讯连接
3、话题中通讯的数据,叫消息(message)
4、消息message通常会按照一定的频率持续不断的发送,以保证消息数据的实时性
5、消息的发送方叫做话题的发布者Publisher
6、消息的接收方叫做话题的订阅者Subsciber
补充:
一个ROS节点网络中,可以同时存在多个话题
一个话题可以多个发布者,也可以有多个订阅者
一个节点可以对多个话题进行订阅,也可由发布多个话题
不同的传感器消息通常会拥有各自独立话题名称每个话题只有一个发布者
机器人速度指令话题通常会有多个发布者,但是同一时间只能有一个发言人
我们在生成消息包的时候通常有不同的类型
调整发送频率
发布一个话题和发送消息的操作
小结:
1、确定话题名称和消息类型(话题名称不能使用中文字符,否则会报错)
2、在代码文件中include消息类型对应的头文件
3、在mian函数中通过Nodehandler大管家发布一个话题并得到消息发送对象
4、生成要发送的消息包并进行发送数据的赋值
5、调用消息发送对象的publish()函数将消息包发送到话题当中
常用指令
rostopic list 列出当前系统中所有活跃着的话题
rostopic echo 主题名称 显示指定话题中发送的消息包内容
rostopic hz 主题名称 统计指定话题中消息包的发送频率(检测一个话题是否有消息在发送,以及发送的频率是否符合需求)
这样的话两者之间的话题通讯就算完成了
话题订阅
1、确定话题的名称和消息类型
2、在代码文件中include<ros.h>和消息类型对应的头文件
3、在main函数中通过NodeHandler大管家订阅一个话题并设置消息接收回调函数
4、定义一个回调函数,对接收到的消息包进行处理
5、main函数中需要执行ros::spinOnce(),让回调函数能够响应接收到的消息包
常用工具
rqt_graph
图形化显示当前系统活跃的节点以及节点之间的话题通讯关系
使用launch文件一次启动多个节点
xml语法:
<标记名称 属性名1="属性值1" ...>内容</标记名称>