《自主移动机器人技术》课件-项目2 ROS2通信机制理论与实践(第2-3章)(第3-9周)_第1页
《自主移动机器人技术》课件-项目2 ROS2通信机制理论与实践(第2-3章)(第3-9周)_第2页
《自主移动机器人技术》课件-项目2 ROS2通信机制理论与实践(第2-3章)(第3-9周)_第3页
《自主移动机器人技术》课件-项目2 ROS2通信机制理论与实践(第2-3章)(第3-9周)_第4页
《自主移动机器人技术》课件-项目2 ROS2通信机制理论与实践(第2-3章)(第3-9周)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年01月13日ROS2通信机制理论与实践CONTENTS目录01

ROS2通信机制概述02

话题通信03

服务通信04

动作通信05

参数服务CONTENTS目录06

通信机制补充内容07

通信机制工具08

通信机制实操练习09

总结与展望ROS2通信机制概述01通信机制的意义与组成要素机器人系统数据交互的必要性机器人系统由多个功能模块组成,模块间需频繁数据交互。如导航路径规划需地图数据、位姿数据、目标点数据等输入,输出路径信息供运动控制或人机交互使用。ROS2通信核心术语:节点节点是通信对象构建的基础,对应单一功能模块,一个可执行文件可包含一个或多个节点,如雷达驱动节点发布雷达消息,摄像头驱动节点发布图像消息。ROS2通信核心术语:话题话题是关联节点的纽带,相同话题的节点可实现跨语言数据交互,无论节点用C++还是Python实现,使用相同话题即可通信。ROS2通信核心术语:通信模型包括话题通信(单向)、服务通信(请求响应)、动作通信(带连续反馈)、参数服务(共享数据)四种,不同模型对应不同数据交互方式。ROS2通信核心术语:接口数据传输的载体,有msg(话题)、srv(服务)、action(动作)文件,定义数据格式,参数通信无需接口文件,数据封装为参数对象。通信模型分类及应用场景话题通信基于发布订阅模式,数据单向传输,适用于不断更新的少逻辑处理场景,如激光雷达、摄像头等传感器数据采集,导航模块发布运动控制信息给底盘驱动模块。服务通信基于请求响应模式,双向交互式数据传输,适用于偶然的、实时性要求高、有逻辑处理的场景,如机器人巡逻时数据分析节点向相机节点发送图片存储请求。动作通信带连续反馈的请求响应模式,适用于耗时任务,可获取过程反馈和取消任务,如机器人导航到目标点,过程中需连续反馈状态信息。参数服务基于共享模式,类似全局变量,用于不同节点共享数据,如导航中全局路径规划和本地路径规划共享车辆尺寸数据(长度、宽度、高度等)。话题通信02话题通信概念与应用场景

发布订阅模式定义话题通信基于发布订阅模式,发布方发布消息,订阅方订阅消息,数据单向从发布方流向订阅方。发布方与订阅方通过话题关联,支持多对多通信,无订阅方时数据会丢失。

典型应用场景适用于不断更新的、少逻辑处理的数据传输场景。例如激光雷达数据采集(节点实时发布雷达数据,导航模块订阅解析)、运动控制指令传输(导航模块发布运动信息,底盘驱动节点订阅转换为电机脉冲信号),以及摄像头、GPS等传感器数据采集。原生消息通信实现(C++/Python)C++实现流程发布方:包含头文件(rclcpp、std_msgs),初始化ROS2客户端,定义节点类(创建发布方、定时器,组织并发布消息),调用spin函数,释放资源。订阅方:包含头文件,初始化ROS2客户端,定义节点类(创建订阅方,处理订阅消息),调用spin函数,释放资源。配置package.xml和CMakeLists.txt,编译后执行发布和订阅程序。Python实现流程发布方:导包(rclpy、Node、std_msgs),初始化ROS2客户端,定义节点类(创建发布方、定时器,组织并发布消息),调用spin函数,释放资源。订阅方:导包,初始化ROS2客户端,定义节点类(创建订阅方,处理订阅消息),调用spin函数,释放资源。配置setup.py,编译后执行发布和订阅程序。核心代码示例单击此处添加项正文自定义消息通信实现.msg文件创建与编辑

在功能包base_interfaces_demo下新建msg文件夹,创建Student.msg文件,定义字段如stringname、int64age、float64height。编译配置

编辑package.xml,添加依赖:、、。编辑CMakeLists.txt,添加find_package(rosidl_default_generatorsREQUIRED),rosidl_generate_interfaces(${PROJECT_NAME}"msg/Student.msg")。编译功能包:colconbuild--packages-selectbase_interfaces_demo。C++与Python使用方法

C++:包含自定义消息头文件,创建发布方/订阅方时指定自定义消息类型,组织消息数据并发布/处理。Python:导入自定义消息,创建发布方/订阅方时指定自定义消息类型,组织消息数据并发布/处理。以学生信息传输案例为例,发布方发送包含姓名、年龄、身高的消息,订阅方接收并输出。服务通信03服务通信概念与应用场景

服务通信的请求响应模式服务通信是基于请求响应的双向交互式通信模型,客户端发送请求数据,服务端接收并处理请求后返回响应结果。

服务通信的核心要素包含客户端(发送请求)、服务端(处理请求并响应)和消息载体(.srv文件定义请求与响应数据格式)。

服务通信的典型应用场景适用于偶然的、实时性要求高、带逻辑处理的场景,如机器人巡逻时发现可疑物体向相机节点发送拍照请求并接收处理结果。服务通信接口定义

.srv文件结构由请求数据和响应数据两部分组成,用---分隔,例如AddInts.srv中,上半部分为int32num1、int32num2(请求),下半部分为int32sum(响应)。

.srv文件创建流程在功能包下新建srv文件夹,创建.srv文件并定义数据结构,编辑package.xml添加依赖(rosidl_default_generators等),修改CMakeLists.txt配置生成接口。

接口编译与测试编译功能包后生成对应C++/Python代码,可通过ros2interfaceshow包名/srv/文件名命令查看接口定义,验证编译是否正常。服务通信实现(C++/Python)

C++服务端实现步骤包含头文件,初始化ROS2客户端,定义节点类(创建服务端、处理请求并响应),调用spin函数,释放资源。例如求和服务端接收num1和num2,计算sum后反馈。

C++客户端实现步骤包含头文件,初始化ROS2客户端,定义节点类(创建客户端、等待服务连接、组织并发送请求),处理响应结果,释放资源。如提交两个整数,接收求和结果。

Python服务端实现步骤导包,初始化ROS2客户端,定义节点类(创建服务端、处理请求并响应),调用spin函数,释放资源。与C++逻辑类似,语法适配Python。

Python客户端实现步骤导包,初始化ROS2客户端,定义节点类(创建客户端、等待服务连接、组织并发送请求),处理响应结果,释放资源。通过命令行参数传递请求数据。动作通信04动作通信概念与应用场景

01动作通信的核心特点动作通信是基于请求-响应模型的扩展,在服务通信基础上增加连续反馈机制,支持任务取消功能,适用于耗时操作(如机器人导航、机械臂运动控制)。

02与服务通信的对比服务通信为单次请求-响应模式,无中间反馈;动作通信在任务执行过程中可实时返回进度信息,并允许客户端中断任务,解决服务通信"假死"问题。

03典型应用场景1.机器人导航至目标点(实时反馈位置、剩余距离);2.工业机械臂装配任务(反馈关节角度、完成百分比);3.长时间数据采集与处理(如激光雷达地图构建)。动作通信接口定义

.action文件结构由三部分组成,使用---分隔:目标(Goal)-请求数据,结果(Result)-最终响应数据,反馈(Feedback)-过程状态数据。

累加求和案例接口定义创建Progress.action文件:int64num(目标:累加上限)---int64sum(结果:累加总和)---float64progress(反馈:进度百分比,如0.3表示30%)。

接口编译与测试1.配置package.xml依赖rosidl_default_generators;2.CMakeLists.txt添加rosidl_generate_interfaces;3.编译后通过ros2interfaceshowbase_interfaces_demo/action/Progress验证接口。动作通信实现(C++/Python)

C++服务端实现1.创建动作服务端,绑定目标处理(handle_goal)、取消处理(handle_cancel)、执行回调(execute);2.执行回调中循环累加1-N,每步计算progress=i/num并publish_feedback;3.任务完成调用succeed(result)返回总和。

C++客户端实现1.创建动作客户端,发送目标请求(num=10);2.绑定反馈回调(打印进度)和结果回调(输出总和);3.通过spin_until_future_complete等待任务完成。

Python实现要点服务端:继承ActionServer,重写execute_callback,循环计算累加和并publish_feedback;客户端:创建ActionClient,调用send_goal_async,通过feedback_callback实时获取进度,结果通过get_result_async获取。动作通信实现(C++/Python)编译与执行1.C++功能包依赖rclcpp、rclcpp_action;2.编译命令:colconbuild--packages-selectcpp03_action;3.执行:服务端ros2runcpp03_actiondemo01_action_server,客户端ros2runcpp03_actiondemo02_action_client。参数服务05参数服务概念与应用场景

参数服务的核心概念参数服务是ROS2中基于共享模式实现节点间数据交互的通信机制,包含参数服务端(存储参数)和参数客户端(操作参数),本质是对服务通信的封装。

参数服务的核心作用类似编程中的“全局变量”,用于在不同节点间共享通用数据,如机器人尺寸、传感器校准值等,避免数据冗余存储和重复传输。

典型应用场景示例导航模块中,全局路径规划与本地路径规划节点共享机器人长度、宽度、高度等尺寸数据,通过参数服务统一管理,确保数据一致性。参数数据类型与操作

支持的数据类型参数值支持bool、int64、float64、string等基础类型,以及byte[]、bool[]等数组类型,由键(字符串)、值(上述类型)和描述符组成。

参数基本操作方法包含声明参数(定义参数及默认值)、查询参数(获取参数值或判断是否存在)、修改参数(更新参数值)、删除参数(移除参数定义)四种核心操作。

C++实现示例通过rclcpp::Node的declare_parameter()声明参数,get_parameter()查询,set_parameter()修改,undeclare_parameter()删除,如声明“car_type”参数并设默认值“Tiger”。

Python实现示例通过rclpy.Parameter类创建参数对象,调用node.declare_parameter()声明,node.get_parameter()查询,node.set_parameters()修改,支持动态参数管理。通信机制补充内容06分布式通信分布式通信概念与作用分布式通信是通过网络在不同主机间实现数据交互的策略,基于DDS中间件,依赖域ID(ROS_DOMAIN_ID)实现节点分组通信。适用于机器人编队、远程控制等多机协作场景,支持跨设备数据交互。域ID设置方法临时设置:终端执行“exportROS_DOMAIN_ID=6”,当前终端节点加入ID为6的域;永久设置:执行“echo"exportROS_DOMAIN_ID=6">>~/.bashrc”,重启终端后所有节点默认使用该域ID。通信规则与注意事项规则:域ID相同的节点可通信,不同则不可;默认域ID为0。注意事项:域ID建议取值[0,101],每个域节点数≤120个,域ID=101时节点数≤54个,避免端口冲突。节点与话题重名处理

重名问题及解决策略节点重名可能导致操作混淆、计算图显示异常;话题重名可能引发通信错乱。解决策略:名称重映射(为节点/话题起别名)和命名空间(添加多级前缀,如/xxx/yyy/zzz)。

节点重名处理方式命令行:“ros2run包名节点名--ros-args--remap__name:=新名称”或“--remap__ns:=命名空间”;launch文件:Python/XML/YAML中通过name和namespace参数设置;编码:rclcpp/rclpy节点构造函数中指定node_name和namespace。

话题重名处理方式命令行:“ros2run包名节点名--ros-args--remap原话题名:=新话题名”;launch文件:Python中通过remappings参数,XML中通过<remap>标签;编码:设置全局话题(/开头)、相对话题(非/开头)或私有话题(~/开头)。时间相关API

01Rate类:控制程序频率用于周期性执行任务,rclcpp中通过“rclcpp::Raterate(1.0)”创建1Hz频率对象,调用rate.sleep()实现休眠;rclpy中通过节点创建rate对象,需在子线程中调用sleep()避免阻塞。

02Time类:获取时间信息rclcpp中可通过“rclcpp::Timet(秒,纳秒)”创建时间对象,或“node->now()”获取当前时刻;rclpy中通过“node.get_clock().now()”获取当前时间,支持seconds()、nanoseconds()等方法获取时间值。

03Duration类与时间运算Duration表示时间间隔,rclcpp中“rclcpp::Durationdu(秒,纳秒)”创建对象;支持Time与Duration的加减运算(如t1+du)及Duration间的比较、乘除运算,rclpy中类似操作通过对应方法实现。通信机制工具07命令行工具01ros2node:节点管理工具提供节点信息查询与列表展示功能,通过ros2nodelist可输出运行中的节点列表,ros2nodeinfo可查看指定节点详细信息,帮助开发者掌握节点运行状态。02ros2topic:话题通信工具支持话题消息发布、频率查看等操作,如ros2topicpub可向指定话题发布消息,ros2topichz能监测消息发布频率,助力验证话题通信的实时性与稳定性。03ros2service:服务通信工具实现服务请求发送与类型查询,使用ros2servicecall可向服务端发送请求,ros2servicetype能查看服务接口类型,便于调试服务端与客户端的交互逻辑。04ros2action:动作通信工具包含动作目标发送与信息查询功能,通过ros2actionsend_goal可提交动作请求,ros2actioninfo能获取动作相关信息,适用于调试带连续反馈的耗时任务通信。命令行工具

ros2param:参数服务工具支持参数的设置、获取与删除,例如ros2paramset可修改参数值,ros2paramget能查询参数当前值,ros2paramdelete可删除指定参数,方便管理节点共享数据。rqt工具箱

rqt工具箱的安装与启动desktop版本ROS2默认安装rqt工具箱,也可通过sudoaptinstallros-humble-rqt*命令安装;启动方式有rqt或ros2runrqt_guirqt_gui,启动后可加载各类插件进行调试。

话题插件:可视化话题交互添加话题插件可发送消息控制节点,如向乌龟节点的/cmd_vel话题发送速度指令,能直观控制乌龟运动,便于验证话题通信功能。

服务插件:便捷服务请求发送通过服务插件可向服务端发送请求,例如调用生成乌龟的服务,能在图形化界面填写请求参数并发送,快速测试服务通信是否正常。

参数插件:动态参数管理利用参数插件可动态修改节点参数,如调整乌龟窗体的背景颜色参数,无需重启节点即可实时查看参数修改效果,提升调试效率。通信机制实操练习08小乌龟案例(话题通信)

案例需求以turtlesim功能包为基础,实现双向控制小乌龟运动,通过话题通信发布速度指令并订阅乌龟位姿信息,巩固发布与订阅的实现流程。

实现思路创建两个节点,一个节点作为速度指令发布方,通过话题/turtle1/cmd_vel发布geometry_msgs/msg/Twist类型消息;另一个节点作为位姿订阅方,订阅/turtle1/pose话题获取乌龟实时位置,实现双向数据交互。

关键步骤1.发布方:初始化节点,创建发布者,按一定频率发布速度指令(线性速度、角速度);2.订阅方:初始化节点,创建订阅者,接收并解析乌龟位姿数据(x、y坐标,朝向角度);3.编译配置:配置package.xml依赖与CMakeLists.txt,编译后运行测试。小乌龟案例(服务通信)

案例需求通过服务通信生成新乌龟,并计算新乌龟与原生乌龟(turtle1)之间的距离,实践服务的请求-响应处理流程。

实现思路调用turtlesim的/spawn服务生成新乌龟(请求包含x、y坐标和名称),创建自定义服务(如/calculate_distance),接收两只乌龟名称,订阅它们的位姿话题计算距离并返回结果。

关键步骤1.生成新乌龟:客户端发送/spawn服务请求,参数包括新乌龟的位置和名称;2.距离计算服务端:创建服务端,接收两只乌龟名称,通过订阅/[乌龟名]/pose话题获取坐标,使用欧氏距离公式计算距离;3.客户端调用:发送乌龟名称请求,接收并打印距离结果。小乌龟案例(动作通信)

案例需求设计小乌龟运动至目标点的练习,通过动作通信实现目标点发送、运动过程中的连续反馈(如当前位置、剩余距离)及任务取消功能。

实现思路自定义动作接口(目标点坐标、反馈进度、结果状态),动作服务端接收目标点后,通过话题发布速度指令控制乌龟运动,实时计算距离目标点的进度并反馈;客户端发送目标点请求,接收反馈并可发送取消指令。

关键步骤1.动作接口定义:.actio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论