ros_control定义了机器人硬件接口和机器人控制器的抽象接口,控制器管理类controller_manager类,具体的控制器的实现类是在ros_controllers包内实现的,其网址为:https://github.com/shadow-robot/ros_controllers
总结:
(1)在roscontrol中的**Handle为资源类,**Interface为接口类;
(2)RobotHW 类派生自InterfaceManger,编写自定义机器人硬件接口时,主要是从该类派生,该类提供了与控制器通讯的一系列机器人硬件接口,同时集成有资源冲突检测方法,并存储了一个硬件接口(**Interface)的map存储容器;其本质是RobotHW 内可以注册各种**Interface类,通过T* Get()函数可以获得某个Interface的实例,再通过**Interface类的gethandle(name)方法获取该Interface的资源对象,再通过资源对象获取相应的数据,如Pos,Vel,ACC等等。
(3)InterfaceManger类为接口管理类,其提供有RegisterInterface函数,用于注册机器人硬件的接口类(**Interface),每个类型的接口只能存储一个实例,并可以用T* Get()函数获取接口类的对象。
(4)HardwareResourceManger类派生自HardwareInterface和ResourceManger<ResourceHandle>,其中HardwareInterface提供claim()和clearClaim()函数用于声索资源和清除声索资源;ResourceManger<ResourceHandle>改类提供RegisterHandle(ResourceHandle handle),该函数向接口类注册资源handle,并提供gethandle(name)获取handle对象。
(5)以JointStateInterface为例,该类是提供joint的状态量的接口类,其派生自HardwareResourceManger<JointStateHandle>,特别之处是,其将ResourceHandle泛型替换为JointStateHandle实体类,也同时说具有(4)所属的所有方法。
(6)JointstateHandle为关节状态的资源类,其内部存储有:pos,vel,effort的获取接口。
(7)类似于JointStateInterface和JointstateHandle的一组接口资源类,还有JointHandle和JointCommandInterface,其中JointHandle不但包含了Jointstatehandle的所有内容,还包括了setcommand和getcommand两个命令接口,从这个JointCommandInterface类还派生出了PositionJointInterface,VelocityJointInterface,EffortJointInterface等类,其本质是一回事,就是实现一个控制量的读取和写入接口,同时获取joint的状态。
(8)PosVelJointHandle和PosVelJointInterface用于控制单个joint的速度和位置的硬件接口,不通与以上的是PosVelJointInterface类派生自HardwareResource<PosvelJointHandle,ClaimResource>,ClaimResource类的使用表明该接口声明了PosvelJointHandle的资源,类似的还有PosVelAccJointHandle和PosVelAccJointInterface,增加了加速度的控制。
(9)Controller类是控制器类的父类,其提供有Starting,stoping,update,并存储有vector<hardware_interface::InterfaceResources> ClaimedResources用于存储所声索的接口资源。其内部有个比较重要的函数为initRequest:,Controller为泛型类,T为接口的类型,具体定义某个控制类是需指定T,如class JointPositionController: public controller_interface::Controller<hardware_interface::VelocityJointInterface>
virtual bool initRequest(hardware_interface::RobotHW* robot_hw, 机器人硬件接口类
ros::NodeHandle& root_nh, controllerManger所在的节点
ros::NodeHandle& controller_nh, 本控制器所在的节点
ClaimedResources& claimed_resources) 该控制器声索的资源
{
// get a pointer to the hardware interface 获取RobotHW中包含的**Interface类
T* hw = robot_hw->get<T>();
// return which resources are claimed by this controller
hw->clearClaims();
if (!init(hw, controller_nh) || !init(hw, root_nh, controller_nh))
{
ROS_ERROR("Failed to initialize the controller");
return false;
}
hardware_interface::InterfaceResources iface_res(getHardwareInterfaceType(), hw->getClaims());//获取interface声索的Handle资源
claimed_resources.assign(1, iface_res);
hw->clearClaims();
// success
state_ = INITIALIZED;
return true;
}