您现在的位置是:首页 > 正文

ros 机械臂学习之ros control 学习笔记 2

2024-04-01 00:00:43阅读 1

joint_trajectory_controller

接着上篇笔记聊该控制器。

- 轨迹表示
控制器采用模板化的方式,可以支持多种轨迹表达方式。
默认情况下采用了样条曲线插值法。
插值法的大致分为以下几类:
线性,三次,五次。(根据位置,速度,加速度的对应关系)
- 硬件接口类型
该控制器支持多种硬件接口类型。如针对关节的位置,速度以及力控制接口。
对于位置控制方式,目标位置(指令)直接面向关节。
然而对于速度或者是力控方式(关节),位置以及速度轨迹跟踪误差通过PID回路映射到速度(作用力)指令。就是说这里用到了pid进行调节。
可以从以下代码看到配置区别:

 head_controller:
  type: "position_controllers/JointTrajectoryController"
  joints:
    - head_1_joint
    - head_2_joint
head_controller:
  type: "velocity_controllers/JointTrajectoryController"
  joints:
    - head_1_joint
    - head_2_joint
  gains: # Required because we're controlling a velocity interface
    head_1_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}
    head_2_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}

注意:可以根据自己的需要定义新的硬件接口,只要满足或者是相似于上面提到的轨迹表达案例。(这里我的理解是只要你的trajectory消息类型和定义的匹配) 或者你也可以针对已支持的接口进行一个重映射(替换),例如你可以配置一个代理控制器用于生成力控命令。
其他需要考虑的点
实时安全的实现。
正确处理缠绕(连续)接头。
对系统时钟变化的鲁棒性:不连续的系统时钟变化不会导致已经排队的轨迹段的执行不连续。

  • 发送轨迹
    可用的接口:
    在ros中有两大机制用于发送轨迹给控制器:
    action interface 以及 topic interface 这里就是我们常说的话题方式以及action方式。
    如果allow_partial_joint_goal未设置为True,则两者都使用轨迹_msgs/JointTrajectory消息来指定轨迹,并要求为所有控制器关节指定值(而不是仅指定子集)。
    主要用action 方式发送,具体功能以及好处可以学习相关ros基础。
    Important note Even when a goal has been aborted, the controller will still attempt to execute the trajectory as best as possible.
    话题方式不存在实时反馈,发出去就不管了。尽管可以提供一定程度上的监控,通过query_state service and state topic (详情见ros api),但实现起来要比action麻烦的多。

  • 抢先策略
    同一时刻只有1个action goal保持活跃状态,或者topic interfac使用的话就没有。
    路径与目标差异容忍值只针对active goal有效。
    如果一个活跃的active goal被另一个来自action或者话题接口的命令抢注,该目标会被取消并且客户端会被通知。
    提到了empty trajectory(来自topic interface)的内容。

  • 轨迹替换
    1 joint trajectory 信息中通过header 中时间戳来设置一个开始执行的时间,默认为0表示现在开始。
    2 新到来的轨迹命令并不会立即抛弃当前的轨迹执行然后去执行新的。而是会结合两者的有效信息。
    这里给出了详细讨论的链接:

 http://wiki.ros.org/joint_trajectory_controller/UnderstandingTrajectoryReplacement

总结为以下几点:
1 获取新轨迹的有用部分:获取新轨迹的way points,并进行替换。要是与之前轨迹中的way points没区别的话,就继续执行操作。
2 获取当前轨迹的有用部分: 保留当前轨迹直到新轨迹的开始时间,之后会丢弃后面的部分。
3 结合上述两部分。

具体例子介绍可见上述链接。

ros api

  • Action interface
    control_msgs::FollowJointTrajectoryAction
    in the follow_joint_trajectory namespace of the controller.
# The joint trajectory to follow
trajectory_msgs/JointTrajectory trajectory

# Tolerances for the trajectory.  If the measured joint values fall
# outside the tolerances the trajectory goal is aborted.  Any
# tolerances that are not specified (by being omitted or set to 0) are
# set to the defaults for the action server (often taken from the
# parameter server).

# Tolerances applied to the joints as the trajectory is executed.  If
# violated, the goal aborts with error_code set to
# PATH_TOLERANCE_VIOLATED.
JointTolerance[] path_tolerance

# To report success, the joints must be within goal_tolerance of the
# final trajectory value.  The goal must be achieved by time the
# trajectory ends plus goal_time_tolerance.  (goal_time_tolerance
# allows some leeway in time, so that the trajectory goal can still
# succeed even if the joints reach the goal some time after the
# precise end time of the trajectory).
#
# If the joints are not within goal_tolerance after "trajectory finish
# time" + goal_time_tolerance, the goal aborts with error_code set to
# GOAL_TOLERANCE_VIOLATED
JointTolerance[] goal_tolerance
duration goal_time_tolerance

---
int32 error_code
int32 SUCCESSFUL = 0
int32 INVALID_GOAL = -1
int32 INVALID_JOINTS = -2
int32 OLD_HEADER_TIMESTAMP = -3
int32 PATH_TOLERANCE_VIOLATED = -4
int32 GOAL_TOLERANCE_VIOLATED = -5

# Human readable description of the error code. Contains complementary
# information that is especially useful when execution fails, for instance:
# - INVALID_GOAL: The reason for the invalid goal (e.g., the requested
#   trajectory is in the past).
# - INVALID_JOINTS: The mismatch between the expected controller joints
#   and those provided in the goal.
# - PATH_TOLERANCE_VIOLATED and GOAL_TOLERANCE_VIOLATED: Which joint
#   violated which tolerance, and by how much.
string error_string

---
Header header
string[] joint_names
trajectory_msgs/JointTrajectoryPoint desired
trajectory_msgs/JointTrajectoryPoint actual
trajectory_msgs/JointTrajectoryPoint error
  • 订阅话题
    command (trajectory_msgs/JointTrajectory)
  • 发布话题
    state (control_msgs/JointTrajectoryControllerState)
  • 服务
    query_state (control_msgs/QueryTrajectoryState)
    这里只是简单的笔记记录,具体代码例子介绍可以见ros wiki相关页面。
    这里给一个minimal例子以及一个complete description例子。

到这里其实已经对控制器插件的配置已经有了很清晰的了解了。
可以看到有部分参数配置信息,以及它代表的作用含义。

  head_controller:
 type: "effort_controllers/JointTrajectoryController"
  joints:
    - head_1_joint
    - head_2_joint

  gains: # Required because we're controlling an effort interface
    head_1_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}
    head_2_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}
--------------------------------------------------------------------------
head_controller:
  type: "effort_controllers/JointTrajectoryController"
  joints:
    - head_1_joint
    - head_2_joint

  constraints:
    goal_time: 0.5                   # Override default
    stopped_velocity_tolerance: 0.02 # Override default
    head_1_joint:
      trajectory: 0.05               # Not enforced if unspecified
      goal: 0.02                     # Not enforced if unspecified
    head_2_joint:
      goal: 0.01                     # Not enforced if unspecified

  gains: # Required because we're controlling an effort interface
    head_1_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}
    head_2_joint: {p: 100,  d: 1, i: 1, i_clamp: 1}

  state_publish_rate:  25            # Override default
  action_monitor_rate: 30            # Override default
  stop_trajectory_duration: 0        # Override default

网站文章

  • 如何保证高可用?docker架构拓扑图

    如何保证高可用?docker架构拓扑图

    架构筑基大家都知道,性能一直是让程序员比较头疼的问题。当系统架构变得复杂而庞大之后,性能方面就会下降,如果想成为一名优秀的架构师,性能优化就是你必须思考的问题。所以性能优化专题从JVM底层原理到内存优...

    2024-04-01 00:00:36
  • FindNextFile函数

    一、问题描述 使用FindFirstFile与FindNextFile遍历指定文件夹时,获取不到该文件夹下的文件。 class CMySharedFile; bool GetAllFiles(LPCTSTR lpDir, std::set<CMySharedFile> files); ...... std::set<CMySharedF...

    2024-04-01 00:00:28
  • wordpress删除数据库中修订版本的文章数据

    wordpress删除数据库中修订版本的文章数据

    转载自 bcoder编程网 http://www.bcoder.cn/wordpress%e5%88%a0%e9%99%a4%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ad%e4%bf%ae%e8%ae%a2%e7%89%88%e6%9c%ac%e7%9a%84%e6%96%87%e7%ab%a0%e6%95%b0%e6%8d%ae/ 我们现在要做的就是删除wo

    2024-04-01 00:00:02
  • shell--正则表达式之awk

    一.awk工具的概述 在linux系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于shell脚本,完成各种自动化配置任务 二.awk的常见用法 awk的命令格式如下 awk 选项 ‘模式或条件 {编辑指令}’ 文件1 文件2... /...

    2024-03-31 23:59:55
  • -webkit-background-clip属性不生效问题

    -webkit-background-clip属性不生效问题

    将-webkit-text-fill-color改成color并且调整顺序。-webkit-background-clip属性不生效问题。试了好久,终于找到原因了,泪目( Ĭ ^ Ĭ )在浏览器勾选样式后又能够显示,排除浏览器不兼容。

    2024-03-31 23:59:51
  • kafka中的AR、ISR、LEO、HW分别是什么

    kafka中的AR、ISR、LEO、HW分别是什么

    AR: Assigned Replicas的缩写,是每个partition下所有副本(replicas)的统称; ISR: In-Sync Replicas的缩写,是指副本同步队列,ISR是AR中的一...

    2024-03-31 23:59:36
  • 从GPT到chatGPT(一):GPT1

    从GPT到chatGPT(一):GPT1

    GPT1,出自于OpenAI的论文,是最早的将transformer以多层堆叠的方式构成语言模型的模型,其出现时间早于BERT,但二者有一个最大的区别在于BERT只用的是transformer的enc...

    2024-03-31 23:59:11
  • 第四章 Android开发三大基石—Activity、Service和Handler(4)

    4.2 千变万化的服务-Service开发Service是Android系统中运行在后台、不和用户交互应用组件。它和Activity的级别差不多,只能在后台运行。每个Service必须在manifest文件中 通过来声明。4.2.1 Service的生命周期Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当

    2024-03-31 23:59:06
  • 活久见!AI巨佬为“人类灭绝论”正面开撕,Hinton吴恩达LeCun下场,马斯克强势围观...

    活久见!AI巨佬为“人类灭绝论”正面开撕,Hinton吴恩达LeCun下场,马斯克强势围观...

    鱼羊 丰色 发自 凹非寺量子位 | 公众号 QbitAI活久见,AI巨佬们撸起袖子线上“对喷”,一“架”直接干上热搜了。Big name一个接一个出现不说:吴恩达、Hinton、LeCun、哈萨比斯…...

    2024-03-31 23:58:59
  • 由遍历序列构造二叉树or二叉搜索树+由连续数构造二叉搜索树

    由遍历序列构造二叉树or二叉搜索树+由连续数构造二叉搜索树

    由遍历序列构造二叉树or二叉搜索树 目录由遍历序列构造二叉树or二叉搜索树由先序与中序遍历序列构造二叉树递归算法:非递归算法:由中序与后序序列构造二叉树由前序与后序序列构造二叉树由前序序列构建二叉搜索...

    2024-03-31 23:58:34