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学习 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 细谈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