
测试版本ubuntu22.04ROS2 humble新建msg功能包ros2 pkg create msg功能包名 --build-type ament_cmake --dependencies 依赖名字新建msg文件夹并在其中新建.msg文件文件名首字母要大写里面按“类型 变量名”格式写入话题消息类型配置CMakeList增加如下代码改成自己的msg文件名如果只有一个msg就只写一个find_package(rosidl_default_generators REQUIRED) # 这行如果没有就加上有的话就不管 rosidl_generate_interfaces(${PROJECT_NAME} msg/MyMessage1.msg msg/MyMessage2.msg )如果和我一样.msg文件还引用了其他包的消息类型如std_msg的header还需要加入find_package(std_msgs REQUIRED)并在刚才的rosidl_generate_interfaces里面加入DEPENDENCIES std_msgs # 声明 std_msgs 依赖配置package.xml增加如下代码build_dependrosidl_default_generators/build_depend exec_dependrosidl_default_generators/exec_depend member_of_grouprosidl_default_generators/member_of_group member_of_grouprosidl_interface_packages/member_of_group如果引用了其他包的消息类型如std_msg的header还需要加入build_dependstd_msgs/build_depend exec_dependstd_msgs/exec_depend可以用指令看看有没有配好ros2 pkg list | grep msg功能包名代码中引用CC文件还需要配置其功能包中的CMakeList不是msg功能包的CMakeList增加下面的代码find_package(msg功能包名 REQUIRED) # 添加消息包依赖如果还msg中用了其他功能包的消息类型如std_msgs还需要加入对应的功能包依赖例如find_package(std_msgs REQUIRED)并在所有的ament_target_dependencies里面加入自定义的msg功能包名如下图CPP测试代码#include chrono #include functional #include memory #include string #include rclcpp/rclcpp.hpp // ROS2 C接口库 #include std_msgs/msg/string.hpp // 字符串消息类型 #include msg_test/msg/test.hpp // test消息类型 using namespace std::chrono_literals; class PublisherNode : public rclcpp::Node{ public: PublisherNode(): Node(topic_helloworld_pub){ // 创建发布者对象消息类型、话题名、队列长度 publisher_ this-create_publishermsg_test::msg::Test(chatter, 10); // 创建一个定时器,定时执行回调函数 timer_ this-create_wall_timer( 500ms, std::bind(PublisherNode::timer_callback, this)); } private: void timer_callback(){ auto msg msg_test::msg::Test(); // 一定要加这个auto要了命了 msg.a1; msg.b2.3; msg.c5.6; publisher_-publish(msg);// 发布话题消息 RCLCPP_INFO(this-get_logger(), finished);// 输出日志信息提示已经完成话题发布 } rclcpp::TimerBase::SharedPtr timer_; // 定时器指针 rclcpp::Publishermsg_test::msg::Test::SharedPtr publisher_; // 发布者指针 }; // ROS2节点主入口main函数 int main(int argc, char * argv[]){ rclcpp::init(argc, argv); // ROS2 C接口初始化 rclcpp::spin(std::make_sharedPublisherNode()); // 创建ROS2节点对象并进行初始化 rclcpp::shutdown(); // 关闭ROS2 C接口 return 0; }效果python开头引用from 功能包名.msg import msg文件名 # 这里什么时候加.msg什么时候不加别记错了完整测试代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 from msg_test.msg import Test class PublisherNode(Node): def __init__(self, name): super().__init__(name) # ROS2节点父类初始化 self.pub self.create_publisher(Test, chatter, 10) # 创建发布者对象消息类型、话题名、队列长度 self.timer self.create_timer(0.5, self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数 def timer_callback(self): # 创建定时器周期执行的回调函数 msg Test() # 创建一个Test类型的消息对象 msg.a1 msg.b2.3 msg.c5.6 self.pub.publish(msg) # 发布话题消息 self.get_logger().info(finish) # 输出日志信息提示已经完成话题发布 def main(argsNone): # ROS2节点主入口main函数 rclpy.init(argsargs) # ROS2 Python接口初始化 node PublisherNode(topic_pub) # 创建ROS2节点对象并进行初始化 rclpy.spin(node) # 循环等待ROS2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ROS2 Python接口效果