实时闭环控制系统(一)
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_controller
Service收到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实现。