在ROS2中,自定义消息(.msg)、服务(.srv)和动作(.action)接口是扩展系统功能的核心。以下以完整工程结构为例,详细说明定义、编译和使用的全流程:
1. 项目结构
custom_interfaces/
├── CMakeLists.txt
├── package.xml
├── msg/
│ ├── MyMessage.msg
│ └── ...
├── srv/
│ ├── MyService.srv
│ └── ...
└── action/
├── MyAction.action
└── ...
user_pkg/ # 使用自定义接口的包
├── CMakeLists.txt
├── package.xml
├── src/
│ ├── publisher_node.cpp
│ ├── subscriber_node.cpp
│ ├── service_server.cpp
│ ├── service_client.cpp
│ ├── action_server.cpp
│ └── action_client.cpp
└── ...
2. 自定义接口定义
消息(.msg)
custom_interfaces/msg/MyMessage.msg:
int32 id
string data
float64[3] values
服务(.srv)
custom_interfaces/srv/MyService.srv:
# 请求部分
string query
---
# 响应部分
bool success
string result
动作(.action)
custom_interfaces/action/MyAction.action:
# 目标(Goal)
int32 target_value
---
# 结果(Result)
bool achieved
float64 final_position
---
# 反馈(Feedback)
float64 progress
3. 编译配置(custom_interfaces包)
CMakeLists.txt关键部分:
cmake_minimum_required(VERSION 3.8)
project(custom_interfaces)
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# 添加消息、服务、动作文件
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/MyMessage.msg"
"srv/MyService.srv"
"action/MyAction.action"
DEPENDENCIES std_msgs
)
ament_package()
package.xml关键依赖:
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
4. 使用自定义接口(user_pkg包)
消息发布/订阅示例
发布者节点(publisher_node.cpp):
#include "rclcpp/rclcpp.hpp"
#include "custom_interfaces/msg/my_message.hpp"
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("msg_publisher");
auto pub = node->create_publisher<custom_interfaces::msg::MyMessage>("my_topic", 10);
auto msg = custom_interfaces::msg::MyMessage();
msg.id = 1;
msg.data = "Hello ROS2";
msg.values = {
1.0, 2.0, 3.0};
rclcpp::Rate loop_rate(1);
while (rclcpp::ok()) {
pub->publish(msg);
loop_rate.sleep

最低0.47元/天 解锁文章
1428

被折叠的 条评论
为什么被折叠?



