首页 > 其他分享 >ROS自定义消息类型

ROS自定义消息类型

时间:2025-01-20 21:56:41浏览次数:3  
标签:std ros 自定义 msgs worker msg 消息 类型 ROS

1.std_msgs

消息类型如下:

来源:std_msgs Msg/Srv Documentation

std_msgs的消息类型大致可以分为:基础类型,如Bool

数组类型,如Float32MultiArray

结构体类型。如Header

我们可以在ROS Index这里查到各种类型的消息包。std_msgs相对比较常用,包含各种基本的消息类型,我们在构建自定义消息类型时可以用到。

2.common_msgs

该消息包和std_msgs不同,它是由几个消息包组合而成。

例:geometry_msgs中的Twist消息包:主要用于表示机器人的线速度和角速度,这两部分速度通常用三维矢量(x,y,z)表示,读者可自行尝试去ros wiki查看。

3.自定义消息类型

首先在工作目录的src目录下创建一个test_msgs包,依赖项除了roscpp rospy std_msgs以外,还有message_generation message_runtime,这两个是消息包生成的依赖项。

然后在test_msgs下创建一msg文件夹。

假设我们要描述的对象是一个worker,我们需要在msg文件夹下创建一个消息类型文件,在该文件中定义我们自定义的消息结构,格式如下:(数据类型+变量名),数据类型也可以用其他包的数据类型。

然后我们需要给这个自定义消息类型设置编译规则,在创建好的包中找到CMakeList.txt文件,先确保message_generation和message_runtime在find_package内:

然后找到如下语句:

将其取消注释,并将里面的msg文件换成我们定义好的worker.msg

如果定义了其他的消息类型,也需要写在这里。

然后再将generate_messages也取消注释

里面的内容是我们自定义消息需要依赖的软件包,按需求填写即可

再找到catkin_package,将CATKIN_DEPENDS取消注释,目的是让依赖我们定义的消息包的其他软件包能够使用自定义的消息类型。

至此,CMakeList.txt全部修改完成。

然后在创建的包中找到package.xml文件,找到最下面的依赖关系部分,确保message_generation和message_runtime包含在内,缺失的话就把他们补全:

然后就可以在工作空间编译了。

4.自定义消息类型的使用

(1)发布者节点

确保创建好的test_msgs仍在工作空间中。

创建一个节点,内容如下:

#include<ros/ros.h>
#include<std_msgs/String.h>
#include<test_msgs/worker_msgs.h>

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"worker_talk_node");
    printf("这里是walkTalkNode节点,用于发布worker类型的消息\n");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<test_msgs::worker_msgs>("workerTopic",10);

    ros::Rate loop_rate(10);
    while(ros::ok())
    {
        test_msgs::worker_msgs msg;
        msg.name="Li Hua";
        msg.department="project";
        msg.age=30;
        msg.salary=10000;
        pub.publish(msg);
        loop_rate.sleep();
    }
    return 0;
}

然后需要在编译规则里添加消息包的依赖,让编译器先去编译test_msgs消息包,再编译该节点。

打开节点的软件包的CMakeList文件,找到find_package(其功能是设置依赖项),将test_msgs加入其中:

再在文件末尾添加如下内容:

add_executable(worker_talk_node src/worker_talk_node.cpp)

add_dependencies(worker_talk_node test_msgs_generate_messages_cpp)
#CMake指令,确保在构建workerTalk_node之前,test_msgs_generate_messages_cpp已经构建完成

target_link_libraries(worker_talk_node
  ${catkin_LIBRARIES}
)

然后找到package.xml文件,将worker_msgs加入到build_depend和exec_depend中

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>worker_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>worker_msgs</exec_depend>

到这里,发布者节点的编写就完成了。回到工作空间编译一下这个过程没有出错。

(2)订阅者节点

代码如下:

#include<ros/ros.h>
#include<std_msgs/String.h>
#include<test_msgs/worker_msgs.h>

void worker_callback(test_msgs::worker_msgs msg)
{
    printf(msg.name.c_str());
    printf(msg.department.c_str());
    printf("age:%ld\n",msg.age);
    printf("salary:%ld\n",msg.salary);
}

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"worker_subscriber_node");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("workerTopic",10,worker_callback);
    while(ros::ok())
    {
        ros::spinOnce();
    }
    return 0;
}

修改编译规则:

CMakeList文件:

确保定义好的消息文件所在的软件包在find_package内。

然后就是文件结尾了,这里我把两个节点放在了同一软件包内。

编译并运行。

订阅者结果如下:

这里我没有换行,如果要让他看的更清楚一点可以改成这种格式:printf("%s\n",msg.name.c_str());

标签:std,ros,自定义,msgs,worker,msg,消息,类型,ROS
From: https://blog.csdn.net/m0_74409155/article/details/145246291

相关文章

  • ROS2-humble驱动RoboSense16线激光雷达
    连接激光雷达电源线和接口驱动安装mkdirlaser_ws&&cdlaser_ws/mkdirsrc&&cdsrc/gitclonehttps://github.com/RoboSense-LiDAR/rslidar_msg.gitgitclonehttps://github.com/RoboSense-LiDAR/rslidar_sdk.gitcdrslidar_sdkgitsubmoduleinitgitsubmodule......
  • FastReport调用Delphi中的自定义函数(人民币大写金额)
    人民币大写金额转换函数1functionMoneyToCn(ANumberic:Real):string;2const3s1:string='零壹贰叁肆伍陆柒捌玖';4s2:string='分角元拾佰仟万拾佰仟亿拾佰仟万';56functionStrTran(constS,s1,s2:string):string;7begin8Result:=St......
  • linux 将自定义程序做成服务开机自启动
    在linux系统中有很多方式可以将自定义程序设置成开机自启动,本文所述的方式是通过将程序设置成service来实现自启动。在/lib/systemd/system目录下新建hello.service文件touch/lib/systemd/system/hello.servicevim/lib/systemd/system/hello.service[Unit]Descrip......
  • NVIDIA Isaac Sim 入门教程(三)ROS2 联合仿真
    系列文章目录前言一、导入URDF模型:TurtlebotOmniverseIsaacSim拥有多种工具,可促进与ROS系统的集成。我们有ROS和ROS2桥接器、URDF导入器等等。本系列教程将举例说明如何使用这些工具。1.1学习目标在本示例中,我们将在IsaacSim中设置一个Turtlebot3......
  • 「酉矩阵是什么?几种常见的酉矩阵类型」
    0.酉矩阵的定义酉矩阵(UnitaryMatrix)是复数域中的一个重要矩阵类型。如果一个矩阵的逆等于它的共轭转置(Hermitiantranspose),那么这个矩阵被称为酉矩阵。用数学表示如下:U......
  • 为什么设置了自定义错误页面后无法登录网站后台
    设置自定义错误页面后无法登录网站后台是一个常见的问题,通常由配置不当或冲突引起。要解决这个问题,我们需要仔细检查相关配置文件,并确保各个组件之间的兼容性。以下是详细的排查和解决方法:一、检查自定义错误页面配置配置文件位置:根据服务器类型,自定义错误页面的配置文件位置......
  • 后盾人JS--JS值类型使用(续章)
    电话号码模糊处理对电话号码进行模糊处理,要进行一些类型转换<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><titl......
  • ASRT语音识别项目的自定义数据集制作
    项目地址:https://gitee.com/ailemon/ASRT_SpeechRecognition通过观察evaluate_speech_model.py的代码,知道DataLoader加载asrt_config.json配置项,进而加载数据内容。复制json配置文件,在数据类“dev”下填写数据集名(name)cus250118、数据路径(data_path)C:/Users/tellw/test/dev、数据......
  • Java的数据类型
    4.数据类型4.1java中的数据类型分为两大类:基本数据类型和引用类型。基本数据类型:数值型byte[1],short[2],int[4],long[8]浮点型float[4],double[8]字符型char[2]存放单个字符布尔型boolean[1]存放true,false引用类型:类(class)接口(interface)数组([])4.2整数类型4......
  • 以太网三大链路类型对比:如何选择Access、Trunk或Hybrid?
    以太网链路类型指的是不同的链路连接模式,这些模式决定了交换机与交换机、交换机与路由器、交换机与终端设备之间如何交换数据。理解这些链路类型有助于优化网络结构,提高数据传输效率,确保网络的稳定性和安全性。在以太网中,链路类型分为三种:Access链路、Trunk链路和Hybrid链......