OS机器及编程开发 3_第1页
OS机器及编程开发 3_第2页
OS机器及编程开发 3_第3页
OS机器及编程开发 3_第4页
OS机器及编程开发 3_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

第2章ROS2程序编写content目录01构建开发环境:ROS2工作区与功能包基础02C++节点开发:实现发布器与订阅器通信03Python节点开发:快速构建可执行节点04通信机制深化:服务、客户端与自定义消息05综合实践与能力提升构建开发环境:ROS2工作区与功能包基础01理解ROS2工作区的概念及其在项目组织中的核心作用工作区定义ROS2工作区是存放源码、构建和安装功能包的根目录,为项目提供统一的开发与编译环境。核心作用集中管理多个功能包,支持依赖解析与整体构建,是ROS2项目组织和协作开发的基础单元。目录结构典型工作区包含src(源码)、build(中间文件)、install(可执行文件)和log(构建日志)目录。通过mkdir和gitclone命令初始化并填充ros2_ws工作区创建工作区目录使用mkdir-p~/ros2_ws/src创建标准ROS2工作区结构,确保src子目录用于存放源代码包。进入源码路径执行cd~/ros2_ws/src命令进入工作区源码目录,为后续克隆示例代码做好准备。克隆官方示例运行gitclone/ros2/examplessrc/examples-bfoxy获取ROS2官方示例代码,填充工作区内容。验证目录结构克隆后检查src目录,确认examples包已正确下载,包含rclcpp、rclpy等核心示例模块。使用colconbuild工具完成工作区的首次构建并解析生成的目录结构执行构建命令在工作区根目录运行colconbuild,启动编译流程,自动识别src中的功能包并进行构建。构建过程解析colcon按依赖顺序构建包,编译源码、生成可执行文件,并收集各包的输出信息。生成核心目录构建成功后生成build、install和log三个目录,分别存放中间文件、最终产物和日志。安装空间结构install目录下每个包有独立文件夹,包含可执行文件、库及setup文件,用于环境配置。掌握ament构建系统与colcon构建工具的协同工作机制01ament角色ament是ROS2的构建系统,负责编译流程管理与依赖解析。它定义安装规则,确保代码正确集成。为构建提供标准化规范。02colcon作用colcon是命令行构建工具,驱动整个工作区的构建过程。它支持并行编译,提升构建效率。负责执行实际构建任务。03依赖解析ament分析包之间的依赖关系。确保被依赖项优先处理。为构建顺序提供依据。04编译顺序colcon根据依赖自动确定编译次序。保证模块按正确顺序编译。避免因顺序错误导致的构建失败。05并行构建colcon支持多包并发编译。充分利用系统资源缩短构建时间。提高开发迭代效率。06安装规则ament定义文件安装路径与目标位置。控制产物的布局结构。确保部署一致性。07协同机制ament提供构建规范,colcon负责执行。二者分离设计提升灵活性。实现高效构建流程。08可扩展性该架构支持大型ROS2项目。易于集成新包与工具。适应复杂工程需求。创建功能包的标准化流程:从ros2pkgcreate到文件结构生成创建功能包使用ros2pkgcreate命令在src目录下快速生成符合ament构建规范的功能包骨架,简化初始化流程。指定构建类型在创建时明确指定构建类型,确保功能包适配ament_cmake或其他所需构建系统,保障编译兼容性。生成配置文件工具自动生成CMakeLists.txt和package.xml文件,减少手动配置错误,提升项目规范性。建立源码结构自动创建标准源码目录结构,便于组织管理代码,支持快速开展后续开发工作。初始化节点文件通过--node-name参数自动生成节点源文件,为发布器/订阅器等通信逻辑提供直接可编辑的起点。提升开发效率一体化生成项目框架与关键文件,显著减少前期准备时间,加快ROS2应用开发迭代速度。完善package.xml元信息并配置CMakeLists.txt构建脚本编辑元信息在package.xml中补充包的描述、维护者、许可证及依赖项,确保元数据完整规范。声明依赖添加<depend>rclcpp</depend>和<depend>std_msgs</depend>,声明编译与运行所需依赖。配置构建脚本在CMakeLists.txt中使用find_package引入rclcpp和std_msgs,建立编译链接关系。注册可执行文件通过add_executable和ament_target_dependencies将源文件构建成可执行节点。将自定义功能包纳入环境变量,实现ros2run命令的无缝调用环境变量作用使系统识别自定义功能包路径,确保ros2run命令可直接调用生成的可执行文件。加载setup文件在终端执行sourceinstall/setup.bash,导入工作区环境配置至当前shell会话。验证包可见性使用ros2pkglist确认新创建的功能包已被系统识别并列入可用包列表中。运行自定义节点通过ros2run<package_name><node_name>启动节点,验证环境配置与节点执行正常。C++节点开发:实现发布器与订阅器通信02设计基于类封装的MinimalPublisher节点结构,继承rclcpp::NodeROS节点开发类继承设计继承rclcpp::Node,实现节点功能封装。提升模块化与可复用性,便于代码维护。构造函数初始化设置节点名称,初始化发布器与定时器。配置主题名和消息队列大小,确保通信稳定。成员变量管理publisher_用于发布消息,保证通信输出。timer_触发周期任务,count_记录状态数据。回调机制绑定使用std::bind将成员函数绑定到定时器。实现timer_callback周期调用,驱动消息发布。发布器配置指定主题名称,定义消息传输通道。设置队列长度,控制缓存中待发消息数量。定时器控制设定周期时间,触发回调函数执行。保障消息按固定频率发布,维持系统节奏。利用create_publisher接口发布std_msgs::msg::String类型消息01创建发布器在节点构造函数中调用create_publisher,指定主题名、消息类型和队列长度,初始化发布端。02消息类型使用std_msgs::msg::String作为标准字符串消息类型,支持跨节点文本数据传输。03主题配置发布器绑定到'topic'主题,需与订阅器主题一致,确保通信链路正确建立。04发布流程在定时回调中构造消息对象,填充数据并调用publish()发送,实现周期性消息输出。配置定时器回调函数timer_callback,实现周期性消息发布逻辑01创建定时器在构造函数中设置500毫秒周期的定时器,确保定时触发。定时器用于驱动周期性任务执行。该机制保障了时间精度。02绑定回调函数将成员函数timer_callback绑定为定时器回调。每次定时触发时自动调用该函数。实现事件驱动的消息生成。03生成新消息在回调中实例化消息对象。填充字符串数据与计数信息。为发布做准备。04递增计数器每次触发时将计数变量加一。用于标识消息序列。保证数据的连续性与顺序性。05填充数据内容将递增后的计数写入消息字符串字段。形成可读的消息内容。便于接收端验证与调试。06发布消息通过发布器将消息广播到对应主题。实现节点间通信。确保消息及时发出。07实现稳定频率利用定时器维持500ms周期发布。达到2Hz的发布频率。保证通信节奏一致。08保障通信连续周期性发布增强系统可预测性。有利于订阅者稳定接收数据。提升整体通信可靠性。通过RCLCPP_INFO宏输出日志信息,验证消息发布状态日志作用RCLCPP_INFO用于在控制台输出节点运行状态,帮助开发者实时验证消息发布是否成功。宏的用法通过RCLCPP_INFO(this->get_logger(),"Publishing:'%s'",message.data.c_str())打印发布内容。调试支持每条日志包含节点名和时间戳,便于追踪通信时序,定位发布频率或数据异常问题。运行反馈终端持续显示发布消息如'HelloWorld:0',直观确认发布器按周期正常工作。编写MinimalSubscriber类并注册topic_callback处理接收到的数据定义订阅类创建MinimalSubscriber类继承rclcpp::Node,初始化节点名为minimal_subscriber。注册回调函数在构造函数中使用create_subscription创建订阅对象,并绑定topic_callback处理消息。处理接收数据在topic_callback中通过RCLCPP_INFO输出接收到的消息内容,实现数据回显功能。使用create_subscription建立主题监听,完成消息回显功能创建订阅类继承rclcpp::Node创建MinimalSubscriber类,初始化节点名为minimal_subscriber。绑定回调函数使用create_subscription注册主题回调,接收std_msgs::msg::String类型数据。实现消息回显在topic_callback中通过RCLCPP_INFO打印接收到的消息,完成通信验证。联合运行talker与listener节点,借助rqt_graph可视化通信拓扑启动发布器在终端执行ros2runcpp_pubsubtalker,发布器以0.5秒间隔向topic发布'HelloWorld'消息。启动订阅器另开终端运行ros2runcpp_pubsublistener,订阅器实时接收并打印来自发布器的消息内容。可视化通信使用rqt_graph工具可直观查看minimal_publisher与minimal_subscriber通过topic建立的连接关系。Python节点开发:快速构建可执行节点03创建ament_python类型功能包,适配Python特有的setup.py配置方式创建Python包使用ros2pkgcreate命令并指定--build-typeament_python,生成适配Python的包结构。核心配置文件setup.py替代CMakeLists.txt定义包元信息与入口点,声明可执行节点启动脚本。入口点设置在setup.py中通过console_scripts注册节点入口,实现ros2run调用Python脚本。编写talker.py发布节点,使用rclpy.Node与create_publisher接口节点通信节点创建继承rclpy.Node类,实现模块化设计。定义talker节点,封装发布功能逻辑。发布器配置使用create_publisher方法设置消息类型。指定主题名和队列大小,建立发布通道。消息发送循环调用publish方法,持续发布String消息。控制发送频率,保证通信的稳定性。日志输出通过RCLCPP_INFO打印运行状态信息。辅助调试与监控,提升系统可观测性。话题通信基于主题的异步通信机制,解耦发布与订阅。支持多对多通信,适用于分布式系统。消息类型使用String标准消息类型传输文本数据。可扩展为自定义消息类型以满足复杂需求。设置ROS2时间速率控制(Rate)以维持稳定的发布频率引入Rate类使用rclpy.Rate控制循环频率,确保节点按指定速率执行发布任务。设定发布周期通过Rate(10)设置10Hz循环频率,使消息每秒稳定发布10次。配合循环运行在while循环中调用rate.sleep(),自动处理时间同步与延迟补偿。实现listener.py订阅节点并绑定回调函数处理传入消息创建节点文件在scripts目录下创建listener.py文件,用于定义ROS2订阅者节点,实现消息监听功能。该文件将包含节点初始化和消息处理逻辑。初始化ROS节点调用rclpy.init_node()初始化ROS2节点,确保通信环境准备就绪。设置唯一节点名称以避免与其他实例冲突。定义订阅主题指定要监听的ROS2话题名称,确保与发布者一致。通过主题绑定实现消息的定向接收。注册回调函数使用Subscriber注册回调函数,当新消息到达时自动触发执行。实现事件驱动的消息处理机制。实现数据处理在回调函数中对接收到的消息进行处理,提取有效数据。可扩展用于复杂逻辑或外部系统交互。输出消息内容使用loginfo打印接收到的消息内容,实现信息回显功能。便于调试和验证通信是否正常。保持节点运行通过rclpy.spin()维持节点持续运行,监听消息流。确保系统实时响应新到来的数据。资源清理释放程序结束时正确关闭节点,释放ROS2相关资源。保证系统稳定性和后续操作的可行性。通过ros2launch启动Python脚本并观察控制台输出结果01启动准备确保已编译功能包并正确配置环境变量,使系统可识别新节点。02运行发布器使用ros2run命令启动talker.py,验证周期性消息发布功能。03启动订阅器在新终端中运行listener.py,接收并打印来自发布器的消息。04输出验证观察控制台日志,确认消息内容与时间戳正确传递与显示。对比C++与Python版本在语法结构、依赖管理和执行效率上的差异语法简洁性Python代码更简洁直观,无需显式声明类型和头文件,适合快速原型开发。依赖管理差异C++依赖通过CMakeLists.txt配置,Python则在setup.py中声明,管理方式更灵活。执行效率对比C++节点启动快、资源占用低,适合实时控制;Python更适合逻辑简单、迭代频繁的场景。总结两种语言在原型验证与工程部署中的适用场景开发效率Python语法简洁,无需编译,适合快速验证逻辑和调试通信流程。执行性能C++节点启动快、资源占用低,更适合实时控制和高频率任务。部署适用性C++更适用于资源受限的嵌入式系统和产品级机器人部署。生态兼容性Python便于集成AI、视觉库,是算法原型与上层逻辑的理想选择。通信机制深化:服务、客户端与自定义消息04引入服务(Service)模型,理解其请求-响应同步通信特性01通信模式对比发布/订阅为异步通信,适用于持续数据流;服务为同步请求-响应,适用于需即时反馈的操作。02服务模型结构服务由客户端发送请求,服务端处理后返回响应,实现一对一的双向同步通信机制。03典型应用场景适用于需要明确结果的操作,如参数查询、任务触发、计算服务等实时交互场景。04核心通信特征请求发出后阻塞等待响应,通信具有时序性和完整性,确保每次交互都有明确结果。使用add_two_ints示例演示服务端与客户端的交互流程服务模型服务采用请求-响应模式,实现节点间同步通信,适用于需即时反馈的场景。服务端实现服务节点等待客户端请求,接收两个整数并返回其和,处理逻辑在回调函数中定义。客户端调用客户端发送包含两个整数的请求,并持续监听响应结果,成功后输出计算答案。交互验证通过ros2run启动服务与客户端,传入参数如2和3,终端显示结果为5,验证通信正确。通过ros2servicecall命令手动触发远程过程调用服务调用指令使用ros2servicecall可直接向服务端发送请求,无需启动客户端节点,便于调试和测试。命令语法结构指定服务名、接口类型及参数值,格式为:ros2servicecall<name><type>'<request>'。手动触发示例执行ros2servicecall/add_two_intsexample_interfaces/srv/AddTwoInts'{a:2,b:3}'可立即获得计算结果。调试与验证通过命令行快速验证服务逻辑正确性,是开发过程中高效排查问题的重要手段。定义自定义.msg文件以扩展标准消息类型,满足特定应用需求为何需自定义标准消息类型无法满足复杂数据结构需求,自定义.msg可描述专属数据格式。消息文件结构.msg文件由字段类型和名称组成,每行定义一个数据成员,支持嵌套消息。创建与声明在功能包中新建msg目录并编写.msg文件,需在package.xml中声明构建依赖。编译与使用通过CMakeLists.txt配置生成目标,构建后可在节点中包含并使用新消息类型。在package.xml和CMakeLists.txt中声明自定义消息依赖关系添加消息依赖在package.xml中添加<depend>自定义消息包名</depend>,确保构建系统识别消息类型依赖。配置CMakeLists使用find_package(自定义消息包REQUIRED)并在ament_target_dependencies中声明依赖关系。生成目标链接通过add_executable将节点与源文件关联,并在install中导出可执行文件路径供ros2run调用。构建包含自定义消息的功能包并验证其跨节点传输能力定义消息结构在功能包的msg目录下创建Person.msg文件,声明name和age字段,定义自定义数据结构。该文件用于生成跨节点通信的消息类型。配置依赖关系修改package.xml,添加message_generation和message_runtime依赖,确保构建系统识别并支持消息编译。启用生成插件在CMakeLists.txt中配置find_package和generate_messages,启用消息生成插件,使msg文件在编译时自动生成对应语言代码。验证消息通信编写发布者与订阅者节点,发送并接收Person类型消息,通过终端输出确认数据正确传输,完成自定义消息的端到端验证。综合实践与能力提升05回顾从零搭建ROS2开发环境的完整技术路径ROS2项目构建工作区创建创建ros2_ws目录作为工作区根目录,统一管理项目文件。在工作区中建立src源码目录,用于存放功能包代码。功能包生成使用ros2pkgcreate命令创建标准化功能包结构。自动生成package.xml和CMakeLists.txt配置文件。代码编译执行colconbuild命令对src中的功能包进行编译。编译结果输出到build和install目录,生成可执行文件。环境配置加载setup.bash脚本,使ROS2环境变量生效。确保节点能够被系统识别并正确调用依赖库。节点运行启动已编译的节点程序,验证其功能是否正常。通过ros2nodelist命令查看当前活跃的节点列表。系统集成将多个功能包协同整合,实现完整的机器人系统功能。通过话题、服务等机制实现节点间通信与数据交互。归纳发布/订阅模型作为ROS2分布式通信基石的设计哲学解耦设计发布者与订阅者无需预先了解对方,实现逻辑分离。这种松耦合结构提升了系统的灵活性和可维护性。系统组件可独立扩展与替换。异步通信消息传递基于异步机制,提高系统响应速度。支持节点以不同速率运行,增强容错能力。适用于高并发与延迟敏感场景。主题消息通过主题进行消息路由,实现精准分发。发布者发送至主题,订阅者按需订阅。提升消息传输的灵活性与效率。多对多通信多个发布者可向多个订阅者发送消息。支持广播与组播模式。满足复杂网络环境下的协同需求。实时响应异步与解耦结合,提升系统实时处理能力。消息队列保障数据及时传递。适用于动

温馨提示

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

评论

0/150

提交评论