ROS2节点简介

ROS2中的节点

节点应该负责一个单一的模块化功能,每个节点可通过主题(topics)、服务(services)、动作(actions)或参数(parameters)与其他节点进行数据的发送和接受

请添加图片描述

一个完整的的机器人系统由许多协同工作的节点组成。在ROS2中,但个可执行文件(C++程序、Python程序等)可以包含一个或多个节点

节点常用命令

  • ros2 run <package_name> <executable_name>

  • ros2 node list

    然而,当我们不知道节点名称的时候,可以使用ros2 node list列出所有正在运行个的节点的名称。当你想与节点进行交互或者系统运行多个节点时需要跟踪它们时,是十分有效的

  • ros2 node info <node_name>

    既然知道了节点的名称,可以通过以下指令去访问有关它们的更多信息:

初步实践

运行小乌龟:

ros2 run turtlesim turtletusim_node
# 输入
ros2 node list

# 输出
/turtlesim

# 输入
ros2 node info /turtlesim

# 输出
/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中的话题

ROS2将复杂系统分解为许多模块化节点。话题是ROS途中的重要组成部分,作为节点交换消息的总线,话题是发布-订阅模型

请添加图片描述

当然,一个节点发送者可以向任意数量的主题订阅者发布消息,一个节点的订阅者也可以订阅任意数量的主题

常用指令

  • rqt_graph:可视化节点之间交互连接

  • ros2 topic list:输出正在运行的所有话题列表

初步实践

  • 运行小乌龟节点

    ros2 run turtlesim turtlesim_node
    
  • 运行小乌龟运行节点

    ros2 run turtlesim turtle_teleop_key
    
  • 可视化节点和话题之间的连接关系

    rqt_graph
    

    请添加图片描述

  • 返回当前正在运行所有主题:

    # 输入
    ros2 topic list
    
    # 输出
    /parameter_events
    /rosout
    /turtle1/cmd_vel
    /turtle1/color_sensor
    /turtle1/pose
    
    

ROS2 中的服务

服务是基于调用-响应模型,而不是主题的发布-订阅模型。虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端特定调用时提供数据

请添加图片描述

请添加图片描述

常用指令:

  • ros2 service list:返回当前系统中所有运行的服务列表
  • ros2 service type <service_name>:服务具有描述服务的请求和相应数据结构的类型。服务类型的定义类似与主题类型,但服务类型由请求部分和相应部分组成
  • ros2 service fing <type_name>:找到特定类型的所有服务
  • ros2 interface show <service_name>:可以从命令行查看特定服务类型的参数结构
  • ros2 service call <service_name> <service_type> <arguments>:既然知道了什么是服务类型,如何找到服务的类型,以及如何找到该类型参数的结构,可以通过此命令来调用服务

初步实践

  • ros2 run turtlesim turtlesim_node
    
  • ros2 run turtlesim turtle_teleop_key
    
  • # 输入
    rso2 service list
    
    # 输出
    /clear
    /kill
    /reset
    /spawn
    /teleop_turtle/describe_parameters
    /teleop_turtle/get_parameter_types
    /teleop_turtle/get_parameters
    /teleop_turtle/list_parameters
    /teleop_turtle/set_parameters
    /teleop_turtle/set_parameters_atomically
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/describe_parameters
    /turtlesim/get_parameter_types
    /turtlesim/get_parameters
    /turtlesim/list_parameters
    /turtlesim/set_parameters
    /turtlesim/set_parameters_atomically
    
  • # 输入
    ros2 service type /turtle1/teleport_absolute
    
    # 输出
    turtlesim/srv/TeleportAbsolute
    
  • # 输入
    ros2 interface show turtlesim/srv/TeleportAbsolute
    
    # 输出
    float32 x
    float32 y
    float32 theta
    ---
    
    # 输入
    ros2 interface show turtlesim/srv/Spawn
    
    # 输出
    float32 x
    float32 y
    float32 theta
    string name # Optional.  A unique name will be created and returned if this is empty
    ---
    string name
    
    

ROS2中的参数

参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点、布尔、字符串和列表

常用指令:

  • ros2 param list:列出各自节点中的配置参数
  • ros2 param get <node_name> <parameter_name>:显示节点中对应参数名称的类型和当前值
  • ros2 param set <node_name> <parameter_name> <value>:更改参数的值
  • ros2 param dump <node_name>:查看节点的所有当前参数值
  • ros2 param load <node_name> <parameter_file>:将参数从文件加载到当前运行的节点
  • ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>:使用保存的参数值启动相同的节点

ROS2中的行为

行为是ROS2中的一种通信类型,用于长时间运行的任务。他们由三个部分组成:目标(goal),反馈(feedback)和结果(result)

行为是建立在主题(topics)和服务(services)之上的。它们的功能类似于服务,但行为可以被取消。与只返回单个响应的服务不同,行为还能提供稳定的反馈。

一个行为客户端节点向一个行为服务端发送一个目标,服务段节点确认目标并返回一些列反馈和结果流

请添加图片描述

常用指令:

  • ros2 action list:显示所有action的列表
  • ros2 action info <action_name> : 显示特定action的信息
  • ros2 interface show <action_name>: 显示特定action的参数结构
  • ros2 action send_goal <action_name> <action_type> <values>:发送一个action目标

启动节点

上述的例子中,每次运行节点都要新开一个终端,当运行很多节点时,可以启动包含了ROS2节点的多个可执行文件,使用ros2 launch

录制和回放数据

ros2 bag是一个命令行工具,用于记录系统中发布在话题上的数据,会将话题传递的数据保存在数据库中,后续可以回放这些数据用于测试和实验的验证

常用指令

  • ros2 topic echo <topic_name>:显示话题发布的数据
  • ros2 bag record <topic_name>:记录话题发布的数据
  • ros2 bag info <bag_file_name>:查看记录数据bag的详细信息
  • ros2 bag play <bag_file_name>:回放bag文件
  • ros2 topic hz <topic_name>:查看话题数据发布的频率
  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用ROSapp接收ROS2节点信息,需要进行以下步骤: 1. 在ROS2节点中定义消息类型和话题(topic)。 2. 在ROSapp中创建一个ROS2节点,并订阅该话题。 3. 当ROS2节点发布该话题时,ROSapp将收到该消息并进行处理。 下面是一个简单的示例,演示如何在ROSapp中接收ROS2节点的信息: 1. 在ROS2节点中定义消息类型和话题。假设我们要发送一个字符串类型的消息到“chatter”话题: ``` # 在ROS2节点定义消息类型 from rclpy import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(String, 'chatter', 10) timer_period = 0.5 # 发布消息的时间间隔 self.timer = self.create_timer(timer_period, self.timer_callback) self.i = 0 def timer_callback(self): msg = String() msg.data = 'Hello World: %d' % self.i self.publisher_.publish(msg) self.get_logger().info('Publishing: "%s"' % msg.data) self.i += 1 ``` 2. 在ROSapp中创建一个ROS2节点,并订阅该话题。假设我们要在ROSapp中创建一个名为“minimal_subscriber”的节点,并订阅“chatter”话题: ``` # 在ROSapp中创建ROS2节点并订阅话题 import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalSubscriber(Node): def __init__(self): super().__init__('minimal_subscriber') self.subscription = self.create_subscription( String, 'chatter', self.listener_callback, 10) self.subscription # 防止subscription被垃圾回收 def listener_callback(self, msg): self.get_logger().info('I heard: "%s"' % msg.data) def main(args=None): rclpy.init(args=args) minimal_subscriber = MinimalSubscriber() rclpy.spin(minimal_subscriber) minimal_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 3. 运行ROS2节点ROSapp,当ROS2节点发布消息时,ROSapp将接收该消息并将其打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值