当前位置: 首页 > article >正文

ROS2 Control controller_interface说明

ROS2 Control controller_interface说明

文章目录

  • 前言
  • controller_interface说明
    • Class ControllerInterfaceBase
    • Class ControllerInterface说明
    • Class ChainableControllerInterface说明
  • semantic_components说明
    • Class ForceTorqueSensor
    • Class IMUSensor
    • Class RangeSensor
  • 参考

前言

controller_interface是ROS control控制使用的硬件之上的接口,用来做上层轨迹指令的规划,从硬件接口更新状态并根据状态生成发送命令并发送给硬件接口。该interface最初是来自ros2_control1,本文将基于博主对源代码的理解完成说明。

controller_interface说明

controller_interface包含如下类,和枚举:

  • Struct InterfaceConfiguration

  • Class ChainableControllerInterface

  • Class ControllerInterface

  • Class ControllerInterfaceBase

Class ControllerInterfaceBase

控制器的基接口类。接口不能用于实现控制器。该类提供了 ControllerInterfaceChainableControllerInterface 的定义,这些定义应针对特定控制器实现和扩展。

直接子类有这两个controller_interface::ChainableControllerInterfacecontroller_interface::ControllerInterface

下边几个是比较核心的函数,该类本生继承于public rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface

virtual CONTROLLER_INTERFACE_PUBLIC InterfaceConfiguration command_interface_configuration () const =0;
// controller_manager使用的方法获取控制器使用的命令接口。每个控制器可以使用单独的方法来确定接口名称,在简单的情况下具有以下格式: <joint>/<interface> 。该方法仅在 inactive 或 active 状态下被调用,即首先必须调用 on_configure 。该配置用于检查是否可以激活控制器并从硬件声明接口。声明的接口填充在command_interfaces_成员中。

virtual InterfaceConfiguration state_interface_configuration() const = 0;
// controller_manager使用的方法来获取控制器使用的状态接口集。每个控制器可以使用单独的方法来确定接口名称,在简单的情况下具有以下格式: <joint>/<interface> 。该方法仅在 inactive 或 active 状态下被调用,即首先必须调用 on_configure 。该配置用于检查是否可以激活控制器并从硬件声明接口。声明的接口填充在state_interface_成员中。

virtual CONTROLLER_INTERFACE_PUBLIC bool is_chainable () const =0
// 获取信息,如果一个控制器是可链的。
    
virtual CONTROLLER_INTERFACE_PUBLIC bool set_chained_mode (bool chained_mode)=0
// 设置可链接控制器的链接模式。此方法触发内部进程将可链接控制器切换到 “链接” 模式,反之亦然。将控制器设置为 “链接” 模式通常涉及禁用subscribers和其他外部interface,以避免输入命令中的潜在并发。

virtual CONTROLLER_INTERFACE_PUBLIC bool is_in_chained_mode () const =0
// 获取有关控制器的信息,如果它当前在链接模式下使用。在chained模式下,只有内部接口可用,所有subscribers都应禁用。这可以防止从多个源同时写入控制器。

Class ControllerInterface说明

该类继承于public controller_interface::ControllerInterfaceBase没有做特殊实现,不做进一步说明

Class ChainableControllerInterface说明

public对外接口:

  CONTROLLER_INTERFACE_PUBLIC
  return_type update(const rclcpp::Time & time, const rclcpp::Duration & period) final;
// 控制步骤更新。命令接口基于参考输入和当前状态进行更新。在 (实时) 控制循环中被调用。
// time - [in] 此控制循环迭代开始的时间
// period- [in] 最后一次控制循环迭代所花费的测量时间

protected内部接口:

  virtual std::vector<hardware_interface::CommandInterface> on_export_reference_interfaces() = 0;
// 每个可chainable控制器应实现以导出其可chainable接口的虚拟方法。每个chainable控制器实现此方法,其中导出所有输入 (命令) 接口。该方法与hardware_interface::SystemInterface或hardware_interface::ActuatorInterface中的 export_command_interface 方法具有相同的含义。

  virtual bool on_set_chained_mode(bool chained_mode);
// 每个可链接控制器实现此方法以在 “链接” 和 “外部” 模式之间切换。在 “链接” 模式下,禁用所有外部接口,如subscriber和service的服务器,以避免输入命令中的潜在并发。

  virtual return_type update_reference_from_subscribers() = 0;
// 每个可链接控制器实现此方法,当不处于链接模式时更新来自订阅者的引用。

  virtual return_type update_and_write_commands(
    const rclcpp::Time & time, const rclcpp::Duration & period) = 0;
// 执行控制器的计算并更新命令接口。
// 可链控制器的更新方法。在此方法中,假设 \reference_interfaces_ 保存当前控制步骤中用于计算命令的值是有效的。这意味着如果controller未处于链接模式,则在 \update_reference_from_subscribers之后调用此方法。

private私有变量:

  bool in_chained_mode_ = false;
// 用来记录当前是否chained模式状态

semantic_components说明

semantic_components包含如下类:

  • Class ForceTorqueSensor
  • Class IMUSensor
  • Class RangeSensor
  • Template Class SemanticComponentInterface

Class ForceTorqueSensor

该类继承自public semantic_components::SemanticComponentInterface< geometry_msgs::msg::Wrench >

// 构造函数如下
	inline ForceTorqueSensor(const std::string &interface_force_x, const std::string &interface_force_y, const std::string &interface_force_z, const std::string &interface_torque_x, const std::string &interface_torque_y, const std::string &interface_torque_z)
// 名称应按以下顺序排列: 力X,力Y,力Z,扭矩X,扭矩Y,扭矩Z。

geometry_msgs::msg::Wrench 是 ROS 2 中的一个消息类型,用于表示作用在一个刚体上的力(force)和力矩(torque)。这个消息类型常用于描述机器人末端执行器所受的外力和力矩,或者用于控制力反馈系统等应用场景。

geometry_msgs::msg::Wrench 消息包含以下字段:

geometry_msgs::msg::Vector3 force:表示作用在刚体上的三个方向(x、y、z)上的力的分量。
geometry_msgs::msg::Vector3 torque:表示作用在刚体上的三个方向(x、y、z)上的力矩(或转矩)的分量。

Class IMUSensor

该类继承自public semantic_components::SemanticComponentInterface< sensor_msgs::msg::Imu >

sensor_msgs::msg::Imu 是 ROS 2 中用于表示惯性测量单元(Inertial Measurement Unit, IMU)数据的消息类型。IMU 通常包含加速度计、陀螺仪和其他传感器,用于测量设备的加速度、角速度以及可能的磁场强度。这种消息类型在机器人导航、姿态估计、运动控制等多个领域都有广泛应用。

sensor_msgs::msg::Imu 消息包含以下字段:

std_msgs::msg::Header header:标准头部信息,包含时间戳和坐标系标识。
geometry_msgs::msg::Quaternion orientation:表示设备的姿态(四元数形式),通常由融合算法计算得出。
sensor_msgs::msg::Covariance3D orientation_covariance:表示姿态估计的不确定性。
geometry_msgs::msg::Vector3 angular_velocity:表示设备的角速度(绕 x、y、z 轴的旋转速度)。
sensor_msgs::msg::Covariance3D angular_velocity_covariance:表示角速度估计的不确定性。
geometry_msgs::msg::Vector3 linear_acceleration:表示设备的线性加速度(沿 x、y、z 方向的加速度)。

Class RangeSensor

该类继承自public semantic_components::SemanticComponentInterface< sensor_msgs::msg::Range >

sensor_msgs::msg::Range 是 ROS 2 中的一个消息类型,用于表示传感器的测量范围数据,如超声波传感器或红外线距离传感器的读数。这个消息类型包含了传感器测量的距离、辐射强度以及其他相关信息。

sensor_msgs::msg::Range 消息包含以下字段:

Header header:包含标准的头部信息,如时间戳和坐标系标识。
float32 radiation_type:辐射类型,通常用于标识传感器的类型(如超声波、红外线等)。ROS 2 中定义了两个常量:
sensor_msgs::msg::Range::ULTRASOUND 表示超声波传感器。
sensor_msgs::msg::Range::INFRARED 表示红外线传感器。
float32 field_of_view:传感器的视场角(Field of View),单位为弧度。
float32 min_range:传感器可以检测到的最小范围。
float32 max_range:传感器可以检测到的最大范围。
float32 range:传感器测量到的距离,单位为米。

参考


  1. GitHub - ros-controls/ros2_control at humble ↩︎


http://www.kler.cn/news/304418.html

相关文章:

  • 论文阅读笔记: DINOv2: Learning Robust Visual Features without Supervision
  • LOAM学习
  • camouflaged object detection中的decoder最核心的作用
  • Amazon EC2:灵活、可扩展的云计算解决方案
  • Flutter iOS混淆打包
  • 安卓13禁止声音调节对话框 删除音量调节对话框弹出 屏蔽音量对话框 android13
  • springcloud OpenFeign 日志打印功能
  • java项目之中药实验管理系统(源码+文档)
  • Linux 入门:简单的基础操作
  • 如何优化MySql的性能
  • 亚信软件测试实习面试记录
  • HarmonyOS开发之路由跳转
  • react js 处理表单( form )的2个例子
  • 基于Springboot的鲜花销售网站的设计与实现
  • Git版本控制工具
  • 如何模拟一个小程序项目打包的流程
  • php 实现JWT
  • 用于客户支持的 GenAI:探索 Elastic Support Assistant
  • 如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)
  • 前端工程师职业发展路线图
  • MADE A PIE 之动态树形图
  • 解决Docker镜像不可下载
  • 【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】
  • 使用 Node Media Server 和 FFmpeg 创建直播流,推送本地视频
  • 在 Mac 上安装双系统会影响性能吗,安装双系统会清除数据吗?
  • 使用VSCode 安装SAP Fiori 开发所需插件
  • el-tree父子不互相关联时,手动实现全选、反选、子级全选、清空功能
  • Qt 构建报错 undefined reference to xxx
  • C++字符串中的string类操作
  • Humanize AI 简介