一种机器人编程方案

背景介绍

1. 当前系统由示教器、控制板和伺服系统组成

2. 示教器和控制板通过网口连接,控制板和伺服系统通过EtherCAT总线连接

3. 示教器基于嵌入式Qt开发,控制板软件使用C++开发

为了能够对工艺流程进行灵活的个性化定制,需要开发一套特定的编程语言,形如:

func void main()
    init()
    loop
        ptp p:p1,vp:5%,sp:-1%
        ptp p:p2,vp:5%,sp:-1%
    endloop
endfunc

这段程序描述的是让机器人在p1、p2点间循环进行点位运动,并且对运动过程中的速度、平滑百分比进行了设置。

其实这里需要设计的就是一套机器人编程系统。在工业机械臂示教系统中,机器人编程系统可以算得上是标配了,各大厂商都为自家的机器人系统设计了机器人语言系统。例如ABB机器人使用的RAPID语言、库卡机器人使用的KRL、史陶比尔机器人使用的VAL3。

编译器工作流程

各大厂商的设计并不开源,具体实现无从得知,不过既然是编程系统,那就离不开编译器。

我们可以回忆下标准编译器的工作流程:

图片[1]-一种机器人编程方案-JieYingAI捷鹰AI

编译器的工作流程简要描述如下:

1. 对源文件进行扫描,将源文件的字符流拆分分一个个的词(记号),此为词法分析

2. 根据语法规则将这些记号构造出语法树,此为语法分析

3. 对语法树的各个节点之间的关系进行检查,检查语义规则是否被违背,同时对语法树进行必要的优化,此为语义分析

4. 遍历语法树的节点,将各节点转化为中间代码,并按特定的顺序拼装起来,此为中间代码生成

5. 对中间代码进行优化

6. 将中间代码转化为目标代码

7. 对目标代码进行优化,生成最终的目标程序

以上阶段划分仅仅是示意性的,实际的编译器中,上面说的这些阶段经常组合在一起,但将这些阶段设想为编译器中一个个单独的片断是对于我们理解编译器的工作流程是非常有用的,且对于编译器设计的模块化也是非常有利的。

系统方案

通过对标准编译器基本流程的理解,我们不难设计出如下方案:

图片[2]-一种机器人编程方案-JieYingAI捷鹰AI

机器人语言编译器部署在示教器上,程序源码通过编译会得到一个"目标程序"文件,将文件放到控制板后,通过对应的"虚拟机"就可以执行了。需要说明的是:

1. 这里提到的"目标程序"并不是我们理解上的机器码,文件内容设计取决于需求,文件结构会影响"虚拟机"的实现。

2. 这里所说的"虚拟机"可以理解为一个虚拟的CPU,用来执行文件里面的指令,实现上可以是一个线程。

对比上文标准编译器,可以看到我们的机器人语言编译器借鉴了其前端部分,由于我们不会生成机器码,同时为了实现简单,不必实现后端部分。

词法分析和语法分析这两块,可以说是在整个编译器当中被自动化得最好的部分。

借助于词法分析工具flex和语法分析工具bison,我们只需要通过编写flex文件(*.l)和bison文件(*.y),即使在没有任何的理论基础的情况下,短时间内也可以做出功能很全的词法分析程序和语法分析程序。

通过语法分析我们会得到抽象语法树,通过遍历这棵多叉树,我们就可以实现语义分析和符号表生成,其中符号表对于编译器至关重要。

符号表应该采用何种数据结构实现,这个问题同样没有统一的答案,有几种最常见的选择:

1. 线性链表

2. 平衡二叉树

3. 散列表

4. Multiset Discrimination

目标代码生成也是通过遍历抽象语法树得到。

落地步骤

上文提及的是总体的一个方案,具体落地步骤应该如下:

1. 设计机器人语言语法

2. 设计目标代码的结构

3. 通过人肉将机器人语言翻译成目标代码(熟悉翻译过程)

4. 借助flex、bison工具描述语言文法

5. 开发程序将机器人语言翻译成目标代码(此处开发工作量比较大)

6. 开发虚拟机

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享