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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值