当前位置: 华文问答 > 数码

工业机器人领域,什么是任务级编程呢?

2017-04-21数码

说一下我的理解。

根据 Robotics:Modelling, Planning and Control 书中的分类,机器人编程分为四个级别:任务级,动作级,初始级,伺服级。下面举例简单说明一下。

目前的工业机器人控制器编程主要是基于「MOVE」指令,主要的指令有三个:MoveL(直线运动),MoveC(圆弧运动),MoveJ(关节运动)。在编程的时候,需要先有目标点的位置,然后运用这些MOVE指令将点连接起来,实现期望的运动轨迹规划动作,完成相应任务。

比如,现在的任务是使机械臂拿起位于A点的瓶子,然后放到B点。那么首先需要知道A、B两个点的位置,然后A、B点之间一个中间点C的位置。机械臂末端先从当前位置O运动到A点,拿起瓶子,然后经过中间点C移动到B,放下瓶子,最后返回初始点O,那么程序可能如下:


MoveJ A; //关节运动到A点; Pick up bottle; MoveC C,B; //从A点经中间点C圆弧运动到B; Drop bottle; MoveJ O; //返回初始点O;

这段代码,便是「动作级」的指令 。代码详细规定了在完成「拿起位于A点的瓶子,然后放到B点」这个任务中,机械臂末端需要走的轨迹是什么。在真实的编程中,还需要给定每一段轨迹的速度、转弯区等参数。

控制系统得到了这段「动作级」指令之后,便开始「初始级」的规划。 具体来说就是插值计算出直线、圆弧轨迹上的点,根据机械臂的动力学模型(如果有的话)对运动轨迹进行速度、加速度的规划和限制等等,最后产生能够输入伺服系统的信息(一般来说是每个时间周期各个关节电机的目标角度或目标力矩)。

最后就是「伺服级」的控制 。伺服系统得到了先前步骤计算得到的结果,伺服驱动各个关节的电机运动。

实现上述流程对编程人员来说还是很辛苦的。首先,要想知道A、B点准确的位置,需要去示教,即便是使用离线的仿真平台,也存在着和实际情况有偏差、需要标定的问题;其次,如果机械臂当前位置和A点中间有障碍,或A、B点中间有障碍,那么上述代码恐怕就不够了,编程人员需要示教更多的点避开那些障碍,代码和轨迹都会变得更复杂,可能变成如下模样:


MoveL A0; MoveL A1; …… MoveL A; //经过若干中间点到达A点 Pick up bottle; MoveL B0; MoveL B1; …… MoveL B; //经过若干中间点到达B点 Drop bottle; MoveL O0; MoveL O1; …… MoveL O; //经过若干中间点返回O点

更极端的情况下,如果A、B的位置都在变化、甚至障碍的位置也在变化,那么用这种预先写好代码的方式控制就无能为力了。

现在,为了解决上述问题,假如能为机械臂配备上视觉系统,以及其他感知环境的传感器,那么,机器人控制系统能实时的得到环境的信息了,也就是A、B点、瓶子、障碍物的信息。有了这些信息,先进的规划算法能够智能规划出机器人到达目标点、并且避开沿途障碍物的轨迹,并且在整个过程中都能对突发的情况作出反应并处理。

当上述功能实现了,也就能做「任务级」的编程了,很可能就是一行代码:


Put bottle on B;

这行代码输入以后,控制系统能自动实时的识别瓶子、B点,并自主规划任务中间的路径等工作,完成动作级及以下的环节。

是不是很amazing!

目前这方面工作比较靠前的是mujin,

Robot Intelligence for Industrial Automation

仿真环境是 OpenRave


------------------------------------------------------------------

@冯jungle

以下例子是我个人理解,如有不对的地方请各位大神指教


假设一个场景:有一个周末,你爸在沙发上看电视,你妈在打扫卫生,你在卧室玩电脑。这时,你爸突然叫你:「给我倒一杯水来。」

这便是给你下达了一个「任务级」的指令。

接到这个非常抽象的任务指令之后,你的大脑智能的将这条指令分解规划成以下动作:从当前所在的卧室走到饮水机处——拿起饮水机旁的杯子——接水——从饮水机处走到你爸坐的沙发边——将水杯递给你爸——返回卧室。

这个过程,就是将抽象的任务级指令分解为动作级指令。然后你就控制身体开始行动,这个部分就是初始级和伺服级的工作了。

所以你说的没错,「task则是由skill按照序列组合的一个skill集合」,动作级指令的序列合起来构成了需要完成的任务。

但是,事情没那么简单。要完成这个任务,你至少要做到如下几点:

1、 知道饮水机在哪儿;

2、 知道杯子就在饮水机旁边,否则需要重新规划路径;

3、 知道你爸在哪儿;

4、 知道你家的整体布局;

5、 行动过程中能实时看到真实环境,因为你妈在打扫卫生的时候很可能移动了家里桌椅板凳的位置,而且她会一直在你的行动路径上穿梭。

先来看前四条。因为你的大脑是个智能系统,能自行识别和处理这些信息;但如果不行,你对这些信息一无所知,也没有智能系统,那就需要「人工示教」了:

首先,你爸要告诉你水机的位置、告诉你杯子就在水机旁边以及他的沙发的位置,这就是示教工作;然后,由于你无法处理抽象的任务级指令,你爸只能下达详细的动作级指令:「从卧室出门右转走十步到饮水机处拿旁边的杯子接水然后左转走十步走到沙发这里把水杯给我再按照原路回你的卧室。」

这个情况太极端了,一般人不会弱到这个程度(但目前的工业机器人就是弱到这个程度)。一个可能的情况是你爸妈搬了新家以后你是第一次回去,所以只是对具体物品的位置不熟悉,那么当你接收了你爸的「任务级」指令以后,他只需要向你「示教」前三条信息,那么你自己就可以完成之后的工作了。

可见,你的智能等级越高,需要人工示教的东西就越少,按人的等级来说基本是不需要什么示教的。但是,一个能执行「任务级」指令的系统可能也需要示教,只不过这个示教工作可能被之后系统智能的提升取代掉。

至于离线和在线编程,就和这个例子中的第五条有关了。如果你是通过「离线编程」,并且在「离线状态」下执行这个任务级指令,就相当于先蒙上你的眼睛,然后给你下达了接水任务,这时其实你是知道该怎么做的(已离线规划好),但是你不知道你走的过程中会不会碰上被你妈暂时改变了位置的桌椅板凳、甚至直接和你妈撞上,因为你无法获取环境信息,只能靠你脑子中之前储存的「离线信息」工作,这就有可能出问题。但是,如果你妈没在打扫卫生,真实环境和之前是一样的,那么你即便是处于蒙上眼睛的「离线状态」,也能完成任务。

而如果你是在「在线状态」下执行指令,就和一个正常人一样了,你既可以执行「任务级」指令,也可以执行「动作级」指令,重要的是你能实时感知执行过程中环境的信息并做出相应的反应。

因此,一个能执行任务级指令的系统可以是离线编程、离线运行的系统;只不过一个优秀的、真正智能的任务级系统,也需要是一个感知环境并做出反应的实时系统。