ROS学习总结十七:自定义消息的使用

2023-05-16

在初学ROS时,一般都是使用的ROS标准库,包括激光电云laserscan、位姿posestamp等。这些库基本满足了我们的日常使用,但是在开发时,难免会遇到一些情况使用标准库不太合适,这时候使用自己的自定义消息格式就变得非常方便。

1、新建msg

1.1、新建msg文件

首先建立一个名为catkin_ws的文件夹,在文件夹内执行:

mkdir src
cd src
catkin_create_pkg msg_test roscpp rospy 

这里的含义是在src文件夹下新建一个catkin工程,工程名称为msg_test,依赖于roscpp以及rospy

然后执行:

cd msg_test
mkdir msg
cd msg
gedit point.msg

这里的含义是在msg_test文件夹下新建一个msg文件夹,并在该文件夹内添加一个point.msg消息。

然后在该文件内添加如下代码:

float64 x
float64 y
float64 z

最后显示如下:
在这里插入图片描述
到这里我们的一个自定义消息就建立完成了,但是如果需要让其生效的话需要修改cmakelist文件以及package.xml文件。

1.2、编译msg文件

首先对于cmakelist文件,需要确定以下几个地方:
一、

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  rospy
  message_generation
)

find_package这里需要包含message_generation,初始时应该是只有roscpp以及rospy的,其他依赖需要自己根据需要添加

二、

## Generate messages in the 'msg' folder
 add_message_files(
   FILES
   point.msg
#   Message2.msg
 )

Generate messages这里需要添加自己的msg消息,代表链接的是哪一个具体的msg,例如这里我需要生成的point.msg所以这里需要添加这一行

point.msg

其他部分不用改动

三、

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
#   geometry_msgs
 )

generate_messages这里是一定要有的,要不然即使编译成功也不会生成自己的msg

另外对于package.xml文件,需要确认其中这两行代码即可:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在这些地方都确认无误的情况下,在catkin_ws文件夹下打开终端,使用catkin_make命令编译文件夹。如果没有问题的话会在catkin_ws/devel路径下生成一个include文件夹,其中存储了名为point.h的文件。注意这个文件并不是一开始就有的,而是通过msg文件编译生成的。
在这里插入图片描述

2、使用msg

这里可以建立一个简单的talker来使用上面定义的msg并进行话题的发布。代码比较简单就直接给出了:

#include "ros/ros.h"   
#include "msg_test/point.h" 
int main(int argc, char **argv)  
{  
 
  ros::init(argc, argv, "talker");  
  
  ros::NodeHandle n;  

  ros::Publisher chatter_pub = n.advertise<msg_test::point>("chatter", 1000);  

  ros::Rate loop_rate(10);  
   
  while (ros::ok())  
  {  
    msg_test::point point;
    point.x=1;
    point.y=2;
    point.z=3;
    chatter_pub.publish(point); 
    ros::spinOnce();  
    loop_rate.sleep();    
   }  
    return 0;  
} 

这个文件写在src文件夹下,我们命名为msg_test.cpp。同样的在catkin_ws下进行编译一下,然后在终端中输入执行该node:

roscore
rosrun msg_test msg_test

注意执行前先把路径添加到bashrc文件夹下,要不然会显示找不到该node,添加方式:

gedit ~/.bashrc

打开bashrc文件,在最后名添加一行:

source ~/catkin_ws/devel/setup.bash

点击保存,关闭该文件,然后执行:

source ~/.bashrc

最后,新开一个终端,监听一下chatter话题,可以看到结果如下:
在这里插入图片描述

3、多msg使用

在定义msg的时候,有时可以定义多个msg,或者在自己的msg中调用其他msg。例如我们可以定义如下的mg消息格式:

string id
msg_test/point[] data
geometry_msgs/Pose pose

这是一个非标准的数据格式,包含了一个自定义的string,一个我们之前定义的消息类型point数组以及一个标准的ROS库函数geometry_msgs/Pose

需要注意如果添加官方标准库的话要在cmakelist文件夹中的:

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
#   geometry_msgs
 )

这里添加对应的库函数,例如这里需要改为:

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
   geometry_msgs
 )

要不然编译时会提示找不到geometry_msgs

然后我们可以同样通过一个chatter测试一下msg:

#include "ros/ros.h"    
#include "msg_test/points.h" 
int main(int argc, char **argv)  
{  
 
  ros::init(argc, argv, "talker");  
  
  ros::NodeHandle n;  

  ros::Publisher chatter_pub = n.advertise<msg_test::points>("chatter", 1000);  

  ros::Rate loop_rate(10);  
   
  while (ros::ok())  
  {  
    msg_test::points points;
    points.id="123";
    msg_test::point point;
    for(int i=0;i<3;i++)
    {
      point.x=i;
      point.y=i+1;
      point.z=i+2;
      points.data.push_back(point);
    }
    points.pose.position.x=1;
    points.pose.position.y=2;
    chatter_pub.publish(points); 
    ros::spinOnce();  
    loop_rate.sleep();    
   }  
    return 0;  
} 

监听话题输出如下:
在这里插入图片描述

代码存放在:

https://download.csdn.net/download/YiYeZhiNian/86511347?spm=1001.2014.3001.5501
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习总结十七:自定义消息的使用 的相关文章

随机推荐

  • 树莓派 安装 Ubuntu MATE18

    Ubuntu MATE18 树莓派 pi 64 raspberrypi span class token punctuation span span class token operator span sudo service cups s
  • Munkres 分配算法

    匈牙利方法 xff08 或 Kuhn 算法 xff09 是由4个基本步骤组成的迭代过程 该方法使用 最小行集 覆盖 操纵 成本矩阵的零点 xff0c 当所需的 最小行集 等于给定成本矩阵的维数时 xff0c 过程终止 Munkres 算法是
  • SORT 多目标跟踪算法笔记

    SORT 是一种简单的在线实时多目标跟踪算法 文章要点为 xff1a 以 IoU 作为前后帧间目标关系度量指标 xff1b 利用卡尔曼滤波器预测当前位置 xff1b 通过匈牙利算法关联检测框到目标 xff1b 应用试探期甄别虚检 xff1b
  • ros:kcf算法+行人检测 = 让机器人自动识别并追踪行人

    实现目标 xff1a 机器人检测到有人走过来 xff0c 迎上去并开始追踪 追踪算法使用kcf算法 xff0c 关于kcf追踪的ros库在github地址 https github com TianyeAlex tracker kcf ro
  • 人物交互(human object interaction)论文汇总-2019年

    1 Relation Parsing Neural Network for Human Object Interaction Detection 1 1 总述 提出一种关系解析神经网络RPNN xff0c 由两部分组成 xff1a 物体 身
  • ROS nodelet 使用详解

    本文以nodelet tutorial math为例来了解nodelet的原理及使用方法 xff0c 理论知识参考http blog csdn net zyh821351004 article details 52143309 代码地址 x
  • MPU6050

    简介 xff1a MPU6050是InvenSense 公司的 MPU6050 作为主芯片 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运动数据以及温度数据 利用 MPU6050 芯片内部的 DMP 模块 xff08 Dig
  • 字符串切割函数strtok、strtok_s、strtok_r的区别

    strtok函数 头文件 xff1a include lt string h gt 函数原型 xff1a char strtok char str const char delimiters 参数 xff1a str xff1a 待分割的字
  • VMware 虚拟机怎么识别不了ISO文件

    1 安装 a class baidu highlight href https www baidu com s wd 61 E8 99 9A E6 8B 9F E5 85 89 E9 A9 B1 amp tn 61 44039180 cpr
  • hadoop集群查看路径

    管理界面 xff1a http master 8088 HDFS 主界面 xff1a http master 50070 HDFS 文件界面 xff1a http master 50070 explorer html
  • Ubuntu20.04 通过VNC实现远程桌面连接

    前提 xff1a 工控机上预留至少三个以太网口 xff0c 一个接路由器 xff0c 一个接上位机 一 通过无线进行远程连接 1 了解被连接电脑的信息并设置无线连接的网络地址 优先连接无线网络 xff1a 网络地址 xff1a 192 16
  • 结束也是开始

    到昨天为止 精通ORACLE 10G 备份与恢复 算是告一段落了 xff0c 接下来准备学习一下性能调优方面的 xff0c 然后再回过来复习一下 精通ORACLE 10G 备份与恢复
  • TX2小结之CAN通信

    TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com embedded downloads 1
  • ROS中启用CAN

    1 源码安装canopen 从官网下载canopen至Ubuntu xff0c 下载地址 xff1a https github com ros industrial ros canopen tree kinetic devel 终端输入 x
  • ROS节点中的CAN命令

    前言 xff1a 由于在使用TX2的过程中 xff0c 需要使用CAN通讯的方式使我的机器人底盘与TX2进行命令收发 xff0c 而我的其他传感器都建立在ROS框架下 xff0c 为了以后能使数据交互我希望把底盘数据也放到我的ROS框架里面
  • ROS学习总结十一:Gazebo物理仿真环境搭建二:自己搭建一个机器人在gazebo中运动。

    之前使用的是shenlan的源码实现了一系列的功能 xff0c 那么根据之前所学习是否可以使用一个自己的机器人实现gazebo仿真 这里我们尝试一下 xff1a 1 按照之前的方式我们给自己的机器人添加碰撞属性以及惯性属性 xff0c 机器
  • ROS学习总结十六:订阅一个话题同时发布一个话题(subscriber and publisher)

    在使用ROS的时候 xff0c 我们会用到很多节点 xff0c 例如之前的gazebo仿真 hector建图 键盘控制等 xff0c 这些节点的消息传递主要靠的是话题与订阅 在很多程序中 xff0c 我们可能需要订阅一些数据 xff0c 同
  • 从ORB_SLAM中发布ROS位姿话题(stereo)

    之前调试了ORB SLAM2的gazebo仿真 xff0c 现在需要在ROS中使用到ORB SLAM2的位姿 xff0c 但是ORB SLAM2本身是没有位姿的ROS话题输出的 xff0c 参考了github上相关问题的探讨 xff1a G
  • 1.3如何配置launch与lua文件

    第一步 了解bag文件 播放bag文件需要在bag的文件夹内启动五个终端 1 第一个终端执行roscore 2 第二个终端执行rosbag info rslidar outdoor gps bag了解bag中topic的名称与类型 3 第三
  • ROS学习总结十七:自定义消息的使用

    在初学ROS时 xff0c 一般都是使用的ROS标准库 xff0c 包括激光电云laserscan 位姿posestamp等 这些库基本满足了我们的日常使用 xff0c 但是在开发时 xff0c 难免会遇到一些情况使用标准库不太合适 xff