ros_control学习

2023-11-20

前言

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros_control学习 的相关文章

随机推荐

  • 细谈JavaWeb中的Request和Response

    文章目录 1 Request和Response的概述 2 Request对象 2 1 Request继承体系 2 2 Request获取请求数据 2 2 1 获取请求行数据 2 2 2 获取请求头数据 2 2 3 获取请求体数据 2 2 4
  • 2020最新版KVM虚拟机安装详解

    VMware Workstation Pro15 5下 1 操作环境 CentOS Linux release 7 7 1908 Core 2 需要用到的工具 XSHELL Centos任意版本镜像 3 必须安装的软件 Xmanager p
  • ec6110刷linux系统,华为DIIEC6110M_VER_C主板救砖纯净系统烧录固件包下载

    大家好今天小编跟大家分享关于华为DIIEC6110M VER C主板 强制升级 但是无反应强刷不起作用或短接后只亮一个绿灯 由于盒子厂商系统升级后 屏蔽了强刷模式导致无法使用 短接方式进行强刷 此时短接强刷这条路行不通的时候 需要使用线刷进
  • 2023年4月23日--4月30日(pbr为主,有时间就看看Ue视频教程,50小时,合计2039小时,剩余7961小时)

    按照规划 本周结合工作内容 以Pbr为主 可以从Ue的材质编辑器获取材质参数 写到glsl或者filament引擎 目前 ue视频教程进行到了智 慧 城 市 3 13 mysql 7 1 tf1 4 11 蓝图反射 1 9 moba 1 5
  • mysql 索引类型详解

    索引的类型和存储引擎有关 每种存储引擎所支持的索引类型不一定完全相同 MySQL 索引可以从存储方式 逻辑角度和实际使用的角度来进行分类 存储方式区分 根据存储方式的不同 MySQL 中常用的索引在物理上分为 B 树索引和 HASH 索引两
  • Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 Downie 4 for Mac Downie
  • 编写代码常用快捷键

    编写代码常用快捷键 shift 或 逐个选中字符 ctrl 或 逐词移动光标 ctrl shift 或 逐词选中字符 常用 Home键 将光标移动到行开头 End键 将光标移动到到行结尾 常用 配合shift 或 Shift Home 从光
  • 华为云,站在数字化背后

    一场新的中国数字化战斗 正在被缓缓拉开帷幕 作者 裴一多 出品 产业家 如果说最近的讨论热点是什么 那无疑是互联网云 在数字化进入纵深的当下 一种市面上的观点是互联网的云业务由于盈利等问题 正在成为 被抛弃 的一方 互联网公司开始重新回归T
  • Spyder入门使用教程

    Spyder入门使用教程 Spyder汉化 Spyder汉化博客 创建项目 首先介绍Spyder布局 主要分上面的功能栏和下方的三个区块 点击创建新的项目 选择项目存放的目录 输入项目名 完成项目创建 创建新的文件 按Ctrl S 保存文件
  • Docker 资源汇总

    Docker 资源汇总 转载来源 http codecloud net docker resource 6090 html Menu Main Resources Books Websites Documents Archives Comm
  • Anaconda配置

    Anaconda配置 创建环境 conda create n 环境名 python 3 8 移除环境 conda remove n 环境名 all 查看所有环境 conda env list 激活环境 conda activate 环境名
  • 华为OD机试 - 组装最大可靠性设备(Java )

    题目描述 一个设备由N种类型元器件组成 每种类型元器件只需要一个 类型type编号从0 N 1 每个元器件均有可靠性属性reliability 可靠性越高的器件其价格price越贵 而设备的可靠性由组成设备的所有器件中可靠性最低的器件决定
  • wxwidgets编写多线程程序--wxThread

    细节描述 线程基本上来说是应用程序中一条单独执行的路径 线程有时被称为轻量级进程 但线程与进程的根本不同之处在于不同进程存储空间是相互独立的 而同一进程里的所有线程共享同一地址空间 尽管这使得它更容易共享几个线程间的普通数据 但这也使得它有
  • 企业微信群:机器人实现定时提醒功能

    如果每天都需要 或者经常需要提醒企业微信群里面的人做某一件事情的话 靠人力去实现比较费力 而且偶尔忘记 正好 企业微信群有一个机器人 正可以实现这一功能 1 首先 在企业微信群 添加一个机器人 2 根据企业微信机器人的配置说明 编写程序 这
  • NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.

    出现这个原因就是在指定位置没有找到你想要获取的文件 1 检查你的文件名是否正确 2 你存文件是否带了文件夹 如果带了文件夹 检查文件夹是否正确 本文仅作为笔记
  • List集合的加减操作

    文章目录 一 对List本身有改变 二 对List本身无改变 参考资料 一 对List本身有改变 概述 List1 addAll List2 List1与List2两个集合相加 返回boolean值 原有List1值有变化 List2不变
  • 1-9 人机交互的角度

    操作系统的人机交互部分 OS改善人机界面 为用户使用计算机提供良好的环境 人机交互设备包括传统的终端设备和新型的模式识别设备 OS的人机交互部分用于控制有关设备运行和理解执行设备传来的命令 人机交互功能是决定计算机系统友善性的重要因素 是当
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded
  • ros_control学习

    前言 ROS中提供了丰富的机器人应用 SLAM 导航 MoveIt 但是你可能一直有一个疑问 这些功能包到底应该怎么样用到我们的机器人上 也就是说在应用和实际机器人或者机器人仿真器之间 缺少一个连接两者的东西 ros control就是RO