ROS学习笔记
ROS
什么是ROS
ROS=通信机制+开发工具+应用功能+生态系统
目标:提高机器人研发中的软件复用率。
通信机制:松耦合分布式通信,节点之前通过箭头连接,本质上是一个计算图。
开发工具:命令行&编译器、QT工具箱……
应用功能:在已有的模块上进行二次开发
生态系统:发行版、软件源、ROS wiki……
ROS的核心概念
通信机制
节点:执行单元,是一个具体的进程。
- 分布式运行与不同的主机
- 可以使用不同的编程语言
- 节点在系统中的名称必须唯一
节点管理器:控制中心
- 为节点提供命名和注册服务
- 跟踪通信,辅助节点之间建立连接
- 提供参数服务器,存储和检索运行时的参数
话题通信
话题:异步通信机制
- 发布/订阅模型,同一话题的订阅者和发布者可以不唯一
消息:话题的数据(.msg)
服务通信
服务:同步通信机制(.srv)
- 使用客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据。

参数
全局共享字典
可以通过网络访问的共享、多变量字典。
适合存储静态配置参数,不适合存储动态配置的数据。
文件系统
功能包:ROS软件的基本单元
功能包清单
元功能包
ROS命令行工具的使用
以小海龟为例:
启用ROS Master:roscore
启用小海龟仿真器:rosrun turtlesim turtlesim_node
启动海龟的控制节点:rosrun turtlesim turtle_teleop_key

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::init(argc, argv, "velocity_publisher");
ros::NodeHandle n;
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;
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