当前位置: 首页 > news >正文

SLAM从入门到精通(消息传递)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们只是编写了一个publisher节点,以及一个subscribe节点。有了这两个节点,它们之间就可以通信了。在实际生产中,我们除了简单的通信之外,要传递的数据可能还有很多。这个时候,我们就要构建一个消息体。这个消息体可以是各种脚本,但需要同时能被publisher和subscribe访问到。幸好,ros给我们提供了这样的一种形式。

1、构建消息体

        在package下面创建一个msg文件夹。文件夹中保存一个Student.msg文件,它的内容如下所示,

string name
float64 height
float64 weight

        这个文件其实只是一个脚本。通过在workspace顶层输入catkin_make,就可以生成对应的头文件Student.h。注意,头文件保存的位置位于./devel/include/beginner_tutorials/Student.h。编译之前也要修改下CMakelists.txt文件,如下面2所示。

 2、修改CMakelists.txt文件


cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS message_generation roscpp rospy std_msgs genmsg)add_message_files(FILES Student.msg)## Declare ROS messages and services
#add_message_files(FILES Num.msg)
#add_service_files(FILES AddTwoInts.srv)## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)## Declare a catkin package
catkin_package()## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

3、重新构建talker.cpp文件


#include "ros/ros.h"
#include "beginner_tutorials/Student.h"
#include <cstdlib>using namespace std;int main(int argc, char* argv[])
{ros::init(argc, argv, "node_MyMsgPub");if(argc!=4){cout << "Error command parameter!\n" \"Please run command eg:\n" \"rosrun begin_tutorials talker LiLei 180 160" << endl;return 1;}ros::NodeHandle nh;ros::Publisher MyMsgPub = nh.advertise<beginner_tutorials::Student>("MyMsg", 100);beginner_tutorials::Student sdtMsg;sdtMsg.name = argv[1];sdtMsg.height = atof(argv[2]);sdtMsg.weight = atof(argv[3]);ros::Rate rate(10);while(ros::ok()){MyMsgPub.publish(sdtMsg);rate.sleep();}return 0;
}

        代码大部分和之前差不多,只要注意beginner_tutorials::Student这个结构体即可。

4、重新构建listener.cpp文件

#include "ros/ros.h"
#include "beginner_tutorials/Student.h"void MyMsgCallback(const beginner_tutorials::Student& sdtInfo)
{ROS_INFO("Thestudent information is:\n""name:%s--height:%f--weight:%f\n",sdtInfo.name.c_str(),sdtInfo.height,sdtInfo.weight);
}int main(int argc, char* argv[])
{ros::init(argc, argv, "node_MyMsgSub");ros::NodeHandle nh;ros::Subscriber MyMsgSub = nh.subscribe("MyMsg", 1000, &MyMsgCallback);ros::spin();return 0;
}

        和talker.cpp一样,代码中只需要关注下beginner_tutorials::Student这个结构体就行。

5、顶层编译

        cd到workspace的顶层,直接输入catkin_make即可。

6、准备运行talker和listener节点

        在运行talker和listener节点之前,有两件事情要做。第一步,打开roscore;第二步,source ./dev/setup.sh文件。最后,分别打开talker和listenner即可。

rosrun beginner_tutorials talker LiLei 180 160
rosrun beginner_tutorials listener

        没什么意外的化,你会看到这样的打印。如果能看到这些打印,基本上说明我们已经学会使用了ros的消息功能。

[ INFO] [1695351213.590856004]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351213.692688848]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351213.791460924]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351213.891075380]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351213.990753652]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351214.090438037]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351214.190497066]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351214.291007141]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351214.390375087]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000[ INFO] [1695351214.490385779]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

相关文章:

SLAM从入门到精通(消息传递)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们只是编写了一个publisher节点&#xff0c;以及一个subscribe节点。有了这两个节点&#xff0c;它们之间就可以通信了。在实际生产中&#…...

思科路由器:NAT的基础配置

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;找几个基础的示例来练练。 R1配置 Router>en Router>enable Rout…...

动态代理。

无侵入式的给代码增加额外的功能 代理的作用&#xff1a;对象如果干的事情太繁琐&#xff0c;就可以通过代理来转移部分职责&#xff1b;也就是相当于把对象的的方法拆开一些步骤分给代理做&#xff0c;对象做关键的就行了&#xff1b;并且代理做的这些繁琐的事情的名字也要和…...

Learn Prompt-GPT-4:能力

GPT-4能力大赏​ 常识知识推理​ 一个猎人向南走了一英里&#xff0c;向东走了一英里&#xff0c;向北走了一英里&#xff0c;最后回到了起点。他看到了一只熊&#xff0c;于是开枪打了它。这只熊是什么颜色的&#xff1f; 答案是白色&#xff0c;因为这种情况只可能发生在北…...

iOS——ViewController的生命周期

ViewController ViewController的生命周期是指在应用程序运行过程中&#xff0c;ViewController实例从创建到销毁的整个过程。在这个过程中&#xff0c;ViewController会经历一系列的生命周期方法&#xff0c;这些方法可以帮助开发者管理ViewController及其相关的视图和逻辑。…...

SkyWalking内置参数与方法

参数 全局指标 指标指标名称all_p99所有服务响应时间的 p99 值all_p95所有服务响应时间的 p95 值all_p90所有服务响应时间的 p90 值all_p75所有服务响应时间的 p75 值all_p70所有服务响应时间的 p70 值all_heatmap所有服务响应时间的热点图 服务指标 指标指标名称service_r…...

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例&#xff1a;委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例&#xff1a;委托 继承【观察者模式】 13.委托相关设计 问题…...

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(五)

1、下面提供给前端待办提醒消息的接口SysNoticeController&#xff0c;增加如下&#xff1a; /*** 补充用户数据&#xff0c;并返回系统消息* return*/Log(title "系统消息")GetMapping("/listByUser")public R<Map<String, Object>> listByU…...

hive数据初始化

mysql版本&#xff1a;3.1.3 hive版本&#xff1a; 8.0.31 hive连接配置 <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node88:3306/hive?createDatabaseIfNotExisttrue</value> </pr…...

React+Node——next.js 构建前后端项目

一、安装全局依赖 npm i -g create-next-app二、创建next项目 create-next-app react-next-demo //或 create-next-app react-next-demo --typescript三、加载mysql依赖 npm i -S mysql2四、运行项目 npm run dev五、创建db文件目录&#xff0c;目录下创建index.ts import…...

CRM系统主要包括哪些功能?

CRM系统应该要包括的功能总结为3大方向—— 核心必须要具备的功能常见尽量要有的功能可选有了自然更好的功能 以我们公司用的简道云CRM系统模板为例&#xff1a;https://www.jiandaoyun.com 01 核心必须要具备的功能 核心功能决定了系统是否能够被纳入CRM类别&#xff0c;这些…...

Nginx location 精准匹配URL = /

Location是什么&#xff1f; Location是Nginx中的块级指令(block directive)&#xff0c;通过配置Location指令块&#xff0c;可以决定客户端发过来的请求URI如何处理&#xff08;是映射到本地文件还是转发出去&#xff09;及被哪个location处理。 匹配模式 分为两种模式&…...

使用JAXB将Java对象转xml

文章目录 使用JAXB将Java对象转xml1. 要求生成的xml2. Java对象3. 封装的工具类4. 测试 使用JAXB将Java对象转xml 1. 要求生成的xml <?xml version"1.0" encoding"UTF-8" ?> <root><result status"success" msg"成功&qu…...

Atlas 200 DK开发板问题总结

1.fatal error: acl/acl.h: No such file or directory 该问题是因为在设置的DDK环境变量下找不到头文件。 解决方法&#xff1a; 1&#xff09;输入echo $DDK&#xff0c;查看当前DDK地址 2&#xff09;在src文件夹下找到CMakeLists.txt文件&#xff0c;发现该文件有一个变量名…...

uniapp——实现二维码生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.根据接口返…...

零基础学前端(六)重点讲解 JavaScript

1. 该篇适用于从零基础学习前端的小白&#xff0c;完全从零基础角度出发 2. 我们学习时&#xff0c;应该主动向自己提问&#xff1f;只有你能提出问题&#xff0c;你才算是在编程中学习进步了。 3. 初学者不懂得问题很多&#xff0c;在自己在不懂时&#xff0c;一定要求助有经验…...

数据库问题记录(粗略版)oracle、mysql等主流数据库通用

1. ORA-00918&#xff1a;未明确定义列 该问题情况大致为&#xff1a;select 所取列名错误、重复等问题。 2. “select * from temp where 10; ”的含义 布尔值为FALSE&#xff0c;只返回表结构&#xff0c;不返回数据。 举一反三&#xff1a; select * from temp where 1&…...

ORACLE多列中取出数据最大的一条

1.需求说明&#xff1a; 当查询出来的数据存在多条数据时&#xff0c;想按照一定条件排序取出其中一条数据。 2.使用函数&#xff1a; row_number() over( partition by 分组字段 order by 排序字段 desc&#xff09; 3.示例&#xff1a; --根据table_a中的pk_house&#x…...

Xamarin.Android实现App内版本更新

目录 1、具体的效果2、代码实现2.1 基本原理2.2 开发环境2.3 具体代码2.3.1 基本设置2.3.2 系统的权限授予2.3.3 进度条的layout文件2.3.4 核心的升级文件 3、代码下载4、知识点5、参考文献 1、具体的效果 有事需要在程序内集成自动更新的功能&#xff0c;网上找了下&#xff…...

运维工程师面经

文章目录 前言RedisMongoDBPython中的GIL&#xff08;全局解释器锁&#xff09;Python算法总结 前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; Redis 参考网址 NoSQL技术 基于内存的数据库&#xff0c;并且提供一定的持久化功能…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...