ROS 快速入门教程02

news2025/4/24 9:20:49

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 运行节点

打开两个终端分别输入

roscore

rosrun 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 中传输的数据格式。它定义了数据的类型和结构,类似于一个数据包。消息的结构由字段组成,这些字段的类型可以是简单的基础类型(如 intfloat)或复杂的自定义类型(如数组、结构体等)。

ROS 提供了许多标准消息类型,如 std_msgs/Stringsensor_msgs/Imagegeometry_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 的消息对象 msgstd_msgs::String 是 ROS 中的一种消息类型,用于传输字符串数据。msg 是一个 std_msgs::String 类型的变量,表示一个消息实例,你可以将要发布的数据(即字符串)赋给 msgdata 字段。
  • pub.publish(msg) 是调用 ros::Publisher 对象 pubpublish 方法,该方法负责将消息发送到指定的话题。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 小结

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+django+LSTM微博舆情分析系统 | 深度学习 | 食品安全分析

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号&#xff1a; D031 LSTM 架构&#xff1a;vuedjangoLSTMMySQL 功能&#xff1a; 微博信息爬取、情感分析、基于负面消极内容舆情分析…

HCIP实验二(OSPF网络配置与优化)

一.拓扑图与题目 1.R5为ISP&#xff0c;其上只能配置IP地址; R5与其他所有直连设备间均使用公有IP;环回地址为100.1.1.1/3 2.R4设备为企业出口路由器 3.整个0SPF环境IP基于172.16.0.0/16划分 4.所有设备均可访问R5的环回; 5.减少LSA的更新里&#xff0c;加快收敛&#xff0…

K8S的service详解

一。service的介绍 在K8S中&#xff0c;pod是访问应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也意味着不方便直接采用pod的ip对服务进行访问&#xff0c;为了解决这个问题&#xff0c;K8S提供了service…

数据结构初阶:二叉树(四)

概述&#xff1a;本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件&#xff08;tree.h&#xff09; 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安装包&#xff0c;使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…

【最新版】沃德代驾源码全开源+前端uniapp

一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源&#xff0c;代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等‌。用户可以通过小程序预约代驾服务&#xff0c;系统会估算代驾价格并推送附近代驾司机供用户选择&…

Linux:权限相关问题

文章目录 shell命令以及运行的原理Linux权限执行权限更改目录权限缺省权限粘滞位 shell命令以及运行的原理 操作系统分为内核和外壳程序&#xff0c;xshell是外壳程序&#xff0c;外壳程序包括我们windows桌面上的图形化界面&#xff0c;本质都是翻译给核心处理&#xff0c;再显…

AI数字人:元宇宙舞台上的闪耀新星(7/10)

摘要&#xff1a;AI数字人作为元宇宙核心角色&#xff0c;提升交互体验&#xff0c;推动内容生产变革&#xff0c;助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等&#xff0c;面临技术瓶颈与行业规范缺失等挑战&#xff0c;未来有望突破技术限制&…

【Linux】冯诺依曼体系结构及操作系统架构图的具体剖析

目录 一、冯诺依曼体系结构 1、结构图 2、结构图介绍&#xff1a; 3、冯诺依曼体系的数据流动介绍 4、为什么在该体系结构中要存在内存&#xff1f; 二、操作系统架构图介绍 1、操作系统架构图 2、解析操作系统架构图 3、为什么要有操作系统&#xff1f; 前些天发现了一…

算法训练营第一天|704.二分查找、27.移除元素、977.有序数组的平方

数组理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合。 2.数组的元素是不能删除的&#xff0c;只能覆盖。 3.不同语言不一样&#xff0c;在C中&#xff0c;二维数组是连续分布的 704.二分查找 题目 思路与解法 第一想法&#xff1a; 简单的二分查找&#xff0c…

c++ 互斥锁

为练习c 线程同步&#xff0c;做了LeeCode 1114题. 按序打印&#xff1a; 给你一个类&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…

中波红外相机的应用领域及介绍

科技日新月异&#xff0c;无人机技术在众多领域已显露其卓越性能。当中波红外相机与无人机携手合作&#xff0c;安防视频监控和精细巡检便迎来了颠覆性的变革。本文旨在深入剖析无人机搭载中波红外相机的技术优势、广阔应用前景及实际案例&#xff0c;以此彰显其不可估量的潜力…

重装系统 之 Dell戴尔服务器 PowerEdge R750xs + window server2012r2 || 2016

因要求需要给新服务器装个 win server2012或者2016系统 XXX使用U盘制作PE系统U盘安装系统不行&#xff0c;适合普通win8&#xff0c;win10&#xff0c;win11U盘制作PE系统U盘安装win10系统教程U盘制作PE系统U盘安装win10系统教程https://mp.weixin.qq.com/s/t0W8aNJaHPAU8T78nh…

深度学习--卷积神经网络调整学习率

文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1&#xff09;有序调整StepLR(等间隔调整学习率)2&#xff09;有序调整MultiStepLR(多间隔调整学习率)3&#xff09;有序调整ExponentialLR (指数衰减调整学习率)4&#xff09;有序调整…

TORL:解锁大模型推理新境界,强化学习与工具融合的创新变革

在大语言模型&#xff08;LLMs&#xff09;推理能力不断提升的当下&#xff0c;如何让模型更高效地解决复杂计算和推理任务成为关键。本文介绍的TORL&#xff08;Tool-Integrated Reinforcement Learning&#xff09;框架给出了全新方案。它通过强化学习让大模型自主运用计算工…

Maven 依赖坐标与BOM统一管理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

华为OD机试真题——通过软盘拷贝文件(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 本文收录于专栏&#xff1a;《2025华为OD真题目录全流程解析/备考攻略/经验…

【论文阅读25】-滑坡时间预测-PFTF

本文提出了一种前瞻性失稳时间预测方法&#xff08;PFTF&#xff09;&#xff0c;可用于实时或拟实时预测滑坡、冰崩等地质灾害的失稳时间。该方法基于改进的反速度法&#xff08;Inverse Velocity Method&#xff09;&#xff0c;通过多窗口平滑、迭代更新、以及自动识别加速起…

解决AWS中ELB的目标群组中出现不正常数

当如下图中不正常数>0且小于等于目标总数时&#xff0c;我们需要更改相应的配置&#xff0c;这是针对那些没有检查方式的实例&#xff0c;从而采取反向配置方式 1、切换到运行健康检查&#xff0c;然后进行编辑各个检查指标 2、编辑如下 3、切换到属性进行编辑如下

方案精读:华为智慧园区解决方案【附全文阅读】

随着数字化发展,园区面临转型需求。华为智慧园区解决方案应运而生,其基于物联网、大数据、云计算等技术,构建数字化使能平台,涵盖综合安防、人员与车辆管理、绿色能源、资产管理等多领域应用场景,解决传统园区在安全、效率、能耗等方面的痛点。通过实现系统互联、数据融合…