ROS 笔记(一) 数据结构

ROS中有三种通讯机制: 发布订阅(异步),请求响应(同步),动作反馈(异步,全双工,类似websocket)。使用这些通讯机制时,除了基本数据类型(int/float/string...基本类型数组等)和ROS common_msg中预先定义好的数据类型(std_msg/geometry_msg...),还允许自定义数据类型。

一. 发布订阅数据类型定义

//file: myworkcell/msg/pubsub.msg

string name

uint8 age

uint8 sex

uint32 id

string family[]

uint8 UNKNOWN=0

uint8 MALE=1

uint8 FEMALE=2

 msg文件中还可以定义常量,UNKNOWN=0, MALE=1,FEMALE=2。

定义了msg文件,需要借助ROS的message_generation工具,编译生成相应的代码文件。配置编译文件package.xml和CMakeLists.txt,即可通过catkin完成编译。

(1) 修改myworkcell/package.xml

<!--增加下面两个节点,配置编译和运行依赖-->

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend> <!--有的版本为run_depend-->

(2)修改myworkcell/CMakeLists.txt

 ①找到find_package,添加message_generation

find_package(catkin REQUIRED COMPONENTS

...

message_generation

...

)

②找到catkin_package,添加message_runtime

catkin_package(

...

message_runtime

...

)

③导入需要编译的msg文件

add_message_files(

FILES

...

pubsub.msg

...

)

# 由于用到了std_msgs,所以这里增加对应的依赖

generate_meaasges(

DEPENDENCIES

...

std_msgs

...

)

通过catkin编译完成后,可以查看定义的数据类型:

rosmsg show pubsub

二. 请求响应数据类型定义

请求响应数据通讯,包含请求与响应两个数据域,每个数据域中的数据类型与发布订阅中的数据一样,可以使用基本数据类型,也可以使用ROS中预定义的数据类型。两个数据域之间要用"---"进行分隔(请求域在前,应答域在后)。

//file: myworkcell/srv/service.srv

string reqType

geometry_msgs/Pose reqData

---

uint8 repCode

uint8 repSequence[]

 同理,定义完数据类型后,也需要在功能包的package.xml和CMakeLists.txt中配置编译依赖项,以便将该描述文件编译成代码。

(1) 修改myworkcell/package.xml,和发布订阅中一样,添加message_generation编译依赖和message_runtime运行依赖,如果已经有了,就可以不必再次添加。

(2)修改myworkcell/CMakeLists.txt

①添加message_generation编译依赖,见一.①,如果已有,则不再添加

②message_runtime运行依赖,见一.②,如果已有,则不再添加

③导入需要编译的srv文件

add_service_files(

FILES

...

service.srv

...

)

# 由于用到了geometry_msgs,所以这里增加对应的依赖

generate_meaasges(

DEPENDENCIES

...

geometry_msgs

...

)

 通过catkin完成编译。

三. 动作反馈数据定义

类似于请求响应通讯,但是服务端在接到请求后,会连续向客户端反馈任务执行状态,同时客户端也可以随时发送终止请求以停止当前任务。当任务执行完毕或者提前终止时,服务端会向客户端发送任务执行结果。所以数据定义时,请求域有一个,响应域有两个。

//myworkcell/action/act.action

#定义请求数据

uint8 taskType

uint8 taskId

---

#定义任务执行结果

uint8 resCode

---

#定义任务连续反馈数据

uint32 status[6]

在功能包的package.xml和CMakeLists.txt中配置编译依赖项。

(1)修改package.xml,添加actionlib, actionlib_msgs的编译依赖项和运行依赖项

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

(2)修改CMakeLists.txt

①找到find_package,添加genmsg,actionlib_msgs,actionlib依赖

find_package(catkin REQUIRED COMPONENTS

...

genmsg

actionlib_msgs

actionlib

...

)

 ②导入需要编译的action文件

add_action_files(DIRECTORY action

FILES

...

act.action

...

)

generate_messages(

DEPENDENCIES

...

actionlib_msgs

...

)

通过catkin完成编译。

<think>好的,我现在需要帮用户查找与ROS相关的学习笔记、教程和资料汇总。首先,用户提供的三个引用内容都是关于ROS学习笔记的,应该充分利用这些信息。 首先看引用[1],里面提到了ROS的简介、安装过程和发布-订阅示例,还提到加入社区和开发应用。这可能是个入门级的教程,适合新手。接下来是引用[2],主要讲安装过程中可能遇到的问题,比如模型下载慢、tf包错误,以及使用QT加载工作空间。这部分内容对安装和故障排除有帮助。引用[3]则讨论了ROSmaster的作用和C++实现publisher的方法,涉及节点通信机制,适合进阶学习。 用户需要的是综合性的资料汇总,所以我应该将这三个引用内容整合起来,分门别类地呈现。比如分为基础概念、安装指南、核心机制、实践示例、常见问题等部分。同时,根据引用中的内容,可以推荐官方文档和社区资源,因为引用[1]提到了官方仓库和社区。 接下来需要考虑用户可能的学习路径,从安装到基础概念,再到实际应用和问题解决。因此,回答的结构应该按逻辑顺序排列,便于用户逐步学习。同时,生成的相关问题需要围绕用户可能遇到的后续疑问,比如安装问题、通信机制、实际应用案例等。 另外,用户可能对中英文资源都有需求,但引用中提到的都是中文笔记,所以优先推荐中文资料,但也要补充官方英文资源,因为官方文档通常更全面。同时,需要确保每个部分都标明引用的来源,比如引用[1]、[2]、[3],这样用户知道信息的具体出处。 最后,检查是否有遗漏的部分,比如实践项目或社区资源,这些能帮助用户进步学习和解决问题。确保回答结构清晰,覆盖ROS的基础到进阶内容,并提供实用的问题解决方案和资源链接。</think>### ROS学习资料与笔记汇总 #### 、基础概念与安装指南 1. **ROS核心特性与架构** - ROS采用分布式架构,核心包含节点(Node)、话题(Topic)、服务(Service)和参数服务器(Parameter Server)[^3] - 通过ROSmaster实现节点注册管理,但节点间通信建立后不再依赖主节点[^3] - 典型应用场景:机器人运动控制、传感器数据处理、SLAM算法实现等[^1] 2. **安装与配置** - 推荐使用Ubuntu系统,按官方仓库说明逐步安装 - 常见问题解决方案: - Gazebo模型下载缓慢:手动下载模型放置于`~/.gazebo/models`[^2] - TF报错处理:删除编译文件重新编译或等待依赖加载完成[^2] - 开发环境搭建:支持QT、PyCharm等IDE集成ROS工作空间[^2] #### 二、核心机制详解 $$ \begin{cases} \text{节点通信} & \text{发布-订阅模式(Topic)} \\ \text{服务调用} & \text{请求-响应模式(Service)} \\ \text{参数管理} & \text{全局参数服务器} \end{cases} $$ 3. **实践示例代码** ```python # 发布者示例(Python) import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(10) # 10Hz while not rospy.is_shutdown(): hello_str = "hello world %s" % rospy.get_time() pub.publish(hello_str) rate.sleep() ``` #### 三、进阶学习路径 | 学习阶段 | 推荐资源 | 重点内容 | |---------|----------|----------| | 初级 | 《ROS机器人开发实践》 | 基础概念、TF变换、URDF建模 | | 中级 | ROS Navigation官方文档 | 路径规划、SLAM实现 | | 高级 | ROS-Industrial项目 | 工业机器人应用开发 | #### 四、推荐学习资源 1. **官方文档** - [ROS Wiki](http://wiki.ros.org/)(英文) - 中文社区翻译文档(推荐[古月居](https://www.guyuehome.com/)) 2. **实战项目案例** - TurtleBot3仿真开发套件 - MIT开源课程《机器人学导论》实验案例 3. **社区资源** - GitHub热门仓库: - [ros/ros_tutorials](https://github.com/ros/ros_tutorials) - [PID控制算法实现](https://github.com/pid/simulation)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值