ROS 快速入门教程03
8.编写Subscriber订阅者节点
8.1 创建订阅者节点
cd catkin_ws/src/
catkin_create_pkg atr_pkg rospy roscpp std_msgs
ros::Subscriber sub = nh.subscribe(话题名, 缓存队列长度, 回调函数)
回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有消息到达时调用回调函数,而不用手动去执行函数。
#include<ros/ros.h>
#include<std_msgs/String.h>
void chao_callback( std_msgs::String msg)
{printf(msg.data.c_str());printf("\n");
}
int main(int argc, char **argv)
{ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}
打开CMakeList,添加后编译。
add_executable(ma_node src/atr_pkg_node.cpp)
target_link_libraries(ma_node${catkin_LIBRARIES})
打开三个终端分别输入
roscore
rosrun ssr_pkg chao_node
rosrun atr_pkg ma_node
显示接收时间函数
#include<ros/ros.h>
#include<std_msgs/String.h>void chao_callback( std_msgs::String msg)
{ROS_INFO(msg.data.c_str());
}int main(int argc, char **argv)
{setlocale(LC_ALL,"");//设置中文显示ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}
再次运行ma_node节点。
8.2 多个订阅者和发布者图形化显示
当存在多个订阅者和发布者时,可以使用rqt_graph
来显示逻辑关系。
8.3 小结
9.launch启动多个ROS节点
上一小节中,我们启动多个节点就需要打开多个终端,这非常繁琐。这一小节中我们使用launch来启动多个节点。
luanch文件遵循XML语法
<标记名称 属性名1= "属性值1"...>内容</标记名称>
打开vscode,在工作目录的任意子文件夹下创建launch文件
<launch>
<node pkg ="ssr_pkg" type="yao_node" name="yao_node"/>
<node pkg ="ssr_pkg" type="chao_node" name="chao_node"/>
<node pkg ="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>
打开终端输入
roslaunch atr_pkg kaihei.launch
9.2 小结
10.ROS机器人运动控制
机器人的运动可以分解为矢量运动和旋转运动。
矢量运动:二维平面中的各种平移。单位:米/每秒。
旋转运动:机器人进行转向。单位:弧度/每秒。
11.机器人运动控制的实现
第一节中我们已经下载过wpr_simulation
这个源代码了。
cd catkin_ws
catkin_make #编译源代码文件
roslaunch wpr_simulation #开启演示模拟环境
#再打开一个终端输入
rosrun wpr_simulation demo_vel_ctrl#进行demo演示
本节课就要实现这样的一个效果,实现思路:
cd catkin_ws/src/
catkin_create_pkg vel_pkg roscpp rospy geometry_msgs
打开vscode,在vel_pkg
文件夹下的src
目录里创建叫vel_node.cpp
文件。
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>int main(int argc,char **argv)
{ros::init(argc,argv,"vel_node");ros::NodeHandle n;ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("cmd_vel",10);geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.1;vel_msg.linear.y = 0.0;vel_msg.linear.z = 0.0; vel_msg.angular.x = 0.0;vel_msg.angular.y = 0.0;vel_msg.angular.z = 0.0;ros::Rate r(30);while(ros::ok()){vel_pub.publish(vel_msg);r.sleep();}return 0;
}
cmake里添加后编译。
add_executable(vel_node src/vel_node.cpp)
add_dependencies(vel_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(vel_node${catkin_LIBRARIES}
)
分别在两个终端里输入:
roslaunch wpr_simulation wpb_simple.launch
rosrun vel_pkg vel_node
便能看到小车在缓慢向前移动。
相关文章:

ROS 快速入门教程03
8.编写Subscriber订阅者节点 8.1 创建订阅者节点 cd catkin_ws/src/ catkin_create_pkg atr_pkg rospy roscpp std_msgs ros::Subscriber sub nh.subscribe(话题名, 缓存队列长度, 回调函数) 回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有…...

在 macOS 上合并 IntelliJ IDEA 的项目窗口
在使用 IntelliJ IDEA 开发时,可能会打开多个项目窗口,这可能会导致界面变得混乱。为了提高工作效率,可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…...
SEO(Search Engine Optimization,搜索引擎优化)相关知识点
SEO(Search Engine Optimization)是指搜索引擎优化,是计算机领域中通过技术手段和内容策略,提升网站在搜索引擎(如Google、Bing、百度)中自然(非付费)排名的系统性方法。是一种通过优…...
C#森林中的兔子(力扣题目)
C#森林中的兔子(力扣题目) 题目介绍 森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。 给你数组…...

基于多用户商城系统的行业资源整合模式与商业价值探究
随着电子商务的蓬勃发展,传统的单一商家电商模式逐渐显现出一定的局限性。为了解决商家成本过高、市场竞争激烈等问题,多用户商城系统应运而生,成为一种新型的电商平台模式。通过整合行业资源,这种模式不仅极大地提升了平台和商家…...

Three.js + React 实战系列 : 从零搭建 3D 个人主页
可能你对tailiwindcss毫不了解,别紧张,记住我们只是在学习,学习的是作者的思想和技巧,并不是某一行代码。 在之前的几篇文章中,我们已经熟悉了 Three.js 的基本用法,并通过 react-three-fiber 快速构建了一…...

如何用大模型技术重塑物流供应链
摘要 在数字化转型加速的背景下,大模型技术凭借其强大的数据分析、逻辑推理和决策优化能力,正成为物流供应链领域的核心驱动力。本文深入探讨大模型如何通过需求预测、智能调度、供应链协同、风险管控等关键环节,推动物流行业从 "经验驱…...
敏捷开发管理流程
以下是敏捷开发管理流程的详细说明,包含流程框架、关键步骤及案例示例: 敏捷开发管理流程 1. 敏捷核心原则 迭代交付:分小周期(Sprint)交付可工作的软件,通常2~4周为一个迭代。用户需求驱动:以…...

【银河麒麟高级服务器操作系统】磁盘只读问题分析
系统环境及配置 系统环境 物理机/虚拟机/云/容器 虚拟机 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 KVM Virtual Machine 处理器 Kunpeng-920 内存 32 GiB 整机类型/架构 arm64 固件版本 EFI Development Kit II / OVMF 软件环境 具体操作系统版…...

机器视觉的智能手机屏贴合应用
在智能手机制造领域,屏幕贴合工艺堪称"微米级的指尖芭蕾"。作为影响触控灵敏度、显示效果和产品可靠性的关键工序,屏幕贴合精度直接决定了用户体验。传统人工对位方式已无法满足全面屏时代对极窄边框和超高屏占比的严苛要求,而Mast…...
ETL 数据集成都包含哪些?
一、ETL 数据集成都包含哪些? 数字化时代数据已成为企业最为宝贵的资产之一。然而,企业的数据往往分散在多个不同的系统和平台中,如关系型数据库、文件系统、API 等。为了将这些分散的数据整合起来,为企业决策提供全面、准确的支…...

AIM Robotics电动胶枪:智能分配,让机器人点胶涂胶精准无误
在现代工业自动化和智能制造领域,精确的液体分配技术正成为提升生产效率和产品质量的重要因素。AIM Robotics作为这一领域的创新者,提供了多种高效、灵活的点胶涂胶分配解决方案。本文将带您了解AIM Robotics的核心技术、产品系列以及在各行业的成功应用…...

负环-P3385-P2136
通过选择标签,洛谷刷一个类型的题目还是很方便的 模版题P3385 P3385 【模板】负环 - 洛谷 Tint(input())def bellman(n,edges,sta):INFfloat(inf)d[INF]*(n1)d[sta]0for i in range(n-1):for u,v,w in edges:ncostd[u]wif ncost<d[v]:d[v]ncostfor u,v,w in e…...

抖音的逆向工程获取弹幕(websocket和protobuf解析)
目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…...
点云配准算法之NDT算法原理详解
一、算法概述 NDT(Normal Distributions Transform)最初用于2D激光雷达地图构建(Biber & Straer, 2003),后扩展为3D点云配准。它将点云数据空间划分为网格单元(Voxel),在每个体…...

WPF 图片文本按钮 自定义按钮
效果 上面图片,下面文本 样式 <!-- 图片文本按钮样式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…...

Diffusion inversion后的latent code与标准的高斯随机噪音不一样
可视化latents_list如下; 可视化最后一步与标准的噪声: 能隐约看出到最后一步还是会有“马”的形状 整个代码(及可视化代码如下): ## 参考freeprompt(FPE)的代码 import os import torch import torch.nn as nn import torch.n…...

江湖密码术:Rust中的 bcrypt 加密秘籍
前言 江湖险恶,黑客如雨,昔日密码“123456”早被各路大侠怒斥为“纸糊轻功”。若还执迷不悟,用明文密码闯荡江湖,无异于身披藏宝图在集市上狂奔,目标大到闪瞎黑客双眼。 为护你安然度过每一场数据风波,特献上一门绝学《Rust加密神功》。核心招式正是传说中的 bcrypt 密…...

Milvus(3):数据库、Collections说明
1 数据库 Milvus 在集合之上引入了数据库层,为管理和组织数据提供了更有效的方式,同时支持多租户。 1.1 什么是数据库 在 Milvus 中,数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户,你可以创建多个数据库&am…...

【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择
目录 1 Hive数据模型全景图 2 Hive存储架构解析 3 存储格式对比矩阵 4 存储格式选择决策树 5 ORC文件结构剖析 6 Parquet与ORC技术对比 7 最佳实践指南 7.1 建表示例模板 7.2 性能优化 8 总结 1 Hive数据模型全景图 模型核心组件解析: Database࿱…...

2025能源网络安全大赛CTF --- Crypto wp
文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章!!! simpleSignin 题目: from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…...
【网络安全】网络钓鱼的类型
1. 网络钓鱼简介 网络钓鱼是最常见的社会工程学类型之一,它是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。之前,您学习了网络钓鱼是如何利用数字通信诱骗人们泄露敏感数据或部署恶意软件的。 有时,网络钓鱼攻击会伪装成…...
Android学习总结之扩展基础篇(一)
一、IdleHandler工作原理 1. IdleHandler 接口定义 IdleHandler 是 MessageQueue 类中的一个接口,定义如下: public static interface IdleHandler {/*** 当消息队列空闲时会调用此方法。* return 如果返回 true,则该 IdleHandler 会保留在…...

Godot开发2D冒险游戏——第二节:主角光环整起来!
变量的作用域 全局变量,局部变量,导出变量(可以在检查器当中快速查看) 为玩家添加移动动画 现在游戏的玩家还只是在滑行,我们需要再添加玩家每个方向上的移动效果 删除原先的Item节点,创建一个动画精灵…...

.NETCore部署流程
资料下载:https://download.csdn.net/download/ly1h1/90684992 1.下载托管包托管捆绑包 | Microsoft Learn,下载后点击安装即可。 2.安装IIS 3.打开VS2022,新建项目,选择ASP.NET Core Web API 5.Program修改启动项,取…...

数据结构——二叉树,堆
目录 1.树 1.1树的概念 1.2树的结构 2.二叉树 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 2.4.1顺序结构 2.4.2链式结构 3.堆 3.1堆的概念 3.2堆的分类 3.3堆的实现 3.3.1初始化 3.3.2堆的构建 3.3.3堆的销毁 3.3.4堆的插入 3.3.5…...
Java面试实战:音视频场景下的微服务架构与缓存技术剖析
文章标题 Java面试实战:音视频场景下的微服务架构与缓存技术剖析 文章内容 第一轮提问 面试官: 谢先生,请问您对Spring Boot框架熟悉吗?它有哪些核心特性? 谢飞机: 熟悉,Spring Boot的核心特性包括自动配置、嵌入…...

龙虎榜——20250424
指数依然是震荡走势,接下来两天调整的概率较大 2025年4月24日龙虎榜行业方向分析 一、核心主线方向 化工(新能源材料产能集中) • 代表标的:红宝丽(环氧丙烷/锂电材料)、中欣氟材(氟化工&…...
大学生如何学好人工智能
大学生学好人工智能需要从多个方面入手,以下是一些建议: 扎实掌握基础知识 - 数学基础:人工智能涉及大量数学知识,要学好线性代数、概率论、数理统计、微积分等课程,为理解复杂的算法和模型奠定基础。 - 编程语言&…...
实时步数统计系统 kafka + spark +redis
基于微服务架构设计并实现了一个实时步数统计系统,采用生产者-消费者模式,利用Kafka实现消息队列,Spark Streaming处理实时数据流,Redis提供高性能数据存储,实现了一个高并发、低延迟的数据处理系统,支持多…...