发布于 

ROS学习笔记

ROS

什么是ROS

ROS=通信机制+开发工具+应用功能+生态系统

目标:提高机器人研发中的软件复用率。

通信机制:松耦合分布式通信,节点之前通过箭头连接,本质上是一个计算图。

开发工具:命令行&编译器、QT工具箱……

应用功能:在已有的模块上进行二次开发

生态系统:发行版、软件源、ROS wiki……

ROS的核心概念

通信机制

节点:执行单元,是一个具体的进程。

  • 分布式运行与不同的主机
  • 可以使用不同的编程语言
  • 节点在系统中的名称必须唯一

节点管理器:控制中心

  • 为节点提供命名和注册服务
  • 跟踪通信,辅助节点之间建立连接
  • 提供参数服务器,存储和检索运行时的参数

话题通信

话题:异步通信机制

  • 发布/订阅模型,同一话题的订阅者和发布者可以不唯一

消息:话题的数据(.msg)

服务通信

服务:同步通信机制(.srv)

  • 使用客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据。
    图片.png

参数

全局共享字典
可以通过网络访问的共享、多变量字典。
适合存储静态配置参数,不适合存储动态配置的数据。

文件系统

功能包:ROS软件的基本单元

功能包清单

元功能包

ROS命令行工具的使用

以小海龟为例:

启用ROS Master:roscore

启用小海龟仿真器:rosrun turtlesim turtlesim_node

启动海龟的控制节点:rosrun turtlesim turtle_teleop_key

https://s2.loli.net/2023/03/13/hNHtdCMIkVz9REb.png

Publisher

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
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>

int main(int argc, char **argv) {
//ros节点初始化
ros::init(argc, argv, "velocity_publisher");
//创建节点句柄
ros::NodeHandle n;
//创建一个Publisher,消息类型,消息名,队列长度
ros::Publisher turtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
ros::Rate loop_rate(10);

int count=0;
while(ros::ok()) {
//设置消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x=0.5;
vel_msg.angular.z=0.2;
//发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publish turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);
//设置循环的频率
loop_rate.sleep();
}
}

Subscriber

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<ros/ros.h>
#include "turtlesim/Pose.h"

void poseCallback(const turtlesim::Pose::ConstPtr& msg) {
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}//回调函数

int main(int argc, char **argv) {
ros::init(argc, argv, "pose_subscriber");
ros::NodeHandle n;
//创建Subscriber
ros::Subscriber pose_sub=n.subscribe("/turtle1/pose", 10, poseCallback);
//等待回调函数
ros::spin();
}

Topic

1
2
3
4
5
6
string name
uint8 sex
uint8 age
uint8 unkonn=0
uint8 male=1
uint8 female=2

Client