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.mzph.cn/pingmian/61545.shtml

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

相关文章

Windows环境安装MongoDB

文章目录 1. 下载MongoDB2. 安装MongoDB3. Compass-图形化界面客户端4. 更换Compass的主题 阅读本文前可以先阅读以下文章&#xff1a; MongoDB快速入门&#xff08;MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常…

华为ASP与CSP是什么?

探讨ASP与CSP的区别&#xff0c;我们首先要澄清&#xff0c;这里的ASP并非指计算机编程语言。ASP与CSP均为华为公司合作伙伴体系中的术语&#xff0c;具体区别如下&#xff1a; ASP代表授权服务合作伙伴&#xff0c;其含义是华为授权的服务提供商。ASP通常由华为直接授权&#…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值

一、原子操作与原子性 原子操作&#xff08;atomic operation&#xff09;是并发编程中的一个核心概念&#xff0c;指的是在多线程环境中&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程的操作打断&#xff0c;直至该操作完成。这种不可分割的特性保证了操作的原子…

RTL8211F 1000M以太网PHY指示灯

在RK3562 Linux5.10 SDK里面已支持该芯片kernel-5.10/drivers/net/phy/realtek.c&#xff0c;而默认是没有去修改到LED配置的&#xff0c;我们根据硬件设计修改相应的寄存器配置&#xff0c;该PHY有3个LED引脚&#xff0c;我们LED0不使用&#xff0c;LED1接绿灯&#xff08;数据…

通关C语言自定义类型:联合和枚举

C语言的自定义类型有四个分别是&#xff1a;数组&#xff1b;结构体&#xff08;struct&#xff09;&#xff1b;联合体&#xff08;union&#xff09;&#xff1b;枚举&#xff08;enum&#xff09;。前面已经讨论过数组和结构体&#xff0c;这期让我们来学习一下联合体和枚举…

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…

介绍一下toupper(ch);函数(c基础)

hi , I am 36 适合对象c语言初学者 toupper(ch1); tolower(ch2); 是返回ch的大写或小写的字符但并不改变ch 若传递数字仍返回该数字 格式 #include<ctype.h> char res toupper(ch); 链接扫雷游戏代码分享(c基础)-CSDN博客 hi , I am 36. thanks for your look…

代码随想录训练营Day29 | 01背包问题 - 416. 分割等和子集 - 494. 目标和 - 2915. 和为目标值的最长子序列的长度

01背包问题 题目链接&#xff1a;01背包问题思路&#xff1a; 01背包问题是经典的题目&#xff0c;w[i]表示第i个物品重量&#xff0c;v[i]表示第i个物品价值,很容易想到在思考是&#xff0c;我们需要记录三种状态&#xff0c;当前背包装的数量&#xff0c;当前背包空间&#…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

pcap_set_buffer_size()函数

功能简介 pcap_set_buffer_size()函数主要用于设置数据包捕获的内核缓冲区大小。这个缓冲区是操作系统内核用于临时存储捕获到的数据包的区域。通过调整缓冲区大小&#xff0c;可以在一定程度上优化数据包捕获的性能&#xff0c;特别是在高流量网络环境或者需要长时间捕获数据包…

【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录

针对kafka01、kafka02、kafka03三台机器重新设置免密登录&#xff0c;您可以按照以下步骤操作&#xff1a;1. **生成SSH密钥对**&#xff1a;在一台机器上&#xff08;例如kafka01&#xff09;&#xff0c;生成SSH密钥对。如果您已经有了密钥对&#xff0c;可以跳过这一步。bas…

敬请关注:CEPGT 2024 新增主讲

Prof. Marc A. Rosen, Ontario Tech University, Canada 曾担任安大略省理工大学工程与应用科学学院创始院长、加拿大工程学院院长和加拿大机械工程学会会长。 他的主要研究领域是能源、热力学、可持续发展等。Google Scholar Citations 48000余次&#xff0c;H指数98。Prof. …

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目&#xff0c;从基础到进阶&#xff0c;每个项目都配有完整源码和详细讲解。通过这些项目的实战&#xff0c;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

Spring Boot 注解

Spring Boot 是基于 Spring 框架的开发框架&#xff0c;提供了许多注解来简化配置和开发。以下是一些常见的 Spring Boot 注解&#xff0c;包括它们的作用和简单介绍&#xff1a; 1. SpringBootApplication 作用&#xff1a;标识一个 Spring Boot 应用的入口点。它是一个组合…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

计算服务器定制化,计算力提升的关键!

如今&#xff0c;计算服务器的性能、成本、灵活性以及可靠性等因素对于企业的运营和发展起着至关重要的作用。定制服务器&#xff0c;作为一种根据企业特定需求和业务特点专门设计制造的服务器解决方案&#xff0c;正逐渐成为众多企业的明智之选。 对于计算服务器而言&#xff…

51WORLD与南京水利研究院联合研发,国产数字孪生超融合一体机

近日&#xff0c;太湖流域水治理国际会议在江苏省无锡市举行。大会由水利部国际合作与科技司、河湖管理司、中国水利学会、水利部太湖流域管理局、无锡市人民政府、中国交通建设集团有限公司指导&#xff0c;南京水利科学研究院主办&#xff0c;以“践行新发展理念、推进流域水…

STL关联式容器之map

map的特性是&#xff0c;所有元素都会根据元素的键值自动被排序。map的所有元素都是pair&#xff0c;同时拥有实值(value)和键值(key)。pair的第一元素被视为键值&#xff0c;第二元素被视为实值。map不允许两个元素拥有相同的键值。下面是<stl_pair.h>中pair的定义 tem…

华为流程L1-L6业务流程深度细化到可执行

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。具体内容如下: 华为业务流程的深度细化 流程层级:华为业务流程分为 L1 - L6 六个层级,L1 为流程大类,L2 为流程…