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的常…

在线解析工具链接

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

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…

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

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

敬请关注: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;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

如何编译 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…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号&#xff0c;另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一&#xff0c;提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…

高质量代理池go_Proxy_Pool

高质量代理池go_Proxy_Pool 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以…

Spring Cloud Data Flow快速入门Demo

1.什么是Spring Cloud Data Flow&#xff1f; Spring Cloud Data Flow 是一个用于构建和编排数据处理流水线的云原生框架。它提供了一种简化的方式来定义、部署和管理数据处理任务和流应用程序。以下是一些关键特性和组件&#xff1a; 关键特性 流处理&#xff1a; 支持实时数…

CCE-基础

背景&#xff1a; 虚拟化产生解决物理机资源浪费问题&#xff0c;云计算出现实现虚拟化资源调度和管理&#xff0c;容器出现继续压榨虚拟化技术产生的资源浪费&#xff0c;用命名空间隔离&#xff08;namespace&#xff09; 灰度升级&#xff08;升级中不影响业务&#xff09…

[免费]SpringBoot+Vue毕业设计论文管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue毕业设计论文管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue毕业设计论文管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…