网站首页 > 基础教程 正文
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)
其他库函数请在需要使用时自行搜索
机器人编程
主要关注以下三个方面
- 程序架构
- 数据类型
- 指令
程序架构
程序类型 | 描述 |
前台程序 | 即主程序,当前在程序编辑界面打开的程序。不考虑工位预约功能 |
后台程序 | 系统启动后在后台运行,不依赖于前台程序,为了安全考虑后台程序不支持运动指令。 |
举例说明
- 有一项目使用点激光(测距)来进行边缘检测,目前系统提供的SearchL函数只接收DI信号输入,如何把距离转化为DI信号?
坐标系
数据类型
数据类型 | 描述 |
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
以上
猜你喜欢
- 2024-10-23 按键精灵自动寻路系列换算地图坐标寻路法
- 2024-10-23 [Redis],Lua分步式限流方案,限流分几步?
- 2024-10-23 基于FEKO软件的目标RCS计算及数据分析
- 2024-10-23 [按键精灵]会员时间相关计算/转换的代码讲解
- 2024-10-23 lua math.deg使用 lua的match
- 2024-10-23 梯度下降方法与求导 梯度下降求导过程
- 2024-10-23 redisson实现分布式锁原理 redisson分布式锁问题
- 2024-10-23 万字长文:从源码学习GopherLua与工程实践
- 2024-10-23 LUA入门简易小应用 lua用什么软件编程
- 2024-10-23 lua math.asin使用 lua assert函数
- 05-14CSS基础知识(一) CSS入门
- 05-14CSS是什么? CSS和HTML有什么关系?
- 05-14什么是CSS3?
- 05-14CSS如何画一个三角形?
- 05-14初识CSS——CSS三角制作
- 05-14Wordpress建站教程:给图片添加CSS样式
- 05-14HTML和HTML5,css和css3的区别有哪些?
- 05-14Html中Css样式Ⅱ
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)