ros_control学习

前言

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 ManagerRobotHW,基于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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值