Robot:机器人描述文件
type
status
date
slug
summary
tags
category
icon
password
一个多关节级联的实例。(按住左键拖动转动视角,按住右键拖动任意移动视角,滚轮放大缩小。右侧滑动条可自由控制关节角度)

0 预备知识

 

0.0 符号约定

坐标系

采用右手坐标系。面向屏幕时,屏幕右方为x轴正方向,上方为y轴正方向,屏幕往外是z轴正方向:
notion image
一般约定坐标系红色为x轴,绿色为y轴,蓝色为z轴(xyz依次对应RGB)。

单位制

角度采用弧度制,浮点数,取值范围为R。例如下图中,向量(0,0,1)z轴旋转了π/2(0,1,0)
notion image
长度单位为米,浮点数,取值范围为R
颜色采用RGB格式,每个分量为浮点数,取值范围为[0, 255]

0.1 JSON格式

JSON格式是一种通用的纯文本数据交换格式,常用于程序之间传递格式化的信息。相比于XML等其他数据格式,JSON能兼顾人类理解和机器解析的效率。目前绝大多数编程语言都能方便地对JSON格式进行读写。
JSON由两种数据结构构成:对象(object)和数组(array)。

对象(object)

对象由键值对组成的无序集合,是字符串,可以是任何类型,包括对象和数组。对象由一对花括号{ }包围,键和值之间用冒号:分隔。键值对之间用逗号,分隔。
例如描述一个学生的信息:
 

数组(array)

数组是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号[ ]包裹,值之间用逗号,分隔。
例如给这个学生加入课程信息:
 
嵌套
对象和数组之间可以任意嵌套使用。例如创建一个联系方式的对象:
给学生加入联系方式:

1 机器人拓扑结构

1.0 定义:开链和闭链机器人

首先直观定义开链和闭链机器人。例如一个挖掘机是一个典型的闭链机器人。
notion image
因为它有由液压油缸组成的闭环结构,如图中的三个三角形:
notion image
而开链机器人没有这样的闭环结构,例如典型的机械臂型机器人:
notion image
notion image
本节首先考虑不含闭环结构的开链机器人结构。

1.1 拓扑结构

开链机器人的结构可以用树形结构来描述:
notion image
图中的方块表示机器人的部件(link),黄点表示连接部件的关节(joint)
我们可以用树的数据结构来表示机器人的拓扑结构。图中的节点(node)表示机器人的部件边(edge)表示机器人的关节。
notion image
notion image
可以观察到整个拓扑图的特点:
  • 没有环状结构;
  • 除第一个节点外(机器人底座部件对应的节点),每个节点都对应唯一的一个父节点,二者通过唯一的一个关节来连接。可认为底座部件的父节点为世界(world)。
 

2 开链机器人的描述

2.0 刚体运动

我们把机器人的每个部件当作理想刚体,即只能进行移动(translation)转动(rotation),而不能进行任何变形。
例如拿出机器人的任意一个部件,把这个部件简化为一个长方体来考虑:
notion image
 
假设图中黄色点为这个部件的坐标原点(坐标原点的选取约定见2.1节):
notion image
三维空间中的自由刚体可以做:沿x,y,z轴任意移动、绕x,y,z轴任意转动,因此三维空间自由刚体有六个自由度。
这里说的”六个自由度“可以简单理解为:给出六个坐标(移动距离translation = {x, y, z}和旋转角度orientation= {x, y, z})就能唯一确定这个刚体的空间位姿(位置+姿态)。

刚体运动举例

①绕z轴旋转一定角度θ
notion image
这个运动是:绕初始坐标系的z轴正向旋转了θ度,可以表示为:
orientation= {0, 0, θ}, translation = {0, 0, 0}
②沿x轴移动一定距离Δx
notion image
注意这些运动都是相对于初始坐标系来讲的。任何时候考虑刚体运动首先都要确定参考系。
这个运动是:沿着x轴方向移动了Δx,可以表示为:
orientation= {0, 0, 0}, translation = {Δx, 0, 0}

刚体运动合成*

刚体的运动不一定只有移动或者只有转动,更常见的情况是又有移动又有转动。
注意,我们始终是站在初始坐标系的角度来考虑运动,因此”先旋转再平移“和”先平移再旋转“是不同的。下图左边为先旋转再平移,右边为先平移再旋转。
notion image
我们约定采用先旋转再平移的变换。上图左边的运动为先旋转了θ度到位形①,又沿着x轴平移了Δx到位形②。②描述为:
orientation= {θ, 0, 0}, translation = {Δx, 0, 0}
*这种旋转+平移的变换统称为刚体变换,可用4x4矩阵变换矩阵表示。参考:

2.1 机器人部件描述

知道了如何描述基本的刚体运动,我们就可以用JSON格式化描述一个具体的部件了。
下面是一个关节部件的例子,接下来逐条解释各个属性.

名字(name)

首先为部件定义唯一的名字(name)。注意部件以名字为唯一标识符,不能与其他部件重名。

部件偏移量

再为部件定义相对于其自身坐标系的平移(origin_translation)和旋转(origin_orientation)。一般默认没有任何运动即可。

模型(visual)

定义部件的外观模型(visual)

几何偏移量

首先解释visual里面的origin_translationorigin_orientation属性
通常,在使用blender之类的建模软件或者用代码生成三维模型时,会把模型原点放在坐标原点(0, 0, 0),如下图:
notion image
假设我们要让这个模型绕z轴旋转π/4 (图中蓝色为旋转轴示意图):
notion image
notion image
而很多机械部件的旋转轴并不在部件中心,更普遍的是在部件的某一侧.如下图机械臂的某部件:
notion image
 
因此,如果部件的模型原点不和旋转轴重合,就要定义一个偏移量,来让程序知道正确的旋转轴位置.
 
如下图,让模型相对于模型原点沿x轴移2,再绕z轴旋转π/4 :
notion image
notion image
这就对应着描述文件里的:
旋转偏移量origin_orientation也是同理.
注意,下面的情况origin_translation和origin_orientation都为[0,0,0]即可:
  • 模型文件生成后,模型原点已经和旋转轴原点重合.(方便起见,推荐生成模型时就让模型原点就已经和旋转轴原点原点重合).如何链接外部文件见下一小节.
  • "geometry""type"为”box””cylinder”等系统预设的基础几何体,例如:

    几何体(geometry)

    再介绍描述几何体信息的"geometry"属性:
    几何体“type”属性定义了几何体的类型信息.可分为:
    • 基本集合体(简单的几何形状),如长方体(box)圆柱体(cylinder)等。只需要描述几何参数即可.
      • 例如xyz方向尺寸分别为3, 0.2, 0.2的长方体(box).系统会根据尺寸自动生成模型:
        notion image
        (此处可以看出如果,"box"的模型原点在最左侧,不需要手动设定偏移)
        再例如半径分别为0.2,0.1,高度为2的圆柱体(cylinder):
        notion image
        (此处可以看出,圆柱体默认是沿着x方向躺着的,模型原点在底部)
    • 外部链接模型(暂时只支持.obj格式),“type”为“mesh”类型:
      • 例如,外部连接一个机械臂部件:
        其中"url"指定模型路径,"scale"指定在xyz方向上的缩放比例

    材质(geometry)

    暂时支持自定义模型的颜色"color"属性。下面是同一个模型分别为[0, 120, 10]和[120, 10, 0]的效果:
    notion image
    notion image
    todo:支持obj格式的贴图

    2.2 机器人关节描述

    notion image
    notion image
    notion image
    交互实例(按住左键拖动转动视角,按住右键拖动任意移动视角,滚轮放大缩小。右侧滑动条可自由控制关节角度):
    以上图最简单的旋转关节为例。图中白色圆柱是关节的示意图,表示其允许绕z轴转动。
    我们依然用一个简单的图示来表示:
    notion image
    对于一个关节joint,它的作用是连接两个独立的部件(link)。
    • 一个joint有且仅有一个父link、有且仅有一个子link。这个例子中,joint1的父子部件分别为link0和link1。
    • joint控制其对应的子link的运动。这个例子中,可以理解为joint1旋转,绑在其上的link1随着它旋转。通常joint1可被称为link1的关节。
    • joint对于其子link的位置就是子link原点的位置(参考visual的几何偏移量)。joint相对于其父link的位置由关节偏移量定义(见下)
    接下来就以这个例子,逐条解释关节的每个属性。

    名字(name)

    首先为关节定义唯一的名字(name)。注意,和部件一样,关节以名字为唯一标识符,不能与其他关节重名。

    父节点和子节点(parent, child)

    为关节指定它连接的父子部件(这里体现了命名必须唯一,否则无法正确找到父子部件):

    类型(type)

    关节的类型,目前支持三种关节:
    • 转动关节(revolute):部件间绕某轴相对转动
    • 滑动关节(prismatic):部件间沿某轴相对移动
    • 固定关节(fixed):固定两个部件的相对位置
    后文会分别说明这三种关节的用法。

    关节偏移量

    notion image
    joint相对于父link原点的位姿由origin_translation和origin_orientation两个偏移量定义。若两个都是[0,0,0]则link0和link1原点就会重合:
    notion image
    此处我们可以看出,joint的位姿是相对于其父link原点的相对坐标:
    notion image
    这里joint2连接link1和link2。joint2的偏移量是

    轴(axis)

    分类讨论三种关节的轴:
    1 转动关节(revolute)
    我们规定,一个转动关节只能绕其自身xyz轴的某一个轴旋转。"axis"定义为:
    效果如下:
    notion image
    notion image
    notion image
    2 滑动关节(prismatic)
    同样,滑动关节也只能沿着xyz轴的某一个轴平移。"axis"定义为:
    例如下面为沿x轴运动的油缸,只允许关节在x方向移动。
    notion image
    3 固定关节(fixed)
    固定关节不需要定义轴,直接省略"axis"属性即可。
     

    限位(limit)

    现实中的机械结构不可能转动到任意角度或滑动到任意位置,例如人的胳膊弯曲的角度是有上下限的、液压油缸行程也是有上下限的。分类讨论三种关节的限位:
    1 转动关节(revolute)
    定义转动关节旋转角度的上限"lower"和下限"upper",都是弧度制的度数。例如最高向正方向转π/2 ,最低向负方向转π/2 .
    效果如下:
    notion image
    notion image
    2 滑动关节(prismatic)
    定义滑动关节平移距离的上限"lower"和下限"upper"。例如最高向正方向移动2.0 ,最低向负方向转移动-2.0。
    效果如下:
    notion image
    notion image
    3 固定关节(fixed)
    固定关节不需要定义限位,直接省略"limit"属性即可。

    特殊情况:根部件

    每个部件都有其对应的关节,如上面的link1的关节是joint1.但是图中并未有link0所对应的关节,因为link0本身已经是根节点,没有父节点。
    为link0定义一个抽象的父节点base_link。link0通过joint0和base_link连接。
    概念上可认为base_link绑定在场景的世界坐标的原点处。base_link是一个虚拟的概念,并不存在几何实体。
    notion image
    base_link只是抽象概念,不需要定义。
    joint0定义为一个fixed关节,定义如下:
    parent为base_link,系统就会认为这个joint为根节点的joint。
    偏移量origin_translation和origin_orientation定义了joint0相对于base_link的偏移,而base_link是世界坐标的原点,因此我们通过这两个偏移量控制整个机器人的世界坐标。下面的例子中可滑动joint0的位置xyz转动xyz来查看改变机器人世界坐标的效果。
    下面是转动关节的实例(轴为z轴,限位范围[π/2,π/2]):
    下面是滑动关节的实例(轴为x轴,限位范围[-2, 2]):

    2.3 完整的机器人描述

    有了机器人的部件(link)关节(joint),我们就能把他们组成一个完整的机器人了。

    例子1:旋转部件

    下面是一个完整的机器人描述文件,有两个部件,一个旋转关节:

    描述文件和运行效果

    下面是这个描述文件定义的机器人:
    可以看出,一个机器人文件是一个JSON对象,由一对{}包围,一共有四个属性:
    • 名字(name)
    • 部件(links)
    • 关节(joints)
    • 约束(constraints)
    下面解释这个对象的各个属性。

    名字(name)

    首先为这个机器人定义名字(name)
     

    部件(links)

    是一个数组,保存了机器人的所有部件。这里我们有两个,link0和link1
     

    关节(joints)

    是一个数组,保存了机器人的所有关节。这里我们有两个:连接base_link和link0的joint0,连接link0和link的joint1:
     

    约束(constraints)

    是一个数组,保存了机器人的所有约束。这里暂时为空,第四节会具体介绍。
     

    例子2:滑动部件

    下面是一个完整的机器人描述文件,有两个部件,一个滑动关节:

    描述文件和运行效果

    下面是这个描述文件定义的机器人:

    例子3:自己尝试编写一个描述文件😃

    这里有一个可以自己上传机器人描述文件(.json格式)的在线程序:
    把上面两个例子的机器人描述保存为一个本地的.json文本文件。点击左上角按钮,上传这个文件看看效果。然后尝试自己修改.json里的部件、关节参数,加入新的部件、关节,上传查看效果。(暂不支持外部链接obj模型)。

    3 正向运动学*

    todo

    4 闭环结构

    前面讨论的都是开链接机器人,接下来讨论带闭环结构的闭链机器人。
    这里暂时只讨论带有油缸结构的“三角闭环”。如下图起重机。
    notion image
    分析这个三角闭环结构的拓扑结构:
    notion image
    notion image
    下面为实例,拖动constraint0的length来伸缩油缸。
    我们把构成这一整个三角形闭环的部件和关节统称为一个约束(constraint)。
    这个约束里包括部件:
    • 基座部件lifting_base
    • 悬臂arm
    • 油缸的活塞杆piston_rod
    • 油缸的肛管cylinder_tube
    关节:
    • 连接lifting_base和arm的关节L
    • 连接lifting_base和cylinder_tube的关节A
    • 连接arm和piston_rod的关节B
    这些约束和关节的定义和之前的格式一样。我们描述一个约束只需要指定这三个关节L、A、B即可。

    4.1 三角闭环结构描述格式

    约束描述

    下面是对这种三角形约束的描述格式:
    • 名字(name):这个约束的名字,不能和其他约束重名
    • 类型(type):目前只有这一种约束,写triangle-prismatic即可
    • jointL
    • jointA
    • jointB
    • 初始长度(length):如下图,jointA到jointB的初始长度,即油缸两端的初始距离
    • 限位(limit):油缸两端距离的最大最小值。
    notion image
     

    完整的机器人描述文件

    对比观察场景和描述文件中的部件和关节描述信息。

    有多个约束的复杂例子

     

    4.2 三角闭环约束求解*

    todo

    5 逆向运动学*

    todo

    5.0 逆向运动学原理*

    todo
    解析法
    数值法

    5.1 解析法求解*

    todo

    © Housz 2021-2024