ROS 快速入门教程02
5. Node 节点
以智能手机为例,当我们使用智能手机的某个功能时,大多时候在使用手机的某个APP。同样当我们使用ROS的某个功能时,使用的是ROS的某一个或者某一些节点。

虽然每次我们只使用ROS的某一个或者某一些节点,但我们无法下载单一节点,这些节点是以包的形式存储的,上一篇内容以讲解如何安装apt包,这里不再演示。

5.1 工作空间设置
这里以建立一个超声波工作包为例。
打开终端输入
cd catkin_ws/src #进入代码目录
catkin_create_pkg ssr_pkg rospy roscpp std_msgs
catkin_create_pkg +包名+依赖项列表
catkin_create_pkg是 ROS 中用来创建包的命令。ssr_pkg是你要创建的包的名字。rospy,roscpp,std_msgs是你在创建包时所依赖的 ROS 包。- 简单来说,这条命令会创建一个名为
ssr_pkg的 ROS 包,并自动将rospy(Python客户端库)、roscpp(C++客户端库)和std_msgs(标准消息类型)作为依赖项包含进去。
5.1.1 学习roscpp依赖项
打开终端输入
roscd roscpp
ls
code package.xml


name:包名
version:版本
description:包的内容描述
maintainer:维护者信息
有以上四条内容的xml文件基本能确定该目录里存放ros的一个功能包,以后可以根据这种方式判断目录是否为ros功能包。
5.2 自创软件包和下载软件包的区别
我们注意到roscpp这个软件包在/opt/ros/noetic/share文件夹下,该文件夹下还有许多软件包。
这些软件包都是我们使用sudo apt install指令或安装ROS自带下载下来的。
这些软件包与我们建立的catkin_ws工作目录下的软件包不同点在于,这些包是现成的可执行文件可以直接使用执行,而catkin_ws目录下的都是源码文件,需要编译后才能运行。
这时我们可以回想在.bashrc文件里编辑的两条指令:

第一条便是加载apt下载的软件包地址,第二个加载catkin_ws目录下的软件包地址。
5.3 创建超声波包的节点
打开vscode,创建chao_node.cpp文件。

#include<ros/ros.h>
int main(int argc, char **argv)
{printf("Hello, ROS!\n");return 0;
}
如有爆红,请删除json文件并重启vscode,打开setting.json,调整至 "C_Cpp.errorSquiggles": "disabled"

5.4 编译文件
打开CMakeList文件找到Build章节。

找到
add_executable(${PROJECT_NAME}_node src/ssr_pkg_node.cpp)
复制后放到最下面,取消注释并改为:
add_executable(chao_node src/chao_node.cpp)
然后运行编译:

5.5 运行节点
打开两个终端分别输入
roscorerosrun ssr_pkg chao_node

用vscode打开chao_node文件。
#include<ros/ros.h>
int main(int argc, char **argv)
{ros::init(argc, argv, "chao_node");printf("当你能编译这条指令时,你已经基本学会ROS节点的编译了。\n");return 0;
}
打开CMakeList找到
target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES})
复制到最下面取消注释,改为:
target_link_libraries(chao_node${catkin_LIBRARIES})
保存并编译。

5.6 ROS中的while循环
与cpp中的while循环不同,ROS中的while循环括号内并不是存放true or false而是ros::ok()。
5.7 小结

6.Topic话题与Message消息
6.1 Topic(话题)
话题 是一种消息通信的机制,在 ROS 中用于实现 发布-订阅 模式。发布者(Publisher)将数据发布到一个话题上,而订阅者(Subscriber)订阅该话题来接收数据。话题是无连接的,即它不要求发布者和订阅者之间建立直接的联系。
- 发布者(Publisher):一个节点可以作为话题的发布者,定期将数据发送到指定的话题。
- 订阅者(Subscriber):另一个节点可以订阅该话题,从中接收数据。
在 ROS 中,话题通常是用于传输实时数据,例如传感器数据、机器人状态信息等。
特点:
- 无连接性:发布者和订阅者之间没有直接连接,它们通过话题传递消息。
- 异步通信:数据发送和接收是异步的,发布者可以继续发布数据,订阅者接收到数据后进行处理。
- 多对多通信:一个话题可以同时有多个发布者和多个订阅者。
6.2 Message(消息)
消息 是 ROS 中传输的数据格式。它定义了数据的类型和结构,类似于一个数据包。消息的结构由字段组成,这些字段的类型可以是简单的基础类型(如 int、float)或复杂的自定义类型(如数组、结构体等)。
ROS 提供了许多标准消息类型,如 std_msgs/String、sensor_msgs/Image、geometry_msgs/Twist 等,用户也可以定义自定义的消息类型。
消息的类型:
- 标准消息类型:ROS 定义了很多标准消息类型,可以直接使用。例如,
std_msgs/String用于传递字符串数据,sensor_msgs/Image用于传递图像数据,geometry_msgs/Twist用于表示机器人运动的线速度和角速度等。 - 自定义消息类型:用户可以根据需要定义自己的消息类型。自定义消息通常通过
.msg文件来描述,它们存储在 ROS 包中并在编译时生成相应的代码。 -
消息的定义格式:
ROS 中的消息通过 .msg 文件定义,文件中的每一行都描述了一个字段及其数据类型。例如,一个自定义的消息文件 Person.msg 可能会像这样定义:
string name
int32 age
float32 height
该文件描述了一个 Person 消息类型,包含了 name(字符串)、age(32位整数)和 height(32位浮点数)三个字段。
消息的发布与订阅:
- 发布者发送消息:发布者通过
advertise()函数来创建一个话题并开始发布消息。 - 订阅者接收消息:订阅者通过
subscribe()函数来订阅一个话题,并在回调函数中处理接收到的消息。
话题与消息的关系
- 话题 是一个数据流的通道,是消息的发布和订阅的载体。节点通过发布和订阅话题来进行数据交换。
- 消息 是话题上传输的具体数据内容。消息通过话题从发布者传递到订阅者,订阅者可以通过回调函数处理接收到的消息。
消息类型和自定义消息
ROS 提供了很多常见的消息类型,便于开发者使用,如:
std_msgs/String:字符串消息。geometry_msgs/Twist:用于表示机器人速度的消息,包含线速度和角速度。sensor_msgs/Image:用于传输图像数据的消息。
如果预定义的消息类型不能满足需求,开发者可以创建自定义消息类型。自定义消息类型是通过 .msg 文件定义的,ROS 会根据这些文件自动生成 C++ 和 Python 代码,使得这些消息可以被传递和处理。
6.3 小结


7.使用C++编写Publisher发布者节点
打开之前的chao_node.cpp,改为:
#include<ros/ros.h>
#include<std_msgs/String.h>int main(int argc, char *argv[])
{ros::init(argc, argv, "chao_node");printf("你已经成功编译了一个ROS节点\n");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs::String>("ssr_node_topic", 10);while(ros::ok()){printf("你已经成功编译了一个ROS节点!\n");std_msgs::String msg;msg.data = "Hello, ROS!";pub.publish(msg);}return 0;
}
NodeHandle是 ROS 中用于与 ROS 系统交互的接口。它为节点提供了一些基本的功能,包括与 ROS 参数服务器的交互、发布/订阅话题、服务调用等。创建NodeHandle实例时,它会自动连接到 ROS Master,并初始化该节点的相关通信设施。nh是一个ros::NodeHandle类型的对象,用于在当前节点中执行与 ROS 系统的通信任务。nh.advertise<std_msgs::String>("ssr_node_topic", 10):这是NodeHandle对象nh调用的advertise函数,作用是告诉 ROS 系统:当前节点将向名为"ssr_node_topic"的话题发布消息,消息类型为std_msgs::String,并且该话题的队列大小为10。即,当消息还未被消费时,最多有 10 个消息会被保存在队列中,超过这个数目时,新的消息将会丢弃(或覆盖掉旧的消息,取决于配置)。ros::Publisher pub:创建一个ros::Publisher类型的对象pub,它是用来管理消息发布操作的。通过它,你可以发布消息到话题中。std_msgs::String的消息对象msg。std_msgs::String是 ROS 中的一种消息类型,用于传输字符串数据。msg是一个std_msgs::String类型的变量,表示一个消息实例,你可以将要发布的数据(即字符串)赋给msg的data字段。pub.publish(msg)是调用ros::Publisher对象pub的publish方法,该方法负责将消息发送到指定的话题。msg是要发布的消息对象,这里它包含了一个字符串"Hello, ROS!"。当调用publish(msg)时,ROS 会将消息msg发布到在创建pub时指定的"ssr_node_topic"话题上,其他节点如果订阅了该话题,就会收到这个消息。
7.2 运行新节点
启动roscore,再打开新的终端输入rosrun ssr_pkg chao_node

在打开新的终端输入命令,查看当前运行的话题
rostopic list

再输入
rostopic echo /ssr_node_topic
查看话题内容

创建新窗口输入,查看话题每秒钟发送频率。
rostopic hz /ssr_node_topic

7.2 控制话题频率
#include<ros/ros.h>
#include<std_msgs/String.h>int main(int argc, char *argv[])
{ros::init(argc, argv, "chao_node");printf("你已经成功编译了一个ROS节点\n");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs::String>("ssr_node_topic", 10);ros::Rate loop_rate(10);while(ros::ok()){printf("你已经成功编译了一个ROS节点!\n");std_msgs::String msg;msg.data = "Hello, ROS!";pub.publish(msg);loop_rate.sleep();}return 0;
}
重复上述步骤就能获得每秒刷新频率为10的话题。

7.3 小结


相关文章:
ROS 快速入门教程02
5. Node 节点 以智能手机为例,当我们使用智能手机的某个功能时,大多时候在使用手机的某个APP。同样当我们使用ROS的某个功能时,使用的是ROS的某一个或者某一些节点。 虽然每次我们只使用ROS的某一个或者某一些节点,但我们无法下…...
vue+django+LSTM微博舆情分析系统 | 深度学习 | 食品安全分析
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: D031 LSTM 架构:vuedjangoLSTMMySQL 功能: 微博信息爬取、情感分析、基于负面消极内容舆情分析…...
HCIP实验二(OSPF网络配置与优化)
一.拓扑图与题目 1.R5为ISP,其上只能配置IP地址; R5与其他所有直连设备间均使用公有IP;环回地址为100.1.1.1/3 2.R4设备为企业出口路由器 3.整个0SPF环境IP基于172.16.0.0/16划分 4.所有设备均可访问R5的环回; 5.减少LSA的更新里,加快收敛࿰…...
【阿里云大模型高级工程师ACP习题集】2.3 优化提示词改善答疑机器人回答质量
练习题: 【单选题】在使用大模型进行意图识别时,通过设计特定提示词引导模型生成符合预期回答的方法,其本质是( )。 A. 修改模型本身参数 B. 依靠构造输入激发模型内部已有知识 C. 对模型进行微调 D. 改变模型的训练数据 【多选题】以下哪些属于提示词框架中的要素( )。…...
Python内置函数---bytes()
用于创建不可变的字节序列对象 1. 基本语法与参数 bytes(sourceb, encodingNone, errorsNone) - 参数: - source:可选参数,指定初始化数据来源,可以是以下类型: - 整数:创建指定长度的空字节序列ÿ…...
K8S的service详解
一。service的介绍 在K8S中,pod是访问应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也意味着不方便直接采用pod的ip对服务进行访问,为了解决这个问题,K8S提供了service…...
数据结构初阶:二叉树(四)
概述:本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件(tree.h) 1.2 创建二叉树 1.3 前中后序遍历 1.3.1 遍历规则 1.3.1.1 前序遍历代码实现 1.3.1.2 中序遍历代码实现 1.3.1.3 后序遍历代…...
配置Intel Realsense D405驱动与ROS包
配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包,使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…...
Python爬虫实战:基于 Python Scrapy 框架的百度指数数据爬取研究
一、引言 1.1 研究背景 在当今信息时代,市场调研和趋势分析对于企业和研究机构至关重要。百度指数能够精准反映关键词在百度搜索引擎上的热度变化情况,为市场需求洞察、消费者兴趣分析等提供了极具价值的数据支持。通过对百度指数数据的爬取和分析,企业可以及时调整营销策略…...
【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 与 @RequestPart
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 consumes MediaType.MULTIPART_FORM_DATA_VALUE 的作用 1. 定义请求的数据格式 • 作用:告诉 Feign 和 HTTP 客户端,这个接口 接收的是 multipart/form-data 格式的…...
【最新版】沃德代驾源码全开源+前端uniapp
一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源,代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等。用户可以通过小程序预约代驾服务,系统会估算代驾价格并推送附近代驾司机供用户选择&…...
前端频繁调用后端接口问题思考
针对前端频繁调用后端接口的问题,以下是一套分步解决方案,结合Java后端技术栈: 1. 实时数据场景:WebSocket/SSE 适用场景:实时股票行情、即时聊天、监控仪表盘 // Spring WebSocket 配置示例 Configuration EnableW…...
Linux:权限相关问题
文章目录 shell命令以及运行的原理Linux权限执行权限更改目录权限缺省权限粘滞位 shell命令以及运行的原理 操作系统分为内核和外壳程序,xshell是外壳程序,外壳程序包括我们windows桌面上的图形化界面,本质都是翻译给核心处理,再显…...
AI数字人:元宇宙舞台上的闪耀新星(7/10)
摘要:AI数字人作为元宇宙核心角色,提升交互体验,推动内容生产变革,助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等,面临技术瓶颈与行业规范缺失等挑战,未来有望突破技术限制&…...
【Linux】冯诺依曼体系结构及操作系统架构图的具体剖析
目录 一、冯诺依曼体系结构 1、结构图 2、结构图介绍: 3、冯诺依曼体系的数据流动介绍 4、为什么在该体系结构中要存在内存? 二、操作系统架构图介绍 1、操作系统架构图 2、解析操作系统架构图 3、为什么要有操作系统? 前些天发现了一…...
算法训练营第一天|704.二分查找、27.移除元素、977.有序数组的平方
数组理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合。 2.数组的元素是不能删除的,只能覆盖。 3.不同语言不一样,在C中,二维数组是连续分布的 704.二分查找 题目 思路与解法 第一想法: 简单的二分查找,…...
c++ 互斥锁
为练习c 线程同步,做了LeeCode 1114题. 按序打印: 给你一个类: public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…...
3.1 Agent定义与分类:自主Agent、协作Agent与混合Agent的特点
随着人工智能技术的快速发展,智能代理(Agent)作为一种能够感知环境、自主决策并采取行动的计算实体,已成为人工智能领域的重要研究对象和应用工具。特别是在大模型(Large Models)的赋能下,Agent…...
什么是CAN的非破坏仲裁?
CAN总线的非破坏性仲裁是一种在多个设备同时发送数据时,通过标识符(ID)优先级来决定哪个设备可以优先发送数据的机制。其核心思想是:当多个设备同时发送数据时,ID值较小的数据具有更高的优先级,能够优先…...
Vite vs Webpack 优势对比
Vite vs Webpack 优势对比 核心优势图解 #mermaid-svg-jeTCEp1bu9QruHjL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jeTCEp1bu9QruHjL .error-icon{fill:#552222;}#mermaid-svg-jeTCEp1bu9QruHjL .error-text{…...
中波红外相机的应用领域及介绍
科技日新月异,无人机技术在众多领域已显露其卓越性能。当中波红外相机与无人机携手合作,安防视频监控和精细巡检便迎来了颠覆性的变革。本文旨在深入剖析无人机搭载中波红外相机的技术优势、广阔应用前景及实际案例,以此彰显其不可估量的潜力…...
【C++】vector扩容缩容
vector扩容缩容 1 扩容 一般来说,主要是重新分配内存 2 缩容 resize 缩小后,vector 的容量(capacity())可能保持不变,需要显式调用 shrink_to_fit() 来释放内存。 验证代码: #include <vector>…...
240423 leetcode exercises
240423 leetcode exercises jarringslee 文章目录 240423 leetcode exercises[33. 搜索旋转排序数组](https://leetcode.cn/problems/search-in-rotated-sorted-array/)🔁先找旋转点 再分段二分🔁利用布尔变量进行一次二分 [LCR 009. 乘积小于 K 的子数…...
重装系统 之 Dell戴尔服务器 PowerEdge R750xs + window server2012r2 || 2016
因要求需要给新服务器装个 win server2012或者2016系统 XXX使用U盘制作PE系统U盘安装系统不行,适合普通win8,win10,win11U盘制作PE系统U盘安装win10系统教程U盘制作PE系统U盘安装win10系统教程https://mp.weixin.qq.com/s/t0W8aNJaHPAU8T78nh…...
7-1 三种语言的单词转换
编写程序实现:首先从键盘输入若干个中文与英文单词的偶对,以空行作结束标记;再输入若干个英文与丹麦文单词的偶对,以空行作结束标记。然后输入一个中文单词,输出对应的丹麦文单词;若不存在该单词࿰…...
深度学习--卷积神经网络调整学习率
文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1)有序调整StepLR(等间隔调整学习率)2)有序调整MultiStepLR(多间隔调整学习率)3)有序调整ExponentialLR (指数衰减调整学习率)4)有序调整…...
Apache中间件解析漏洞与安全加固
Apache作为全球使用最广泛的Web服务器,其灵活性和模块化设计使其成为开发者的首选。然而,其解析机制和配置不当可能导致严重的安全风险。本文将从漏洞原理、攻击案例和安全配置三个维度,结合真实场景,解析…...
TORL:解锁大模型推理新境界,强化学习与工具融合的创新变革
在大语言模型(LLMs)推理能力不断提升的当下,如何让模型更高效地解决复杂计算和推理任务成为关键。本文介绍的TORL(Tool-Integrated Reinforcement Learning)框架给出了全新方案。它通过强化学习让大模型自主运用计算工…...
Maven 依赖坐标与BOM统一管理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
华为OD机试真题——通过软盘拷贝文件(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录全流程解析/备考攻略/经验…...
