前言
ROS中提供了丰富的机器人应用:SLAM、导航、MoveIt…但是你可能一直有一个疑问,这些功能包到底应该怎么样用到我们的机器人上,也就是说在应用和实际机器人或者机器人仿真器之间,缺少一个连接两者的东西。
ros_control
就是ROS为用户提供的应用与机器人之间的中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等,可以帮助机器人应用快速落地,提高开发效率。
一、总体框架
上图是ros_control的总体框架,可以看到正对不同类型的控制器(底盘、机械臂等),ros_control可以提供多种类型的控制器,但是这些控制器的接口各不相同,为了提高代码的复用率,ros_control还提供一个硬件的抽象层。
硬件抽象层负责机器人硬件资源的管理,而controller从抽象层请求资源即可,并不直接接触硬件。
上图是ros_control的数据流图,可以更加清晰的看到每个层次包含的功能:
-
Controller Manager
:每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。controller manager的输入就是ROS上层应用的输出。 -
Controller
:controller可以完成每个joint的控制,请求下层的硬件资源,并且提供了PID控制器,读取硬件资源接口中的状态,在发布控制命令。 -
Hardware Rescource
:为上下两层提供硬件资源的接口。 -
RobotHW
:硬件抽象层和硬件直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。 -
Real Robot
:实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1。
对比ROS机械臂控制框架
前言
之前学习ROS驱动6自由度机械臂,跟着博主步骤进行学习,再到后来在古月居博客上学习ros_control,对ROS机械臂控制框架有一些疑惑,想理清楚他们之间的关系,讲一下我对这些内容了解。
ROS机械臂控制框架
ROS机械臂控制框架相当于MoveIt!控制机械臂最基本的要求,只需要
- 将Trajectory消息发送给Trajector controller控制器,把消息write到硬件上
- 然后通过joint state controller控制器read机械臂关节状态,便是一次最基本的控制功能
当时就是跟着博主,编写了一份Trajector controller控制器,创建两个节点,实现以下功能
- action server功能来接收 moveit的路径消息,然后将路径消息转换成电机Id +角度r的一个新消息(joint_msg),并发布/arm_motors的话题.
- 由于是舵机,并不能获取其位姿,所以joint state controller控制器其实没有使用到的,因此这里博主是将从接收的路径消息来转换成joint_state消息,并发布/move_group/fake_controller_joint_states的话题。
ros_control框架和ROS机械臂控制框架
随着学习了解,后面学习ros_control框架,有了大概的了解,ros_control相当于ROS机械臂控制框架基础上添加了新的功能,例如Controller Manager
、 RobotHW
,基于ros_control框架,可以实现更多功能。例如:用Controller Manager
来管理不同的controller,可以加载、开始运行、停止运行、卸载不同的controller,并且提供了多种工具来完成这些操作。
ros_control驱动舵机机械臂
Controller Manager
于是我便在之前的基础上,用ros_control驱动舵机机械臂,也是跟着这个博主进行修改代码,对比之前ROS机械臂控制框架,我只用了Trajector controller控制器驱动机械臂,没有使用joint state controller控制器,如果我得使用这两个控制器,就得使用Controller Manager
xxx.yaml
# Publish all joint states -----------------------
joint_state_controller:
type: "joint_state_controller/JointStateController"
publish_rate: 10
# Joint Trajectory Controller - position based -----------------------
hsr_arm_follow_joint_trajectory_controller:
type: "position_controllers/JointTrajectoryController"
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
constraints:
goal_time: 1.0
stopped_velocity_tolerance: 0.05
joint_1: {trajectory: 0.5, goal: 0.1}
joint_2: {trajectory: 0.5, goal: 0.1}
joint_3: {trajectory: 0.5, goal: 0.1}
joint_4: {trajectory: 0.5, goal: 0.1}
joint_5: {trajectory: 1.0, goal: 0.3}
joint_6: {trajectory: 1.0, goal: 0.3}
stop_trajectory_duration: 1.0
state_publish_rate: 20
#action_monitor_rate: 20
xxx.launch
<!-- spawn controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen"
args="joint_state_controller hsr_arm_follow_joint_trajectory_controller"/>
hardware_interface::RobotHW
Hardware Interface是controller和RobotHw沟通的接口,基本上和controllers的种类是对应的,同样可以自己创建需要的接口,可以参考:https://github.com/ros-controls/ros_control/wiki/hardware_interface
写一个类继承 hardware_interface::RobotHW,用来实现各种硬件接口的注册
RobotHW 类派生自InterfaceManger
InterfaceManger类为接口管理类,提供有registerInterface函数,用于注册机器人硬件的接口类(*Interface),并可以用T Get()函数获取接口类的对象
hardware_interface::JointStateInterface js_interface_;
hardware_interface::PositionJointInterface pj_interface_;
//....
// Register interfaces
registerInterface(&js_interface_);
registerInterface(&pj_interface_);
write()和read()
main()
{
MyRobot robot;//这个class MyRobot 继承 hardware_interface::RobotHW实现read() write()
controller_manager::ControllerManager cm(&robot);
while (true)
{
robot.read(); //to access hardware driver, generally need do some wrap and customization in MyRobot class
cm.update(robot.get_time(), robot.get_period());
robot.write(); //to access hardware driver, generally need do some wrap and customization in MyRobot class
sleep();
}
参考文章
学习文章:ros_control
http://wiki.ros.org/ros_control
学习文章:ROS探索总结(三十一)——ros_control
https://www.guyuehome.com/890
学习文章:ROS探索总结(七十)—— 古月私房课 | 基于ROS设计一款机械臂控制系统
https://www.guyuehome.com/3132
学习文章:ros之真实驱动diy6自由度机械臂
https://blog.csdn.net/qq_38288618/article/details/78078037
学习文章:使用ros_control ros_controllers 的牛刀真实驱动舵机手臂的源码
https://blog.csdn.net/qq_38288618/article/details/79005562#commentBox