ROS之什么是Node节点和Package包?

1.什么是ROS?

官方术语:ROS(Robot Operating System,机器人操作系统)是一个开源的、模块化的机器人软件框架。它为机器人开发提供了一套工具和库,用于实现硬件抽象、设备驱动、消息传递、多线程管理等功能,帮助开发者快速构建复杂的机器人应用。

ROS的核心特性包括:

  1. 分布式架构:支持多个节点协同工作,每个节点完成特定任务(如感知、决策、控制等)。
  2. 通信机制:通过主题(Topic)、服务(Service)和动作(Action)实现数据传输和命令交互。
  3. 开发效率:提供现成的算法包(如SLAM、导航),大大降低开发难度。
  4. 跨平台支持:运行在多个操作系统(如Linux、Windows)和硬件上。

简单来说,ROS是一个用于机器人开发的软件生态操作系统。

2.什么是Node节点和Package包?

      Node节点是执行具体任务的最小单元,通常是一个独立运行的程序,有着自己的特定功能,是最小的可执行单元,而Package包是管理节点及其相关资源的基本单位,包含代码、配置文件、依赖描述和运行脚本等,用于组织功能相关的文件集合。可以说Package包里有很多的ode节点。相当于一个大箱子Package包里面有很多的小箱子Node节点。

3.如何在ROS中创建Node节点和Package包?

3.1. Node节点的创建(C++)touch <filename>.cpp  #创建cpp文件

#include <ros/ros.h>
#include <std_msgs/String.h>int main(int argc, char* argv[])
{ros::init(argc, argv, "www_node");ros::NodeHandle nh;ros::Publisher pub= nh.advertise<std_msgs::String>("NB555",10);ros::Rate loop_rate(0.5);while (ros::ok()){std_msgs::String msg;msg.data = "NBNBNBNB\n";pub.publish(msg);printf(msg.data.c_str());printf("\n");loop_rate.sleep();// 确保ROS系统在循环中可以处理其他事件}return 0;}

#include <ros/ros.h>
#include <std_msgs/String.h>

引入ROS的核心头文件,提供ROS程序运行所需的基础功能(如节点初始化、消息发布、订阅等)。引入std_msgs包中的String消息类型,用于发布和传递字符串消息。

int main(int argc, char* argv[ ])

{

        return 0 ;

}

定义主函数,是ROS程序的入口,参数argcargv用于处理命令行参数,argc 代表“argument count”(参数计数),即命令行中传递给程序的参数个数,至少为1,char* argv[ ] 是一个字符指针数组,指向命令行中传递给程序的每个参数的字符串。

ros::init(argc, argv, "www_node");

ros::NodeHandle nh;

ros::Publisher pub= nh.advertise<std_msgs::String>("NB555",10);

ros::Rate loop_rate(0.5);

第一句是节点初始化,并将当前程序注册为名为 "www_node" 的节点。argcargv 是命令行参数,ROS 会解析这些参数来进行节点的初始化。"www_node" 是该节点的名称,ROS 网络中每个节点的名称必须是唯一的。如果其他节点使用相同的名称,ROS 会阻止启动,并且会打印警告。ros::NodeHandle 是一个 ROS 的核心对象,它用于管理与 ROS 系统的通信,就是ros大管家,哈哈哈哈哈。nh 则是节点句柄对象,它为我们提供了与 ROS 系统交互的接口。接下来是创建节点发布者,用来向 "NB555" 主题发布 std_msgs::String 类型的消息。"NB555":是消息发布的主题名称,借助大管家nh.advertise。10:这是消息队列的大小,表示最多保存 10 条消息。如果消息队列满了,旧的消息会被丢弃。最后一句用来控制循环的频率,确保代码按照设定的速率运行。

while (ros::ok())

{

std_msgs::String msg;

msg.data = "NBNBNBNB\n";

pub.publish(msg);

printf(msg.data.c_str());

printf("\n");

loop_rate.sleep();

}

 之后是一个循环判断,ros::ok():这个函数检查 ROS 系统是否仍在运行。当你按下 Ctrl+C 终止节点时,ros::ok() 会返回 false,从而跳出循环。

std_msgs::String msg;:创建 std_msgs::String 类型的消息对象 msg,包含 std::string 类型的字段 data,用于存储要发送的数据。

msg.data = "NBNBNBNB\n";:为消息对象的 data 字段赋值。"NBNBNBNB\n" 是发布的字符串,\n 是换行符。

pub.publish(msg):通过发布者对象 pub 发布消息 msg。这将把消息 msg 发送到 NB555 主题,任何订阅该主题的节点将收到该消息。

msg.data.c_str():将 msg.data(即字符串 "NBNBNBNB\n")转换为 C 风格的字符串(即 const char*),这是 printf 函数所要求的格式。

printf:在终端打印消息内容,以便调试和验证节点是否按预期工作。

loop_rate.sleep():使程序暂停一段时间,以保证循环频率保持为 0.5 Hz。即每执行一次循环后,程序会等待 2 秒,确保每次发布的间隔时间为 2 秒。

3.2 首先得确保自己有个工作空间:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

 3.3创建功能包:

catkin_create_pkg my_package std_msgs roscpp

3.4 进入src文件创建cpp文件,复上述制代码

cd src
touch my_node.cpp

3.5最重要的是别忘了编写cmakelists.txt文件,在最后加上内容,否则报错:

add_executable(www_node src/www_node.cpp)
target_link_libraries(www_node
 ${catkin_LIBRARIES}
 )

第一行 add_executable(www_node src/www_node.cpp) 告诉 CMake 编译 src/zzp

_node.cpp 文件并生成一个名为 www_node 的可执行文件。第二行 target_link_libra

ries(www_node ${catkin_LIBRARIES}) 将 ROS 包所需的所有依赖库(如 roscpp 等)链接到该可执行文件中,确保在运行时能够使用这些库提供的功能。

3.6 编写程序后保存然后编译,生成相应的配置文件:

cd  ..

catkin_make  865d3a71584c46f0be5db526e3cddfd5.png

4b399fe0a0834a10aaaa3499393e1309.png

3.7 之后运行以下代码则可以运行,别忘了启动ros核心

source devel/setup.bash
rosrun my_package www_node

a17ba688d4544f7399f1c4cc7586213e.png

 

 

 

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

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

相关文章

【1.4 Getting Started--->Support Matrix】

主页&#xff1a;支持矩阵 这些支持矩阵概述了 TensorRT API、解析器和层支持的平台、特性和硬件功能。 Support Matrix Abstract 这些支持矩阵概述了 TensorRT API、解析器和层所支持的平台、功能和硬件功能。 有关之前发布的 TensorRT 文档&#xff0c;请参阅 TensorRT 档…

C语言教程指针笔记整理(二)

https://www.bilibili.com/video/BV1cx4y1d7Ut?spm_id_from333.788.videopod.episodes&vd_sourcee8984989cddeb3ef7b7e9fd89098dbe8&p107 本篇为贺宏宏老师C语言教程指针部分笔记整理 //8-19 一维数组和二维数组 // int arr[4] [][][][] //含义&#xff1a; //1.arr…

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域&#xff1a; &#xff08;1&#xff09;对象头&#xff08;Mark Word、元数据指针和数组长度&#xff09; 对象头&#xff1a;在32位虚拟机中&#xff0c;1个机器码等于4字节&#xff0c;也就是32bit&#xff0c;在64位虚拟机中&#xff0…

Consumer Group

不&#xff0c;kafka-consumer-groups.sh 脚本本身并不用于创建 Consumer Group。它主要用于管理和查看 Consumer Group 的状态和详情&#xff0c;比如列出所有的 Consumer Group、查看特定 Consumer Group 的详情、删除 Consumer Group 等。 Consumer Group 是由 Kafka 消费者…

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…

ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想

目录 一些常见的设计思想以及基于LSM树的LevelDB是如何利用这些设计思想优化存储、检索效率的。 几种常见的设计思想 索引和数据分离减少磁盘IO读写分离分层思想 LevelDB的设计思想 读写分离设计分层设计与延迟合并LRU缓存加速检索 几种常见设计思想 索引与数据分离 索引…

JavaWeb之综合案例

前言 这一节讲一个案例 1. 环境搭建 然后就是把这些数据全部用到sql语句中执行 2.查询所有-后台&前台 我们先写后台代码 2.1 后台 2.2 Dao BrandMapper&#xff1a; 注意因为数据库里面的名称是下划线分割的&#xff0c;我们类里面是驼峰的&#xff0c;所以要映射 …

043 商品详情

文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…

中国省级新质生产力发展指数数据(任宇新版本)2010-2023年

一、测算方式&#xff1a;参考C刊《财经理论与实践》任宇新&#xff08;2024&#xff09;老师的研究&#xff0c;新质生产力以劳动者劳动资料劳动对象及其优化组合的质变为 基本内涵&#xff0c;借 鉴 王 珏 和 王 荣 基 的 做 法构建新质生产力发展水平评价指标体系如下所示&a…

设计模式之 状态模式

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时&#xff0c;改变其行为。这种模式将状态的转换和行为的变化解耦&#xff0c;将不同状态的行为封装到独立的状态类中&#xff0c;而通过上下文&#xff08;Con…

学习日志015--python单链表

创建 class Node:def __init__(self,data):# 数据域self.data data# 链接域self.next Noneclass LinkList:def __init__(self,):# 初始化头节点self.head None# 记录链表的长度self.size 0 增加 #头插def insert_head(self,value):# 创建新节点node Node(value)q self…

CSP/信奥赛C++语法基础刷题训练(22):洛谷P1075:[NOIP2012 普及组] 质因数分解

CSP/信奥赛C语法基础刷题训练&#xff08;22&#xff09;&#xff1a;洛谷P1075&#xff1a;[NOIP2012 普及组] 质因数分解 题目描述 已知正整数 n n n 是两个不同的质数的乘积&#xff0c;试求出两者中较大的那个质数。 输入格式 输入一个正整数 n n n。 输出格式 输出…

Java开发经验——开发常用工具类

摘要 本文介绍了Java开发中常用的工具类&#xff0c;包括Apache Commons Collections的SetUtils、Google Guava的Sets、Apache Commons Lang的ArrayUtils等&#xff0c;以及它们在集合操作、数组操作、字符串处理、JSON处理等方面的应用。文章还涉及了Optional类、Money工具类…

【Python TensorFlow】进阶指南(续篇三)

在前几篇文章中&#xff0c;我们探讨了TensorFlow的高级功能&#xff0c;包括模型优化、分布式训练、模型解释等多个方面。本文将进一步深入探讨一些更具体和实用的主题&#xff0c;如模型持续优化的具体方法、异步训练的实际应用、在线学习的实现细节、模型服务化的最佳实践、…

阿里系 acw_sc__v3 某教学网站

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点&#xff1a; STP的选举&#xff08;Listening状态中&#xff09;&#xff1a; RSTP P/A&#xff08;提议/同意&#xff09;机制 同步机制&#xff1a; 边缘端口的配置&#xff1a; RSTP的端口角色划分&#xff1a; ensp模拟…

ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略

摘要&#xff1a; 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面&#xff0c;通过具体方法分析、数据引用与大模型工具介绍&#xff0c;旨在为短视频营销领域提…

数据结构-树状数组专题(2)

一、前言 接上回树状数组专题&#xff08;1&#xff09;&#xff0c;这次主要介绍差分跟树状数组联动实现区间更新 二、我的模板 重新放了一遍&#xff0c;还是提一嘴&#xff0c;注意下标从0开始&#xff0c;区间左闭右开 template <typename T> struct Fenwick {in…

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时&#xff0c;复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱&#xff0c;还是推荐引擎中海量的数据量&#xff0c;处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时&#xff0c;…