实时闭环控制系统(一)

ros_control 架构

ros_control的基础结构

一个ros_control最基础的部分包括四大部分:

1. controller_manager::ControllerManager
2. controller
3. hardware_interface::RobotHW
4. hardware_interface 其他的Interface

然后下面我们从最外面开始介绍。

controller_manager::ControllerManager

controller_manager::ControllerManager这个作为ros_control最核心的部件,它主要的作用就是

1. 管理controller,包括load与switch等等
2. 建立hardware_interfac与controller的联系
3. 为controller的运行提供硬实时的环境

管理controller

主要提供了 controller 的 load unload start stop 。下面主要介绍一下它的流程。

初始化

controller_manager::ControllerManager 执行初始化操作, 然后它的类变量里面有一个ControllerLoader<controller_interface::ControllerBase>,然后这个东西的controller_loader_成员是pluginlib::ClassLoader, 所以ControllerManager可以通过它去创建不同的controller实例(工厂模式)。然后注册了一堆Service。包括load unload start stop 这类的。

控制流程

命令行或者launch文件通过 controller_manager_interface.py这货和controller_manager::ControllerManager 注册的Service交互,当然我们最关心的还是 load,所以我们以load为例子介绍。

load流程

主要在ControllerManager::loadController(const std::string& name)这个函数中实现,ControllerManager的load_controllerService收到client的请求后,将收到的Controller的名字传给该函数,让它初始化。初始化时先检查是否已经有该控制器在运行了,如果没有就初始化,然后后面就是一堆初始化检测的东西。

建立hardware_interfac与controller的联系

这里主要是指发生在controller_manager load流程的事情。我们知道controller_manager 的初始化中只有hardware_interface::RobotHW *robot_hw但是在每个controller 都需要一个具体的hardware_interface然后他们之间的转化关系就发生在上面load流程中initRequest函数。

为controller的运行提供硬实时的环境

具体的我也不太清楚,不过看见它的程序注释显示,update函数应该是一个实时的操作。Must be realtime safe. 我已经验证过 ros_control 是完全兼容xenomai这种硬实时的框架。

controller

controller是一个独立包,然后controller_interface也相关。它主要提供了一堆可以用来操作底层的一堆基础的控制器。基本就是接收一个hardware_interface(虽然有多个接口的例子), 然后做操作。如果是传感器的controller,那么它有一个realtime_publisher来发布传感器数据。在controller_interface/controller.h里详细显示了controller的初始化流程。

hardware_interface::RobotHW

hardware_interface这个主要提供对机器人底层操作接口,主要与机器人底层进行交互。然后关于它的具体实现比较简单,主要看看interface_manager

hardware_interface其他接口

其他的就更加简单,主要注意看看每个interface的Handle与Interface实现。