ROS2教程 03 节点Node

学习ROS2前需要对ROS1有所了解,可以通过访问ROS1文档学习:
ROS1相关文档

一、ROS2运行示意图

在这里插入图片描述

二、与ros1的区别

以下是ros1的node命令包含的内容,可以明显发现两者的不同,如果只学习ros2,则可以不用了解

 rosnode ping													test connectivity to node
rosnode list 													获取列表 list active nodes
rosnode info 													获取节点信息 print information about node
rosnode machine 									list nodes running on a particular machine or list machines
rosnode kill 													kill a running node
rosnode cleanup 										purge registration information of unreachable nodes

三、节点

节点是独立的可执行文件,像细胞一样,可以执行机器人系统中的具体任务,不同的节点可以执行不同的功能,比如A节点负责视觉 B节点负责运动控制 C节点负责导航
节点可以分布在不同的硬件载体上,节点之间可以进行通信
不同节点可以用不同的编程语言来写

① 编写节点的思想

编写节点的思想和编程类似,可以面向过程,也可以面向对象
对于复杂的机器人,通常使用面向对象的思想,做到模块化

② 编写节点的基本流程

1.编程接口初始化
2.创建节点并初始化
3.实现节点功能
4.销毁节点并关闭接口

③ 尝试编写简单节点的内容

1.编写节点

使用面向过程思想,以python语言编写一个简单的节点,发布HelloWorld日志信息

#!/usr/bin/env python3 
# -*- coding: utf-8 -*-
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node 
import time #引入time库

# 下面的部分是ROS2节点主入口main函数
def main(args=None): # 主函数
    rclpy.init(args=args) # 初始化 rclpy ROS2的python接口
    nodename = Node("node_print_hello_world")# 创建ROS2节点对象并进行初始化
    while rclpy.ok():# 当系统正常运行
        nodename.get_logger().info("Hello World!")  # 日志输出
        time.sleep(1)                        # time休眠循环
    nodename.destroy_node()
    rclpy.shutdown() #关闭ROS2的Python接口

2.为节点代码的编译添加依赖

代码中有用到一些依赖包,在编译前写好依赖
在功能包目录下打开package.xml,修改以下内容
必须添加的内容
当功能包里的代码被执行时,这些语句声明了功能包的依赖

<exec_depend>rclpy</exec_depend>

可以额外添加的内容
例子:

<description>Print log “Hello World! ”per second</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>

3.添加入口点

添加入口点让系统知道Python程序的入口在哪儿
必须添加的内容
打开setup.py,添加入口点
在entry_points下的这个位置添加以下命令

'node_hello_world= herman_ROS_learning.node_print_hello_world:main',

案例形式:

entry_points={
    'console_scripts': [
    'node_print_hello_world= herman_ROS_learning.node_print_hello_world:main',
    ],
},

可以额外添加的内容

maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='Print log “Hello World! ”per second',
license='Apache License 2.0',

4.检查setup.cfg【可选】

setup.cfg是自动填写的,它将功能包的可执行文件放入lib中,ros2 run将会在lib中查找这些执行性文件是否存在并调用

[develop]
script_dir=$base/lib/herman_ROS_learning
[install]
install_scripts=$base/lib/herman_ROS_learning

同理,可以观察一下面向对象的编程方法,这样方便移植以及模块化

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node 
"""
面向对象
"""
class HelloWorldNode(Node): # Node为这个类的父类

    def __init__(self,nodename):
        super().__init__(nodename) # 调用父类中Node的构造函数,赋名根据提供的参数nodename来
        while rclpy.ok():# 当系统正常运行
            self.get_logger().info("Hello World!")  # 日志输出
            time.sleep(1)                        # time休眠循环

def main(args=None): # 主函数
    rclpy.init(args=args) # 初始化 rclpy

    node= HelloWorldNode("node_hello_world_class") # 创建ROS2节点对象并初始化

    rclpy.spin(node) # 循环等候着销毁的到来


    node.destroy_node() #销毁节点对象
    rclpy.shutdown() #关闭接口


if __name__ == '__main__': # 该条下的所有代码仅当本脚本直接执行时会触发,如果在其他文件引用本文件,则不会触发以下的代码
    main()

四、ros2中的node相关命令

ros2的node命令仅包含两项,node info与node list

① ros2 node info

输出节点的信息,包括Subscriber, Publisher, Service Servers, Service Clients, Action Servers, Action Clients

ros2 node info /turtlesim
OUTPUT:
/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

② ros2 node list

查看当前存在的节点

ros2 node list
OUTPUT:
/turtlesim

五、对节点名进行重映射

当需要为节点单次重新起名时,在启动节点命令后补充如下命令,该节点这次将以重映射后的名字运行并存在node list中,该节点可以作为和原名一样的对象和其他节点进行交互,比如turtle_teleop_key也可以操纵重命名后的turtle
可以通过重映射命令创建多个不同名称的同类型对象。

--ros-args --remap __node:=new_name
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=renamed_turtle
INPUI:
ros2 node list 
OUTPUT:
/renamed_turtle
/turtlesim
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS 2中,创建节点需要进行以下步骤: 1. 创建一个ROS 2包(package) 在ROS 2中,使用`colcon`来编译ROS 2程序,因此在创建ROS 2包之前,需要先安装`colcon`。安装完成后,在终端中输入以下命令来创建ROS 2包: ``` mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create my_package --build-type ament_cmake ``` 这个命令会在`~/ros2_ws/src`目录下创建一个名为`my_package`的ROS 2包,并使用`ament_cmake`作为构建类型。 2. 创建一个ROS 2节点ROS 2包中,可以创建多个节点。在`my_package`包中,使用以下命令来创建一个名为`my_node`的节点: ``` cd ~/ros2_ws/src/my_package ros2 pkg create my_node --build-type ament_cmake --node-name my_node ``` 这个命令会在`my_package`包中创建一个名为`my_node`的目录,并在其中生成一个C++源文件`my_node.cpp`,并且在`CMakeLists.txt`中添加了编译`my_node`节点所需的相关代码。 3. 编写节点代码 在`my_node.cpp`文件中编写节点代码。节点代码应该包含节点初始化、消息订阅和发布、消息处理等功能。例如,以下代码会创建一个ROS 2节点,订阅名为`/input`的字符串消息,并将消息添加到名为`/output`的字符串消息中进行发布: ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" class MyNode : public rclcpp::Node { public: MyNode() : Node("my_node") { pub_ = create_publisher<std_msgs::msg::String>("output", 10); sub_ = create_subscription<std_msgs::msg::String>("input", 10, std::bind(&MyNode::onInput, this, std::placeholders::_1)); } private: void onInput(const std_msgs::msg::String::SharedPtr msg) { auto output_msg = std_msgs::msg::String(); output_msg.data = "Received message: " + msg->data; pub_->publish(output_msg); } rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_; rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<MyNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 4. 编译节点 在终端中,使用以下命令编译ROS 2节点: ``` cd ~/ros2_ws colcon build --packages-select my_package ``` 这个命令会在`~/ros2_ws/build`目录下编译`my_package`包,并生成`my_node`节点的可执行文件。 5. 运行节点 在终端中,使用以下命令运行`my_node`节点: ``` cd ~/ros2_ws source install/setup.bash ros2 run my_package my_node ``` 这个命令会启动`my_node`节点,并开始订阅`/input`话题,并在`/output`话题中发布消息。 这是一个简单的ROS 2节点创建和使用的例子,实际情况中可能需要更复杂的节点和功能。同时,需要注意编写好`package.xml`和`CMakeLists.txt`文件,以正确配置ROS 2节点的依赖和编译选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值