【scene_manager_msgs】ROS2 自定义消息、服务的包

scene_manager_msgs
在ROS 1向ROS 2迁移的过程中,有些依赖项发生了变化,这是因为ROS 2的通信框架和工具链与ROS 1不同,尤其在消息、服务和动作生成方面有了一些新的方法和库。

动作库

如果你的ROS 1包依赖于actionlibactionlib_msgs,在迁移到ROS 2时,需要使用ROS 2的原生动作机制来代替。这是因为在ROS 2中,动作库(actionlib)被重新实现,集成进了ROS 2核心的通信框架中,不再需要像ROS 1那样单独依赖actionlib_msgsactionlib。以下是详细的替换和迁移步骤:

1. ROS 1中的actionlibactionlib_msgs

在ROS 1中,actionlib用于处理复杂的长时间操作,特别是那些需要反馈和预先终止的操作。actionlib_msgs包含了动作通信的标准消息类型,如:

  • Goal:客户端发送到服务器的目标。
  • Feedback:服务器定期发送给客户端的反馈。
  • Result:服务器完成任务后发送的结果。

2. ROS 2中的原生动作机制

在ROS 2中,动作接口被直接集成进了ROS 2通信架构中,通过rclcpp_action(C++)或rclpy_action(Python)来处理。动作在ROS 2中作为一种独立的接口,与消息和服务一起被支持。ROS 2的动作机制改进了性能、简化了开发流程,并且通过rosidl接口定义语言来生成动作接口。

主要区别:
  • 内置支持:在ROS 2中,动作系统是核心架构的一部分,直接使用与消息和服务相同的rosidl工具链。
  • 生成方式:动作文件(.action)可以直接与消息和服务一起通过rosidl_generate_interfaces生成。

3. 迁移步骤

(1) 定义动作文件(.action

在ROS 1中,你可能有一个.action文件。迁移到ROS 2时,这些文件不需要改变语法,但是要确保它们遵循ROS 2的生成规则。一个标准的.action文件如下:

# 定义目标(Goal)
int32 goal_value
---
# 定义结果(Result)
int32 result_value
---
# 定义反馈(Feedback)
float32 feedback_value
(2) 在CMakeLists.txt中生成动作接口

在ROS 2中,你需要使用rosidl_generate_interfaces来生成动作、消息和服务的接口。将以下内容添加到CMakeLists.txt中:

find_package(rosidl_default_generators REQUIRED)set(ACTION_FILES"action/MyAction.action"
)rosidl_generate_interfaces(${PROJECT_NAME}${ACTION_FILES}DEPENDENCIES std_msgs
)

ACTION_FILES变量中列出了你的.action文件。rosidl_generate_interfaces会生成C++和Python代码,供你的动作服务器和客户端使用。

(3) 修改代码以使用ROS 2的动作API

在ROS 1中,你可能用过actionlib::SimpleActionClientactionlib::SimpleActionServer。在ROS 2中,需要改用rclcpp_action::Clientrclcpp_action::Server(C++),或者用rclpy.action.ActionClientrclpy.action.ActionServer(Python)。

C++动作客户端(ROS 2)示例:

#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "my_package/action/my_action.hpp"class MyActionClient : public rclcpp::Node {
public:using MyAction = my_package::action::MyAction;using GoalHandleMyAction = rclcpp_action::ClientGoalHandle<MyAction>;MyActionClient() : Node("my_action_client") {this->client_ = rclcpp_action::create_client<MyAction>(this, "my_action");// 检查服务器是否可用if (!this->client_->wait_for_action_server(std::chrono::seconds(10))) {RCLCPP_ERROR(this->get_logger(), "Action server not available after waiting");return;}// 发送目标auto goal_msg = MyAction::Goal();goal_msg.goal_value = 42;auto goal_options = rclcpp_action::Client<MyAction>::SendGoalOptions();goal_options.result_callback = std::bind(&MyActionClient::result_callback, this, std::placeholders::_1);this->client_->async_send_goal(goal_msg, goal_options);}private:rclcpp_action::Client<MyAction>::SharedPtr client_;void result_callback(const GoalHandleMyAction::WrappedResult & result) {RCLCPP_INFO(this->get_logger(), "Result received: %d", result.result->result_value);}
};int main(int argc, char ** argv) {rclcpp::init(argc, argv);auto node = std::make_shared<MyActionClient>();rclcpp::spin(node);rclcpp::shutdown();return 0;
}

C++动作服务器(ROS 2)示例:

#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "my_package/action/my_action.hpp"class MyActionServer : public rclcpp::Node {
public:using MyAction = my_package::action::MyAction;using GoalHandleMyAction = rclcpp_action::ServerGoalHandle<MyAction>;MyActionServer() : Node("my_action_server") {this->server_ = rclcpp_action::create_server<MyAction>(this,"my_action",std::bind(&MyActionServer::handle_goal, this, std::placeholders::_1, std::placeholders::_2),std::bind(&MyActionServer::handle_cancel, this, std::placeholders::_1),std::bind(&MyActionServer::handle_accepted, this, std::placeholders::_1));}private:rclcpp_action::Server<MyAction>::SharedPtr server_;rclcpp_action::GoalResponse handle_goal(const rclcpp_action::GoalUUID & uuid,std::shared_ptr<const MyAction::Goal> goal) {RCLCPP_INFO(this->get_logger(), "Received goal request with value %d", goal->goal_value);return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;}rclcpp_action::CancelResponse handle_cancel(const std::shared_ptr<GoalHandleMyAction> goal_handle) {RCLCPP_INFO(this->get_logger(), "Received request to cancel goal");return rclcpp_action::CancelResponse::ACCEPT;}void handle_accepted(const std::shared_ptr<GoalHandleMyAction> goal_handle) {std::thread{std::bind(&MyActionServer::execute, this, goal_handle)}.detach();}void execute(const std::shared_ptr<GoalHandleMyAction> goal_handle) {RCLCPP_INFO(this->get_logger(), "Executing goal");// 在这里执行动作,并发送反馈或结果auto result = std::make_shared<MyAction::Result>();result->result_value = 42;goal_handle->succeed(result);}
};int main(int argc, char ** argv) {rclcpp::init(argc, argv);auto node = std::make_shared<MyActionServer>();rclcpp::spin(node);rclcpp::shutdown();return 0;
}

4. 更新依赖项

package.xml中,确保你已经包含了ROS 2的相关依赖项,例如:

<depend>rclcpp_action</depend>
<depend>rosidl_default_generators</depend>

错误信息:

使用 colcon build 构建过程中遇到的错误提示表明了 scene_manager_msgs 这个 ROS 2 包的 package.xml 文件存在一个特定问题。错误信息指出你的包缺少一个必需的声明,这是定义自定义消息、服务的包所必需的。

Packages installing interfaces must include
'<member_of_group>rosidl_interface_packages</member_of_group>' in their
package.xml

告诉我们需要在 package.xml 中声明该包是 rosidl_interface_packages 组的一部分。因为在ROS 2中,负责定义消息、服务和动作接口的包必须向构建系统声明它们是接口包的一部分。这是为了让构建工具正确处理这些自定义接口,确保生成消息、服务和动作所需的代码。

如何修复

你需要在 package.xml 中添加一个 member_of_group 标签,将你的包包含在 rosidl_interface_packages 组中。这样可以告诉 ROS 构建工具你的包提供了需要处理的自定义接口。

  1. 打开你的 package.xml 文件。
  2. <package> 标签内添加以下行:
<member_of_group>rosidl_interface_packages</member_of_group>

这一行应该添加在顶级 <package> 标签内部,但在任何特定依赖声明之外。

更新后的 package.xml 示例

在修改后,你的 package.xml 部分内容可能如下所示:

<?xml version="1.0"?>
<package format="3"><name>scene_manager_msgs</name><version>0.0.1</version><description>用于场景管理的消息和服务的包</description><maintainer email="your-email@example.com">你的名字</maintainer><license>BSD</license><!-- 将此包包含在 rosidl_interface_packages 组中 --><member_of_group>rosidl_interface_packages</member_of_group><buildtool_depend>ament_cmake</buildtool_depend><depend>std_msgs</depend><depend>geometry_msgs</depend><depend>builtin_interfaces</depend><depend>rosidl_default_generators</depend><exec_depend>rosidl_default_runtime</exec_depend>
</package>

修改后的步骤

一旦你添加了这一行,应该:

  • 保存 package.xml 文件。
  • 重新运行构建命令:
colcon build --packages-select scene_manager_msgs

这应该会解决构建错误,允许 colcon 构建工具正确识别并处理你包的自定义接口。

详细解释:

  1. rosidl_interface_packages 组的作用
    在ROS 2中,rosidl(ROS Interface Definition Language)负责处理消息、服务和动作的定义和生成。所有涉及定义这些接口的包,都需要被归类为rosidl_interface_packages组的成员。通过将包声明为该组的一部分,ROS 2的构建系统可以识别该包包含自定义接口,并生成必要的消息、服务或动作文件。

  2. 生成自定义接口的流程
    当你在包中定义了消息(.msg)、服务(.srv)或动作(.action)文件时,构建工具会通过rosidl_generate_interfaces命令生成这些接口所需的C++或Python代码。然而,为了让构建系统知道你的包中包含这些接口文件,必须在package.xml中通过<member_of_group>标签将该包添加到rosidl_interface_packages组。

  3. 缺少声明的后果
    如果不将包加入到rosidl_interface_packages组,构建系统在处理这些消息和服务文件时将无法识别它们,进而无法生成必要的代码。这就会导致构建失败或在运行时无法找到相应的消息和服务接口。因此,缺少这个声明会导致类似于你之前遇到的错误。

包含消息和服务的包

从你提供的 CMakeLists.txt 文件来看,scene_manager_msgs 包定义了消息(msg/Layout.msg)和服务(如 srv/ModifyObject.srv 等),但并没有定义动作文件(.action 文件)。因此,这个包不是一个动作包,而是一个包含消息和服务的包。

动作包的定义:

  • 动作包(Action Package)通常会定义 .action 文件,这些文件用于定义长时间运行的任务,通常需要反馈机制。动作在ROS 2中可以使用 rclcpp_actionrclpy_action 库进行操作。

  • 如果这个包是一个动作包,你的 CMakeLists.txt 文件中应该有对 .action 文件的定义,比如:

    set(ACTION_FILES"action/MyAction.action"
    )rosidl_generate_interfaces(${PROJECT_NAME}${MSG_FILES}${SRV_FILES}${ACTION_FILES}DEPENDENCIES std_msgs geometry_msgs builtin_interfaces
    )
    

当前的 CMakeLists.txt 说明:

  • 你定义了消息文件 msg/Layout.msg 和服务文件 srv/ModifyObject.srvsrv/SelectObjects.srvsrv/MoveTo.srv
  • 没有提到 .action 文件,因此该包没有动作接口。

总结:

  • 不是动作包:由于没有定义动作文件(.action),这个包目前是一个消息和服务的包,而不是动作包。
  • 如何添加动作:如果你希望将其扩展为一个动作包,你需要定义 .action 文件,并在 CMakeLists.txt 中增加动作生成的配置。

消息(.msg)和服务(.srv)文件本身通常不需要修改其定义结构,因为ROS 2仍然使用相同的格式来定义这些文件

在将ROS 1软件包迁移到ROS 2时,消息(.msg)和服务(.srv)文件本身通常不需要修改其定义结构,因为ROS 2仍然使用相同的格式来定义这些文件。然而,你可能需要进行一些更新以确保这些定义与ROS 2的接口兼容和一致。

需要考虑的修改点:

  1. 依赖检查

    • 确保消息和服务文件中使用的类型在ROS 2中是有效的。例如,如果使用了geometry_msgs/PoseStamped,确保ROS 2中包含此类型。
    • 检查是否所有依赖的包都已经被迁移到ROS 2并在package.xmlCMakeLists.txt中正确引用。
  2. 包和类型的更新

    • 在ROS 2中,某些消息类型可能已经更新或替换。尽管大部分标准消息类型如std_msgsgeometry_msgs在ROS 2中仍然可用,但一些特定类型或属性可能已经有所改变。
    • 确保使用的类型与ROS 2的命名和结构标准一致。
  3. 服务定义的格式

    • 服务文件在ROS 1和ROS 2中的定义方式保持一致,格式为请求部分,一个---分割符,然后是响应部分
    • 确认服务文件的请求和响应部分是否符合你的应用需求,并考虑是否需要进行更新以利用ROS 2提供的新特性或改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拍立淘API返回值中的商品列表与详细信息解析

拍立淘&#xff08;Pailitao&#xff09;是阿里巴巴旗下的一种图像识别购物技术&#xff0c;允许用户通过拍摄商品照片来搜索相似的商品。尽管官方没有直接开放拍立淘的API给公众使用&#xff0c;但可以通过淘宝开放平台&#xff08;Taobao Open Platform&#xff09;的一些图像…

Python logging模块实现日志饶接 按照时间命名

import os import zipfile from datetime import datetime from logging.handlers import RotatingFileHandlerclass CompressedRotatingFileHandler(RotatingFileHandler):"""自定义的 RotatingFileHandler&#xff0c;支持在日志轮转时压缩旧日志文件&#xf…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同&#xff0c;布隆过滤器无法删除元素&#xff0c;并且会存在一定的误判率&…

用示波器观测RC一阶电路零输入响应是否激励必须是方波信号

概述 RC一阶电路是一种简单但非常重要的电路&#xff0c;广泛应用于滤波、信号处理和时间常数分析等领域。在研究RC电路的动态特性时&#xff0c;零输入响应&#xff08;Natural Response&#xff09;是一项关键内容。本文将详细解析用示波器观测RC一阶电路零输入响应时&#…

开发语言最佳实践

目录 一、开发IOS最好的语言是什么&#xff1f; 二、开发安卓的最好语言是什么&#xff1f; 三、开发鸿蒙应用最好的语言是什么&#xff1f; 四、做大模型训练最好的开发语言是什么&#xff1f; 一、开发IOS最好的语言是什么&#xff1f; 开发iOS最好的语言是Swift。Swift…

C#学习笔记(六)

C#学习笔记&#xff08;六&#xff09; 第 三 章 基本语句以及语法二、程序逻辑 if 选择和分支结构 switch1. if2. switch 三、循环语句1. for 循环的使用2. while 循环的使用3. 对比 break 和 continue 第 四 章 字符串 string 详解和高效 StringBuilder 类暂不练习与学习。 第…

CAD快捷键大全非常详细

绘图菜单 快捷键 注意事项 1.线 L 2.构造线 XL 3.多段线 PL 一般用来画三维图 4.正多边形 POL 5.矩形 REC 6.圆弧 A 7.圆 C 8.修订云线 REVCLOUD 9.样条曲线 SPL 10.椭圆 EL 轴测图&#xff1a;ELI 11.椭圆弧…

如何实现安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯

在工业自动化中&#xff0c;实现不同品牌、不同型号设备之间的通讯是确保生产流程顺畅、高效运行的关键。本文详细介绍了安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯的具体方法。 一&#xff0e;软硬件需求 1.一台安川MP3300CPU301&#xff0c;其IP地址是192.…

SpringCloudAlibaba升级手册

目录 1. 版本对照 版本现状 SpringCloud与AlibabaCloud对应版本 Springboot与Elasticsearch版本对应 2. openfeign问题 问题 解决方案 3. Feign请求问题 问题 解决方法 4. Sentinel循环依赖 问题 解决方案 5. bootstrap配置文件不生效 问题 解决方案 6. Nacos的…

Codeforces Round 929 (Div. 3) F. Turtle Mission: Robot and the Earthquake

题目 题解&#xff1a; 按题解思路的代码&#xff1a; #include <bits/stdc.h>using i64 long long;void solve() {int n, m;std::cin >> n >> m;std::vector a(n, std::vector<int>(m));for (int i 0; i < n; i) {for (int j 0; j < m; j) …

STM32—SPI通讯协议

前言 由于I2C开漏外加上拉电阻的电路结构&#xff0c;使得通信线高电平的驱动能力比较弱&#xff0c;这就会号致&#xff0c;通信线由候电平变到高电平的时候&#xff0c;这个上升沿耗时比较长&#xff0c;这会限制I2C的最大通信速度&#xff0c; 所以&#xff0c;I2C的标准模…

uniapp-小程序开发0-1笔记大全

uniapp官网&#xff1a; https://uniapp.dcloud.net.cn/tutorial/syntax-js.html uniapp插件市场&#xff1a; https://ext.dcloud.net.cn/ uviewui类库&#xff1a; https://www.uviewui.com/ 柱状、扇形、仪表盘库&#xff1a; https://www.ucharts.cn/v2/#/ CSS样式&…

经纬恒润荣获2024中国汽车供应链大会创新成果奖

2024年9月24日-26日&#xff0c;2024中国汽车供应链大会暨第三届中国新能源智能网联汽车生态大会在武汉隆重举办。本届大会以“新挑战、新对策、新机遇——推动中国汽车供应链可持续发展”为主题&#xff0c;集聚政府主管领导、行业专家、汽车及零部件企业精英和主流媒体&#…

Ubuntu24.04 安装 NCAR Command Language(NCL)

目录 一般直接在Terminal中使用apt安装命令即可&#xff0c; 出现这样的问题&#xff0c; 如何解决这个问题呢&#xff1f; 一般直接在Terminal中使用apt安装命令即可&#xff0c; sudo apt install ncl-ncarg 但是&#xff0c;由于 Ubuntu 版本较新 Ubuntu 24.04&#xff…

Application protocol

### 11 应用协议 #### 11.1 通用程序 - 涉及不同类型文件的程序应遵循3GPP TS 31.101 [55]的规定&#xff0c;但不支持使用短文件ID。 #### 11.2 SIM管理程序 - 包括SIM初始化、GSM会话终止、紧急呼叫代码请求、语言偏好请求、行政信息请求、SIM阶段请求等。 - SIM初始化包括…

Python OpenCV精讲系列 - 三维重建深入理解(十七)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

迪杰斯特拉算法的理解

图片转载自&#xff1a;最短路径算法-迪杰斯特拉(Dijkstra)算法 - 程序小哥爱读书的文章 - 知乎 https://zhuanlan.zhihu.com/p/346558578 迪杰斯特拉&#xff0c;一个广度优先算法&#xff0c;采用了贪心策略。 第一步&#xff0c;选取顶点D&#xff0c;更新和D相连的节点C&a…

78天闭门深造1258页SpringCloud学习进阶笔记,再战蚂蚁金服

概述 作为一名程序员应该都知道SpringCloud&#xff0c;不知道就该反思一下了啊[奸笑]。所以就不有板有眼的和官方的介绍一样了&#xff0c;今天就说一下&#xff0c;我理解的SpringCloud是什么&#xff1a;我所理解的Spring Cloud就是微服务系统架构的一站式解决方案&#xf…

Java项目: 基于SpringBoot+mysql+maven+vue林业产品推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenvue林业产品推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操…

Python-计算三角形面积的方法

&#xff03;Python创建用于计算的属性 &#xff03;定义一个三角形类&#xff0c;在__init__&#xff08;&#xff09;方法中定义实例属性. &#xff03;定义一个计算三角形面积的方法&#xff0c;并应用&#xff20;property将其转换为属性&#xff0c;最后创建类的实例&am…