ROS2--在单进程中加入多个节点

前言

阅读本章之前,确保已经了解ROS2中构件(Component)的概念,如果不了解,欢迎移步ROS2 Composition

一个小问题自测:构件与节点之间的区别?在容器进程中运行的单元是构件还是节点?

执行demo

本文通过执行几个demo,来直观展示composition的常见使用方式。

run-time 动态加载

foxy源码demos中的composition已经实现了一些构件,不妨确认一下:

$ ros2 component type
composition
  composition::Talker
  composition::Listener
  composition::Server
  composition::Client

我们将多个节点加载到单个进程的步骤是:首先创建一个容器进程,然后通过ros2 的api向这个容器进程中动态加载。

创建容器进程:ros2 run rclcpp_components component_container

确认容器进程正在运行:ros2 component list

在另一个终端中,输入命令加载构件:ros2 component load /ComponentManager composition composition::<component_name>

我们此时可以看到容器进程终端有相应的内容输出。

编译期加载

同样的shared lib也可以在代码中在编译期加载,可以看一下manual_composition.cpp的源码:

// Copyright 2016 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the L
ROS(Robot Operating System)中,Python程序可以创建并管理多个节点(Nodes),每个节点都是一个独立的进程,负责处理特定的任务。如果你想在同一Python程序中创建多个节点,你可以按照以下步骤操作: 1. **导入必要的模块**:首先,你需要import `rospy` 和 `nodelet`(如果打算使用Nodelets,Nodelets是ROS的一个模块,允许你在单独的进程中运行自包含的Python组件)。 ```python import rospy from std_msgs.msg import String from nodelet import Nodelet ``` 2. **定义节点类**:对于每一个独立的节点任务,你可以定义一个类,继承自`rospy.Node` 或 `nodelet.Nodelet`。每个类都需要覆盖`on_start`方法来执行初始设置和任务。 ```python class MyFirstNode(Node): def __init__(self): super(MyFirstNode, self).__init__('my_first_node') def on_start(self): # 初始化和启动节点任务 class MySecondNode(Nodelet): def __init__(self): super(MySecondNode, self).__init__('my_second_node') def on_init(self): # 对于Nodelet,这里使用on_init方法代替on_start # 初始化和启动节点任务 ``` 3. **实例化并启动节点**:在主程序中,你需要创建每个节点的实例,并通过`rospy`或`nodelet` API启动它们。 ```python if __name__ == '__main__': rospy.init_node('main_node') # 创建一个主节点 first_node = MyFirstNode() second_nodelet = MySecondNode() first_node.start() # 启动第一个节点 if issubclass(second_nodelet.__class__, Nodelet): manager = nodelet_manager.NodeManager() manager.load_nodelet(second_nodelet) manager.run() else: second_node.start() # 如果不是Nodelet,则直接启动 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值