ros2_control
ros2_control是使用(ros2)对机器人进行(实时)控制的框架。
它的包是ros(机器人操作系统)中使用的ros_control包的重写。
ros2_control的目标是简化新硬件的集成并克服一些缺点。
如果您不熟悉控制理论,请对其有所了解(例如,在维基百科上),以熟悉本手册中使用的术语。
安装
sudo apt install ros-galactic-ros2-control
sudo apt install ros-galactic-ros2-controllers
体系结构
Controller Manager
控制器管理器(CM)连接ros2_control框架的控制器和硬件抽象端。
它还作为用户通过ROS服务的入口点。
CM实现了一个没有执行器的节点,因此可以将其集成到自定义设置中。
不过,对于标准用户,建议使用controller_manager包中ros2_control_node文件中实现的默认节点设置。
本手册假定您使用此默认节点设置。
一方面,CM管理(例如,加载、激活、停用、卸载)控制器和所需的接口。
另一方面,它可以访问硬件组件(通过资源管理器),即它们的接口。
控制器管理器匹配所需和提供的接口,在激活时为控制器提供硬件访问权限,或在存在访问冲突时报告错误。
控制循环的执行由CM的update()方法管理。
该方法从硬件组件读取数据,更新所有活动控制器的输出,并将结果写入组件。
Resource Manager
资源管理器(RM)为ros2_control框架抽象物理硬件及其驱动程序(称为硬件组件)。
RM使用pluginlib库加载组件,管理其生命周期以及组件的状态和命令界面。
RM提供的这种抽象使已实现的硬件组件(例如机器人和抓取器)可以重用,而无需对状态和命令接口进行任何实现和灵活的硬件应用,例如用于电机控制和编码器读取的独立硬件/通信库。
在控制循环执行中,RM的read()和write()方法处理与硬件组件的通信。
Controllers
ros2_control框架中的控制器具有控制理论中定义的相同功能。
他们将参考值与测量的输出进行比较,并基于此错误计算系统的输入(有关更多详细信息,请访问Wikipedia)。
这些控件是从ControllerInterface(ros2_control中的controller_interface包)派生的对象,并使用pluginlib库导出为插件。
例如,ros2_controllers存储库中的控制器上检查ForwardCommandController实现。
控制器的生命周期基于实现状态机的LifecycleNode类,如节点生命周期设计文档中所述。
执行控制循环时,将调用 update()
方法。该方法可以访问最新的硬件状态,并使控制器能够写入硬件的命令接口。
User Interfaces
用户使用Controller Manager的服务与ros2_control框架交互。
有关服务及其定义的列表,请检查controller_manager_msgs包中的srv文件夹。
虽然可以直接从命令行或通过节点使用服务调用,但存在一个用户友好的命令行界面(CLI),它与ros2 CLI集成。
这支持自动完成,并提供一系列常用命令。
基本命令是ros2控件。
有关CLI功能的描述,请参阅自述文件。
ros2controlcli包的md文件。
Hardware Components
硬件组件实现与物理硬件的通信,并在ros2_control框架中表示其抽象。
必须使用pluginlib库将组件导出为插件。
资源管理器动态加载这些插件并管理其生命周期。
组件有三种基本类型:
- 系统
复杂(多自由度)机器人硬件,如工业机器人。
执行器组件之间的主要区别是可以使用类似于仿人机器人手所需的复杂传输。
此组件具有读取和写入功能。
当仅为硬件的一个逻辑通信信道(例如,KUKA-RSI)时,使用它。 - 传感器
机器人硬件用于感知其环境。
传感器部件与关节(如编码器)或连杆(如力-扭矩传感器)相关。
此组件类型只有读取功能。 - 执行器
简单的(1自由度)机器人硬件,如电机、阀门等。
执行器实现仅与一个关节相关。
此组件类型具有读取和写入功能。
如果不可能,则不强制读取(例如,带Arduino板的直流电机控制)。
如果多自由度机器人的硬件能够实现模块化设计,例如与每个电机独立的can通信,则执行器类型也可以用于多自由度机械手。
硬件组件的详细说明在通过控制器的硬件访问设计文档中给出。
Hardware Description in URDF
ros2_control框架使用robot的URDF文件中的<ros2_ccontrol>-标记来描述其组件,即硬件设置。
所选结构允许将多个xacro宏一起跟踪为一个宏,而无需任何更改。
下面的示例显示了一个带有2-DOF(RRBot)的位置控制机器人、一个外部1-DOF力扭矩传感器和一个外部控制的1-DOF并联抓取器作为其末端执行器。
有关更多示例和详细说明,请查看ros2_control_demos存储库和ROS 2控制组件URDF示例设计文档。
<ros2_control name="RRBotSystemPositionOnly" type="system">
<hardware>
<plugin>ros2_control_demo_hardware/RRBotSystemPositionOnlyHardware</plugin>
<param name="example_param_write_for_sec">2</param>
<param name="example_param_read_for_sec">2</param>
</hardware>
<joint name="joint1">
<command_interface name="position">
<param name="min">-1</param>
<param name="max">1</param>
</command_interface>
<state_interface name="position"/>
</joint>
<joint name="joint2">
<command_interface name="position">
<param name="min">-1</param>
<param name="max">1</param>
</command_interface>
<state_interface name="position"/>
</joint>
</ros2_control>
<ros2_control name="RRBotForceTorqueSensor1D" type="sensor">
<hardware>
<plugin>ros2_control_demo_hardware/ForceTorqueSensor1DHardware</plugin>
<param name="example_param_read_for_sec">0.43</param>
</hardware>
<sensor name="tcp_fts_sensor">
<state_interface name="force"/>
<param name="frame_id">rrbot_tcp</param>
<param name="min_force">-100</param>
<param name="max_force">100</param>
</sensor>
</ros2_control>
<ros2_control name="RRBotGripper" type="actuator">
<hardware>
<plugin>ros2_control_demo_hardware/PositionActuatorHardware</plugin>
<param name="example_param_write_for_sec">1.23</param>
<param name="example_param_read_for_sec">3</param>
</hardware>
<joint name="gripper_joint ">
<command_interface name="position">
<param name="min">0</param>
<param name="max">50</param>
</command_interface>
<state_interface name="position"/>
<state_interface name="velocity"/>
</joint>
</ros2_control>