首页 > 其他分享 >ros2 自定义一个控制器

ros2 自定义一个控制器

时间:2024-07-29 09:39:31浏览次数:12  
标签:控制器 return 自定义 controller interface type ros2

在 ROS 2 中,自定义一个控制器并进行使用涉及几个步骤,包括编写控制器代码、配置控制器参数、编写控制器启动文件以及在运行时加载和使用控制器。以下是一个详细的步骤指南:

1. 编写控制器代码

首先,创建一个控制器类,该类继承自 controller_interface::ControllerInterface。下面是一个简单的示例控制器代码:

#include <controller_interface/controller_interface.hpp>
#include <rclcpp_lifecycle/lifecycle_node.hpp>
#include <string>
#include <vector>
#include <exception>

class CustomController : public controller_interface::ControllerInterface {
public:
  CustomController() = default;

  controller_interface::return_type init(const std::string & controller_name) override {
    auto ret = ControllerInterface::init(controller_name);
    if (ret != controller_interface::return_type::OK) {
      return ret;
    }
    try {
      auto_declare<std::string>("arm_id", "fr3");
    } catch (const std::exception & e) {
      RCLCPP_ERROR(get_node()->get_logger(), "Exception thrown during init stage with message: %s", e.what());
      return controller_interface::return_type::ERROR;
    }
    return controller_interface::return_type::OK;
  }

  CallbackReturn on_configure(const rclcpp_lifecycle::State & previous_state) override {
    arm_id_ = get_node()->get_parameter("arm_id").as_string();
    return CallbackReturn::SUCCESS;
  }

  CallbackReturn on_activate(const rclcpp_lifecycle::State & previous_state) override {
    // Activation logic here
    return CallbackReturn::SUCCESS;
  }

  CallbackReturn on_deactivate(const rclcpp_lifecycle::State & previous_state) override {
    // Deactivation logic here
    return CallbackReturn::SUCCESS;
  }

  controller_interface::InterfaceConfiguration command_interface_configuration() const override {
    controller_interface::InterfaceConfiguration config;
    config.type = controller_interface::interface_configuration_type::INDIVIDUAL;
    for (int i = 1; i <= num_joints_; ++i) {
      config.names.push_back(arm_id_ + "_joint" + std::to_string(i) + "/effort");
    }
    return config;
  }

  controller_interface::InterfaceConfiguration state_interface_configuration() const override {
    return {};
  }

private:
  std::string arm_id_;
  int num_joints_ = 6;
};

#include "pluginlib/class_list_macros.hpp"
PLUGINLIB_EXPORT_CLASS(CustomController, controller_interface::ControllerInterface)

 

2. 配置控制器参数

确保在控制器的 initon_configure 方法中声明和获取所需的参数。上面的示例中,我们在 init 方法中使用 auto_declare 声明参数 arm_id,并在 on_configure 方法中获取它。

3. 创建启动文件

为了运行控制器,需要创建一个 ROS 2 启动文件。启动文件通常使用 Python 编写,以下是一个示例:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='controller_manager',
            executable='ros2_control_node',
            parameters=[{
                'robot_description': '<robot_urdf>',
                'arm_id': 'fr3'
            }],
            output='screen'
        ),
        Node(
            package='controller_manager',
            executable='spawner.py',
            arguments=['custom_controller'],
            output='screen'
        )
    ])

 

4. 编写控制器配置文件

在控制器配置文件中指定控制器类型和相关参数,例如:

controller_manager:
  ros__parameters:
    update_rate: 100
    custom_controller:
      type: "package_name/CustomController"
      arm_id: "fr3"

5. 加载和使用控制器

启动 ROS 2 启动文件:

ros2 launch your_package your_launch_file.launch.py

 

通过 ros2 control 命令可以加载、配置和启动控制器。例如:

ros2 control load_controller custom_controller
ros2 control configure_controller custom_controller
ros2 control switch_controller --start custom_controller

 

总结

通过以上步骤,你可以自定义一个 ROS 2 控制器并进行使用。从编写控制器代码、配置参数,到创建启动文件和配置文件,最后加载和启动控制器,这些步骤覆盖了自定义控制器的完整流程。

标签:控制器,return,自定义,controller,interface,type,ros2
From: https://www.cnblogs.com/ai-ldj/p/18329424

相关文章

  • 自定义异常 - 捕获不继承自 BaseException 的类
    我正在尝试编写一些自定义异常处理,但不断遇到“TypeError:不允许捕获不从BaseException继承的类”错误的问题。我有一个名为NodeError的异常基类,它继承自Exception。从那里,我有几个继承自NodeError的自定义异常。web3模块使用requests模块与节点进行通信。我......
  • 第十三节 JMeter基础-终级订单支付【IF控制器】
    声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改。 背景:电商系统主要的接口,到目前为止,就剩下最后的最重要的订单支付了。也是功能最多的一块,例如购物车提交订单、订单列表、订单详情、订单支付、订单取消、订单删除、订单收货、订单售后等等。思路:1、前提......
  • SQL Server数据库的黑匣子:实现自定义日志记录
    SQLServer数据库的黑匣子:实现自定义日志记录在数据库管理中,日志记录是监控和审计数据库活动的重要手段。SQLServer提供了多种日志记录机制,但有时这些默认的日志记录可能无法满足特定的业务需求。在这种情况下,实现数据库的自定义日志记录就显得尤为重要。本文将详细介绍如......
  • pytorch中自定义onnx新算子并导出为onnx
    importtorchfromtorch.autogradimportFunctionimporttorch.onnx#Step1:DefinecustomPyTorchoperatorclassMyCustomOp(Function):@staticmethoddefforward(ctx,input):returninput+1@staticmethoddefsymbolic(g,input):......
  • Telegram API 禁止更改用户的自定义标题
    问题:我使用了FSMTelegramBot,最终机器人将聊天用户更改为聊天管理员并更改了管理员的自定义标题。但我在更改自定义标题时遇到问题,这是控制台输出:ERROR:aiogram.event:Causeexceptionwhileprocessupdateid=XXXXXXXXbybotid=XXXXXXXXTelegramBadRequest:Telegramse......
  • 20、flask-进阶-自定义静态文件static和模板文件templates的路径配置
    自定义static目录和templates目录的路径原本flask默认的static和templates目录是在App目录下的:如下图如果想把这两个目录更改位置,如放在根目录下:代码如下:__init__.pyfromflaskimportFlaskfrom.viewsimportbluefrom.extsimportinit_extsimportos#获......
  • 【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
    具有GPIO控制器和连接器的硬件配置的备树(DeviceTree)代码讲解背景-学习Linux设备树代码soc{soc_gpio1:gpio-controller1{#gpio-cells=<2>;};soc_gpio2:gpio-controller2{#gpio-cells=<2>;};};connector:connect......
  • Java 自定义注解
    一、Java 自定义注解的用途、 1、可以记录在特殊方法进行日志记录     2、可以进行 特殊鉴权 如@ValidateRole(“admin") 只有当前用户拥有指定角色时才放行 否则抛自定义异常 无权限    3、可以用于参数 如Controller 方法中的参数进行 参数......
  • 如何在事件wxWidgets中传递自定义数据
    情况我目前正在使用wxPython(wxWidgetsforPython)编写一个应用程序。在此应用程序中显示了一个对话列表,每行末尾都有一个“打开对话”按钮。我们将此窗口称为“所有对话”。单击任何一个按钮都会调用函数“open_conversation(self,event)”,该函数会显示完整的对话。......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......