ROS学习笔记5——话题通信自定义msg

在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty.... 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 相机的信息... std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型。

ROS中还有一种特殊类型:Header,标头包含时间戳和ROS中常用的坐标帧信息。会经常看到msg文件的第一行具有Header标头

一、定义msg文件

功能包下新建 msg 目录,添加文件 Person.msg。复合消息类型由标准消息类型组成,语法和写结构体差不多。

二、编辑配置文件

2.1 package.xml

在package.xml文件中添加编译依赖和执行依赖

2.2 CMakeLists.txt

a、find_package

编译自定义的功能包时需要依赖find_package中的功能包

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
# 需要加入 message_generation,必须有 std_msgs

b、add_message_files

配置msg源文件

add_message_files(FILESPerson.msg
)

c、 generate_messages

生成消息是依赖于std_mags。因为自定义msg也是由std_msgs 中一些原生的数据类型组成的

generate_messages(DEPENDENCIESstd_msgs
)

d、catkin_package

编译find_package中的依赖包时,依赖于catkin_package中的功能包

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

三、编译

快捷键ctrl+alt+B,配置方法之前分享过。

编译后的中间文件会放在工作空间的dev目录下,C++的中间文件在include中,python的在lib中,

后续调用相关 msg 时,是从这些中间文件调用的。

四、自定义msg调用实例

4.1 vscode 配置

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includePath属性:

4.2 发布方

相较于最普通的发布文本信息,这里需要添加中间文件的头文件,并且实例化发布者对象的时候,发布的消息类型有所变化。

#include "ros/ros.h"
#include "topic_pub_sub/Person.h"    //添加头文件
#include <sstream>
#include <iostream>int main(int argc, char *argv[])
{/* code */setlocale(LC_ALL,"");ros::init(argc,argv,"pub_person");ros::NodeHandle nh;//实例化发布者对象ros::Publisher pub = nh.advertise<topic_pub_sub::Person>("chatter_person",10);topic_pub_sub::Person p;p.id = 0;p.name = "Robot";p.score = 100;ros::Rate rate(1);ros::Duration(3).sleep();while(ros::ok()){std::stringstream ss;   ss << p.name << p.score; pub.publish(p);p.id += 1;ROS_INFO("name:%s%d,score:%.2f",p.name.c_str(),p.id,p.score);rate.sleep();}return 0;
}

4.3 订阅方

#include "ros/ros.h"
#include "topic_pub_sub/Person.h"    //添加头文件
#include <sstream>
#include <iostream>//消息类型
void doPerson(const topic_pub_sub::Person::ConstPtr p)
{ROS_INFO("name:%s%d,score:%.2f",p->name.c_str(),p->id,p->score);
}int main(int argc, char *argv[])
{/* code */setlocale(LC_ALL,"");ros::init(argc,argv,"sub_person");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe<topic_pub_sub::Person>("chatter_person",10,doPerson);ros::spin();return 0;
}

4.4 配置 CMakeLists.txt

除了常规的add_executable和target_link_libraries配置之外。还需要配置add_dependencies,这是为了编译msg文件之后,再编译包含msg文件的cpp文件,保证不会出现逻辑错误。

add_executable(topic_pub_person src/topic_pub_person.cpp)
add_executable(topic_sub_person src/topic_sub_person.cpp)target_link_libraries(topic_pub_person ${catkin_LIBRARIES})
target_link_libraries(topic_sub_person ${catkin_LIBRARIES})add_dependencies(topic_pub_person ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(topic_sub_person ${PROJECT_NAME}_generate_messages_cpp)

4.5 执行结果

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

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

相关文章

[python]裁剪文件夹中所有pdf文档并按名称保存到指定的文件夹

最近在写论文的实验部分&#xff0c;由于latex需要pdf格式的文档&#xff0c;审稿专家需要对pdf图片进行裁剪放大&#xff0c;以保证图片质量。 原图&#xff1a; 裁剪后的图像&#xff1a; 代码粘贴如下。将input_folder和output_folder替换即可。(x1, y1)&#xff0c; (x2…

蓝桥杯备赛 day 2 —— 二分算法(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 二分的概念 &#x1f4c1; 整数二分 &#x1f4c1; 二分的模板 &#x1f4c1; 习题 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文章主要是准备蓝桥杯竞赛同学所写&#xff0c;为你更好准备蓝桥杯比赛涉及…

贪心算法 ——硬币兑换、区间调度、

硬币兑换&#xff1a; from book&#xff1a;挑战程序设计竞赛 思路&#xff1a;优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

Zookeeper简介

系列文章目录 Zookeeper安装教程 目录 一、Zookeeper简介 二、Zookeeper的数据结构 三、CPA理论 四、BASE 理论 五、ZooKeeper的特性 前言 这是我的学习笔记&#xff0c;以便后面翻阅。 一、Zookeeper简介 ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务&a…

element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解

实现代码&#xff1a; 按钮&#xff1a; <el-button click"takeall" style"height: 24px">{{zhanstatus % 2 ! 0 ? "收起所有" : "展开所有"}} </el-button> 组件&#xff1a; <el-form-item label"可选择菜单…

GIS复试Tips(特别是南师大)

注&#xff1a;本文仅个人观点&#xff0c;仅供参考 在这提前㊗️24年考南师大GISer成功上岸&#xff01; 当然&#xff0c;考研是个考试&#xff0c;总有人顺利上岸&#xff0c;稳上岸或逆袭上岸&#xff0c;但可能也有人被刷&#xff0c;这是常态。 所以&#xff0c;㊗️你…

如何服务器用守护进程保证程序稳定运行

如何服务器用守护进程保证程序稳定运行 一、前言 平常在使用服务器的时候&#xff0c;服务一直不稳定&#xff0c;遂从nohup改为创建一个systemd服务来管理Python程序。 要求&#xff1a;有root权限 二、步骤 1、创建systemd服务文件 创建一个新的systemd服务文件&#xf…

X-Bogus加密参数分析与jsvmp算法(仅供学习)

文章目录 1. 抓包分析2. X-Bogus参数分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫…

day20 最大的二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树

题目1&#xff1a;654 最大二叉树 题目链接&#xff1a;654 最大二叉树 题意 根据不重复的整数数组nums构建最大的二叉树 &#xff0c;根节点是数组中的最大值&#xff0c;最大值左边的子数组构建左子树&#xff0c;最大值右边的子数组构建右子树 nums数组中最少含有1个元素…

怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准

2023年12月27日&#xff0c;上海怿星电子科技有限公司测试实验室&#xff08;下称&#xff1a;EPT LABS&#xff09;通过CNAS实验室认可批准&#xff0c;并于2024年1月5日正式取得CNAS实验室认可证书&#xff08;注册号CNAS L19826&#xff09;&#xff0c;标志着怿星科技的实验…

48-DOM节点,innerHTML,innerText,outerHTML,outerText,静态获取,单机click,cssText

1.DOM基础 Document Object Module,文档对象模型,window对象,document文档,都可以获取和操作 1)文档节点 2)属性节点(标签内的属性href,src) 3)文本节点(标签内的文字) 4)注释节点 5)元素节点(标签) 2.获取元素节点 2.1通过标签名获取getElementsByTagName() …

运维平台介绍:视频智能运维平台的视频质量诊断分析和告警中心

目 录 一、视频智能运维平台介绍 &#xff08;一&#xff09;平台概述 &#xff08;二&#xff09;结构图 &#xff08;三&#xff09;功能介绍 1、运维监控 2、视频诊断 3、巡检管理 4、告警管理 5、资产管理 6、工单管理 7、运维…

StructuredStreaming输出模式和结果输出文件中

输出模式 #format指定输出位置 console&#xff1a;控制台 #append 不支持排序&#xff0c;不支持聚合&#xff0c; 每次输出数据都是最新的数据内容 #complete 必须聚合&#xff0c;支持聚合后排序 每次输出数据都会将原来的数据一起输出 #update 支持聚合&#xff0c;支持sel…

循环异步调取接口使用数组promiseList保存,Promise.all(promiseList)获取不到数组内容,then()返回空数组

在使用 vue vant2.13.2 技术栈的项目中&#xff0c;因为上传文件的接口是单文件上传&#xff0c;当使用批量上传时&#xff0c;只能循环调取接口&#xff1b;然后有校验内容&#xff1a;需要所有文件上传成功后才能保存&#xff0c;在文件上传不成功时点击保存按钮&#xff0c…

linux 安装ffmpeg

一、下载 ffmpeg-4.3.1 下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1xbkpHDfIWSCbHFGJJHSQcA 提取码&#xff1a;3eil 二、上传到服务器root目录下 三、给ffmpeg-4.3.1 读写权限 chmod -R 777 /root/ffmpeg-4.3.1 四、创建软连接 1.进入/bin 目录 2.…

java数组在多线程中安全问题,HashMap是不安全的,Hashtable安全(但每次都加锁,效率低),ConcurrentHashMap完美

package com.controller;import com.myThread.AdminThread; import com.myThread.MyCallable; import com.myThread.MyRunnable; import org.springframework.web.bind.annotation.*;import java.util.concurrent.*; //上面引入*&#xff0c;所以这个可以注销 //import java.ut…

WEBDYNPRO FPM 框架

框架搭建 1、FPM_OVP_COMPONENT 1 METHOD change_toolbar_btn .2 * enabled "ABAP_TRUE可用 ABAP_FALSE不可用3 * visibility "01不可见 02可见4 DATA: ls_btn TYPE if_fpm_ovp>ty_s_toolbar_button.5 CHECK wd_this->mo_cnr IS BOUND.6 7 TRY .8 …

测试 ASP.NET Core 中间件

正常情况下&#xff0c;中间件会在主程序入口统一进行实例化&#xff0c;这样如果想单独测试某一个中间件就很不方便&#xff0c;为了能测试单个中间件&#xff0c;可以使用 TestServer 单独测试。 这样便可以&#xff1a; 实例化只包含需要测试的组件的应用管道。发送自定义请…

计算机网络编程

网络编程 文章目录 网络编程1 计算机网络1.1 什么是网络1.2 什么是计算机网络1.3 计算机网络发展的四个阶段 2 常用名词2.1 网络模型2.1.1 OSI模型2.1.2 TCP/IP模型 2.2 网络协议2.2.1 TCP/UDP2.2.2 IP 2.3 Port: 端口号 3 计算机网络编程3.1 InetAddress类3.2 基于TCP的Socket…

瑞_Java开发手册_(六)工程结构

文章目录 工程结构的意义(一) 应用分层(二) 二方库依赖(三) 服务器 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的工程结构篇&#xff0c;主要介绍应用分层、二方库依赖、服务器。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c…