Robot:机器人描述文件
type
status
date
slug
summary
tags
category
icon
password
一个多关节级联的实例。(按住左键拖动转动视角,按住右键拖动任意移动视角,滚轮放大缩小。右侧滑动条可自由控制关节角度)
0 预备知识
0.0 符号约定
坐标系
采用右手坐标系。面向屏幕时,屏幕右方为x轴正方向,上方为y轴正方向,屏幕往外是z轴正方向:
一般约定坐标系红色为x轴,绿色为y轴,蓝色为z轴(xyz依次对应RGB)。
单位制
角度采用弧度制,浮点数,取值范围为R。例如下图中,向量
(0,0,1)
绕z轴旋转了π/2
到(0,1,0)
。长度单位为米,浮点数,取值范围为R。
颜色采用RGB格式,每个分量为浮点数,取值范围为
[0, 255]
。0.1 JSON格式
JSON格式是一种通用的纯文本数据交换格式,常用于程序之间传递格式化的信息。相比于XML等其他数据格式,JSON能兼顾人类理解和机器解析的效率。目前绝大多数编程语言都能方便地对JSON格式进行读写。
JSON由两种数据结构构成:对象(object)和数组(array)。
对象(object)
对象由键值对组成的无序集合,键是字符串,值可以是任何类型,包括对象和数组。对象由一对花括号
{ }
包围,键和值之间用冒号:
分隔。键值对之间用逗号,
分隔。例如描述一个学生的信息:
数组(array)
数组是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号
[ ]
包裹,值之间用逗号,
分隔。例如给这个学生加入课程信息:
嵌套
对象和数组之间可以任意嵌套使用。例如创建一个联系方式的对象:
给学生加入联系方式:
1 机器人拓扑结构
1.0 定义:开链和闭链机器人
首先直观定义开链和闭链机器人。例如一个挖掘机是一个典型的闭链机器人。
因为它有由液压油缸组成的闭环结构,如图中的三个三角形:
而开链机器人没有这样的闭环结构,例如典型的机械臂型机器人:
本节首先考虑不含闭环结构的开链机器人结构。
1.1 拓扑结构
开链机器人的结构可以用树形结构来描述:
图中的方块表示机器人的部件(link),黄点表示连接部件的关节(joint)。
我们可以用树的数据结构来表示机器人的拓扑结构。图中的节点(node)表示机器人的部件,边(edge)表示机器人的关节。
可以观察到整个拓扑图的特点:
- 没有环状结构;
- 除第一个节点外(机器人底座部件对应的节点),每个节点都对应唯一的一个父节点,二者通过唯一的一个关节来连接。可认为底座部件的父节点为世界(world)。
2 开链机器人的描述
2.0 刚体运动
我们把机器人的每个部件当作理想刚体,即只能进行移动(translation)和转动(rotation),而不能进行任何变形。
例如拿出机器人的任意一个部件,把这个部件简化为一个长方体来考虑:
假设图中黄色点为这个部件的坐标原点(坐标原点的选取约定见2.1节):
三维空间中的自由刚体可以做:沿x,y,z轴任意移动、绕x,y,z轴任意转动,因此三维空间自由刚体有六个自由度。
这里说的”六个自由度“可以简单理解为:给出六个坐标(移动距离
translation = {x, y, z}
和旋转角度orientation= {x, y, z}
)就能唯一确定这个刚体的空间位姿(位置+姿态)。刚体运动举例
①绕z轴旋转一定角度θ:
这个运动是:绕初始坐标系的z轴正向旋转了θ度,可以表示为:
orientation= {0, 0,
θ
}, translation = {0, 0, 0}
②沿x轴移动一定距离Δx:
注意这些运动都是相对于初始坐标系来讲的。任何时候考虑刚体运动首先都要确定参考系。
这个运动是:沿着x轴方向移动了Δx,可以表示为:
orientation= {0, 0, 0}, translation = {
Δx
, 0, 0}
刚体运动合成*
刚体的运动不一定只有移动或者只有转动,更常见的情况是又有移动又有转动。
注意,我们始终是站在初始坐标系的角度来考虑运动,因此”先旋转再平移“和”先平移再旋转“是不同的。下图左边为先旋转再平移,右边为先平移再旋转。
我们约定采用先旋转再平移的变换。上图左边的运动为先旋转了θ度到位形①,又沿着x轴平移了Δx到位形②。②描述为:
orientation= {
θ
, 0, 0}, translation = {
Δx
, 0, 0}
。*这种旋转+平移的变换统称为刚体变换,可用4x4矩阵变换矩阵表示。参考:
2.1 机器人部件描述
知道了如何描述基本的刚体运动,我们就可以用JSON格式化描述一个具体的部件了。
下面是一个关节部件的例子,接下来逐条解释各个属性.
名字(name)
首先为部件定义唯一的名字(name)。注意部件以名字为唯一标识符,不能与其他部件重名。
部件偏移量
再为部件定义相对于其自身坐标系的平移(origin_translation)和旋转(origin_orientation)。一般默认没有任何运动即可。
模型(visual)
定义部件的外观模型(visual)。
几何偏移量
首先解释visual里面的origin_translation和origin_orientation属性。
通常,在使用blender之类的建模软件或者用代码生成三维模型时,会把模型原点放在坐标原点(0, 0, 0),如下图:
假设我们要让这个模型绕z轴旋转
π/4
(图中蓝色为旋转轴示意图):而很多机械部件的旋转轴并不在部件中心,更普遍的是在部件的某一侧.如下图机械臂的某部件:
因此,如果部件的模型原点不和旋转轴重合,就要定义一个偏移量,来让程序知道正确的旋转轴位置.
如下图,让模型相对于模型原点沿x轴移2,再绕z轴旋转
π/4
:这就对应着描述文件里的:
旋转偏移量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).系统会根据尺寸自动生成模型:
(此处可以看出如果,"box"的模型原点在最左侧,不需要手动设定偏移)
再例如半径分别为0.2,0.1,高度为2的圆柱体(cylinder):
(此处可以看出,圆柱体默认是沿着x方向躺着的,模型原点在底部)
- 外部链接模型(暂时只支持.obj格式),“type”为“mesh”类型:
例如,外部连接一个机械臂部件:
其中"url"指定模型路径,"scale"指定在xyz方向上的缩放比例
材质(geometry)
暂时支持自定义模型的颜色"color"属性。下面是同一个模型分别为[0, 120, 10]和[120, 10, 0]的效果:
todo:支持obj格式的贴图
2.2 机器人关节描述
交互实例(按住左键拖动转动视角,按住右键拖动任意移动视角,滚轮放大缩小。右侧滑动条可自由控制关节角度):
以上图最简单的旋转关节为例。图中白色圆柱是关节的示意图,表示其允许绕z轴转动。
我们依然用一个简单的图示来表示:
对于一个关节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):固定两个部件的相对位置
后文会分别说明这三种关节的用法。
关节偏移量
joint相对于父link原点的位姿由origin_translation和origin_orientation两个偏移量定义。若两个都是[0,0,0]则link0和link1原点就会重合:
此处我们可以看出,joint的位姿是相对于其父link原点的相对坐标:
这里joint2连接link1和link2。joint2的偏移量是
轴(axis)
分类讨论三种关节的轴:
1 转动关节(revolute)
我们规定,一个转动关节只能绕其自身xyz轴的某一个轴旋转。"axis"定义为:
效果如下:
2 滑动关节(prismatic)
同样,滑动关节也只能沿着xyz轴的某一个轴平移。"axis"定义为:
例如下面为沿x轴运动的油缸,只允许关节在x方向移动。
3 固定关节(fixed)
固定关节不需要定义轴,直接省略"axis"属性即可。
限位(limit)
现实中的机械结构不可能转动到任意角度或滑动到任意位置,例如人的胳膊弯曲的角度是有上下限的、液压油缸行程也是有上下限的。分类讨论三种关节的限位:
1 转动关节(revolute)
定义转动关节旋转角度的上限"lower"和下限"upper",都是弧度制的度数。例如最高向正方向转
π/2
,最低向负方向转π/2
.效果如下:
2 滑动关节(prismatic)
定义滑动关节平移距离的上限"lower"和下限"upper"。例如最高向正方向移动2.0 ,最低向负方向转移动-2.0。
效果如下:
3 固定关节(fixed)
固定关节不需要定义限位,直接省略"limit"属性即可。
特殊情况:根部件
每个部件都有其对应的关节,如上面的link1的关节是joint1.但是图中并未有link0所对应的关节,因为link0本身已经是根节点,没有父节点。
为link0定义一个抽象的父节点base_link。link0通过joint0和base_link连接。
概念上可认为base_link绑定在场景的世界坐标的原点处。base_link是一个虚拟的概念,并不存在几何实体。
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 闭环结构
前面讨论的都是开链接机器人,接下来讨论带闭环结构的闭链机器人。
这里暂时只讨论带有油缸结构的“三角闭环”。如下图起重机。
分析这个三角闭环结构的拓扑结构:
下面为实例,拖动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):油缸两端距离的最大最小值。
完整的机器人描述文件
对比观察场景和描述文件中的部件和关节描述信息。
有多个约束的复杂例子
4.2 三角闭环约束求解*
todo
5 逆向运动学*
todo
5.0 逆向运动学原理*
todo
解析法
数值法
5.1 解析法求解*
todo