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
控制器的基接口类。接口不能用于实现控制器。该类提供了 ControllerInterface
和 ChainableControllerInterface
的定义,这些定义应针对特定控制器实现和扩展。
直接子类有这两个controller_interface::ChainableControllerInterface
,controller_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:传感器测量到的距离,单位为米。
参考
GitHub - ros-controls/ros2_control at humble ↩︎