快捷搜索:  汽车  科技

lua语言应用领域(Lua语言在机器人领域的应用入门)

lua语言应用领域(Lua语言在机器人领域的应用入门)编辑器:推荐Sublime(内建对lua的支持,直接可以build运行)运行环境:二进制安装包“Lua for Windows”谁在使用LuaLua的特点Getting Started

lua语言应用领域(Lua语言在机器人领域的应用入门)(1)

Lua 是一种强大、高效、轻量、可嵌入的类C脚本语言,支持过程式编程、面向对象式编程、函数式编程和数据描述。

print("Hello" .. " World!")

Lua的读音卢阿(LOO-ah),在葡萄牙语里是月亮的意思

Lua的官方网站:https://www.lua.org/

Lua的入门教程:

  • https://www.lua.org/pil/contents.html
  • https://www.w3cschool.cn/lua/

谁在使用Lua

  • Adobe Photoshop
  • 游戏产业首选的脚本语言:魔兽世界、大话西游
  • 绝大多数手游都用Lua写游戏逻辑,方便做安装后的热更新

Lua的特点

  • 快速,其他语言谈论起执行效率时,通常会说“和Lua一样快”
  • 可移植性(标准C实现),可以运行在Windows,Linux,移动设备和其他嵌入式设备(甚至乐高的MindStorms)
  • 可嵌入性,可以作为一种动态特性嵌入到其他语言中,如C、C 、Java、C#、SmallTalk,甚至其他脚本语言如Perl,Ruby。
  • 简单的强大性,Lua不是原生的面向对象语言,但可以通过元编程支持面向对象。
  • 短小精湛,压缩后大小为350k,一首编码率为128kbps的mp3大小接近4M。

Getting Started

运行环境:二进制安装包“Lua for Windows”

编辑器:推荐Sublime(内建对lua的支持,直接可以build运行)

交互式编程

> Lua -i > Print("Hello World!")

脚本式编程,新建一个后缀名为.lua的文件,如hello.lua,内容如下

print("Hello World!")

通过在console中输入lua hello.lua来运行该lua程序(确保console当前目录与lua文件在同一个目录下)

变量

全局变量

name = "Elon Musk"

局部变量

local name = "Musk" -- 局部变量只在作用域(程序块)中起作用,典型的程序块,如下 -- 1. 函数 function sum(a b) -- 函数开始即块开始 local s = a b return s -- 函数结束即块结束 end -- 2. 代码块 if spring_is_comming then -- 块开始 local rocket_is_ready = true if rocket_is_ready then --launch_it() end -- 块结束 end -- 3. 文件 -- 文件开始即块开始 local filename = "hello.lua" -- 文件结束即块结束

数据类型

-- nil 未初始化的变量的默认值为nil,即为空 print(bezos) -- number local price = 1.2 print(type(price)) -- boolean true or false local today_is_weekend = false print(type(today_is_weekend)) -- string bezos = "Boss of Blue Origin" print(type(bezos)) -- table values = {1 4 9 16} for i=1 #values do print(values[i]) end pos = {x=1 y=2 z=3} print(type(pos)) print(pos.x pos.y pos.z) -- function function do_something() step_1() step_2() step_3() ... end -- userdata -- 自定义数据类型,如系统中的JointTarget、RobTarget、ToolData等

赋值

-- SpaceX 2022年发射任务 launch_times = 36 target_of_IM_1 = "MOON" launch_tasks = {"IM-1" "TRANSPORTER-3" "猎鹰重型USSF-44"} im_1 = { name = "IM-1" date = "2022-1-30", load = "Moon Detector from Intuitive Machines" }

循环

local sum = 0 -- for for i=1 10 1 do sum = sum i end print(sum) -- while sum = 0 local i = 0 while i <= 10 do sum = sum i i = i 1 end print(sum) -- while break sum = 0 i = 0 while true do if i > 10 then break end sum = sum i i = i 1 end

条件判断

if is_sunny then -- launch else -- cancel the launch task end if wind_force == 7 then -- do something elseif wind_force == 8 then -- do something elseif wind_force == 9 then -- do something else -- cancel end

函数

函数是完成特定任务或功能的语句组合。可以通过名字加小括号的方式来调用指定函数。

function launch(rocket) local ret = test() if not ret then return false end add_fuel() load_detector() return ignite() end

运算符

操作符

描述

加法

-

减法

*

乘法

/

除法

%

取余

^

幂运算

-

负号

库函数

Lua提供很多库函数,如string、os 、math、table

string

print(string.upper("Hello")) print(string.lower("Hello")) print(string.reverse("Hello")) print(string.len("Hello")) -- format print(string.format("The result is: %d\n" 3)) -- find -- 使用正则表达式进行数据提取 {{x y z} {q1 q2 q3 q4}} local str = "{{1.1 1.2 1.3} {1 0 0 0}}" local _ _ x y z q1 q2 q3 q4 = string.find(str "{{([ -.%d] ) ([ -.%d] ) ([ -.%d] )} {([ -.%d] ) ([ -.%d] ) ([ -.%d] ) ([ -.%d] )}}") if x == nil then return end print(x y z q1 q2 q3 q4)

其他库函数请在需要使用时自行搜索

机器人编程

主要关注以下三个方面

  • 程序架构
  • 数据类型
  • 指令

程序架构

程序类型

描述

前台程序

即主程序,当前在程序编辑界面打开的程序。不考虑工位预约功能

后台程序

系统启动后在后台运行,不依赖于前台程序,为了安全考虑后台程序不支持运动指令。

举例说明

  1. 有一项目使用点激光(测距)来进行边缘检测,目前系统提供的SearchL函数只接收DI信号输入,如何把距离转化为DI信号?

坐标系

lua语言应用领域(Lua语言在机器人领域的应用入门)(2)

数据类型

数据类型

描述

JointTarget

关节位置数据,记录机器人各个关节的角度信息,单位为角度

RobTarget

空间位置,记录机器人空间目标位置信息

ToolData

工具数据,用于描述工具特征的数据,包括mounting 位置

WobjData

工件数据,用于描述工件坐标系,包括用户坐标系和物体坐标系

LoadData

负载数据,用于描述附加到机械臂法兰的负载信息,如质量,质心位置,惯量

SpeedData

速度数据,包括直线速度,旋转速度,外轴直线速度和外轴旋转速度

ZoneData

区域数据,用于指定转弯半径

指令

MoveL([motGroup/mecName] toPoint speed zone tool wobj [load])

其中括号包括的参数是可以省略不写的,如:

MoveL(toPoint speed zone tool wobj) 是没有毛病的。

现阶段的机器人程序都是死的,不会进行联想。使用指令前,先看清函数定义,它需要什么类型的参数,就给它什么类型的参数,不要自己想当然。

函数执行与机器人运动执行

脚本程序在执行时,是一条语句接着一条语句执行;机器人运动时,也是一个运动接着一个运动执行,在一个运动还没执行完之前不会去执行下一个运动。像MoveL这种运动指令存在一种情况,就是函数执行完了,运动还没有执行完。这就会导致MoveL之后的SetDO输出时间提前了。如果要等运动执行完再输出DO,需要在SetDO前加入

while GetDO("SYS_SERVO_BUSY") ~= 0 do check_stop() Sleep(10) end

以上

猜您喜欢: