新手对于ros::control 的一些认识

  我认为,对于ros::control的基本作用,就是把应用与实际机器人连接起来,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等。

总体概述

  它的总体框架(如下图),就是对应不同的控制器,提供不同的接口,但是这样借口不同,针对不同的接口写不同的代码实在太过于繁琐,于是,它又自己创建了一个硬件抽象层,提高代码的复用率。

新手对于ros::control 的一些认识_第1张图片

 这里的硬件抽象层可以理解为一个接线员,你需要和什么硬件取得联系(比如底盘,机械臂),你就跟他提(申请),他就可以让你们之间的接口连上。这样就避免了直接接触硬件,提高代码复用率。

新手对于ros::control 的一些认识_第2张图片


  上图为ros::control 的数据流程图,大概可以看出每一层的功能

  • Controller Manager:每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。controller manager的输入就是ROS上层应用的输出。
  • Controller:controller可以完成每个joint的控制,请求下层的硬件资源,并且提供了PID控制器,读取硬件资源接口中的状态,在发布控制命令。
  • Hardware Rescource:为上下两层提供硬件资源的接口。
  • RobotHW:硬件抽象层和硬件直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。
  • Real Robot:实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1。

 其中controller Manager和controller有些已经非常完善了,要写的也就是robotHW那一部分。

 

hardware_interface

  hardware_interface: 作为ros_control 组件最重要的一部分,做了以下抽象

  1. 将能动的部分(类似于机器人关节)抽象为joint,joint 类型有旋转,平动,固定等等,详见urdf,joint有三个属性,pose,velocity,effort,位置和速度好理解,effort 不同的joint类型有不同的含义,一般是力矩,力(语义比较混乱在各个不同派系的开源代码中)。执行器模型抽象为actuator ,与joint不一样的部分是actuator的属性值需要一定变换才能对应到joint,可以理解为电机减速,或者机构传动。
  2. 根据不同的控制方式或者不同的传感器暴露出相应的数据接口,一般移动机器人底盘是速度闭环,而机械臂上又是位置闭环,根据这些控制方式的不同分出了不同的控制接口,暴露给上层的controller。
  3. 作为机器人的硬件资源与上层的直接接口,可以被运行时产生与删除,结合机器人本身的通讯组件这样实际上实现了一种对机器人硬件资源的低层次管理。

  而hardware_interface 具体实现方式是存储对应状态变量的指针,用字符串表示不同的joint与 Actuator 资源。robothw 基类是 硬件通讯库与hardware_interface交互的部分。硬件通讯库具体的读写过程都在read 与 write 两个虚方法中实现,更新的数据放在robothw类的成员变量中,这些存储着joint 与actuator 状态与命令的空间被hardware_interface索引,传给controller_manager ,通过controller_manager的接口将数据接给controller。所以ros_control内部不存在进程间通讯。

你可能感兴趣的:(新手对于ros::control 的一些认识)