• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

VREP中使用其它Lua库

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

   VREP中的Regular API中有一些矩阵操作的函数,不过有时候还是不能满足计算需求,这时就需要在VREP中使用其它科学计算库(或者用Python/MATLAB之类的外部程序控制)。

  在这里下载Lua Matrix,它是一个用纯Lua编写的矩阵运算库。解压后将lua文件夹中的matrix.lua和complex.lua复制到VREP安装目录下的lua文件夹中:

  下面是一个简单的测试,对矩阵进行一系列运算并验证。点击VREP仿真按钮,没有出现错误。

if (sim_call_type==sim_childscriptcall_initialization) then

    local matrix = require "matrix"

    local mtx, m1,m2,m3,m4,m5, ms,ms1,ms2,ms3,ms4
    -- normal matrix
    mtx = matrix {{1,2},{3,4}}
    assert( tostring(mtx) == "1\t2\n3\t4" )
    -- vector
    mtx = matrix {1,2,3}
    assert( tostring(mtx) == "1\n2\n3" )
    -- matrix with size 2x2
    mtx = matrix (2,2)
    assert( tostring(mtx) == "0\t0\n0\t0" )
    -- matrix with size 2x2 and default value 1/3
    mtx = matrix (2,2,1/3)
    assert( tostring(mtx) == "0.33333333333333\t0.33333333333333\n0.33333333333333\t0.33333333333333" )
    -- identity matrix with size 2x2
    mtx = matrix (2,"I")
    assert( tostring(mtx) == "1\t0\n0\t1" )

    -- matrix.add; number
    m1 = matrix{{8,4,1},{6,8,3}}
    m2 = matrix{{-8,1,3},{5,2,1}}
    assert(m1 + m2 == matrix{{0,5,4},{11,10,4}}, "error")

    -- matrix.sub; number
    m1 = matrix{{8,4,1},{6,8,3}}
    m2 = matrix{{-8,1,3},{5,2,1}}
    assert(m1 - m2 == matrix{{16,3,-2},{1,6,2}})

    -- matrix.mul; number
    m1 = matrix{{8,4,1},{6,8,3}}
    m2 = matrix{{3,1},{2,5},{7,4}}
    assert(m1 * m2 == matrix{{39,32},{55,58}})

    -- matrix.div; number
    m1 = matrix {{1,2},{3,4}}
    m2 = matrix {{4,5},{6,7}}
    assert( m1*m2^-1 == m1/m2 )

    -- matrix.divnum; number, same complex
    m2 = matrix {{4,5},{6,7}}
    assert( m2/2 == matrix{{2,2.5},{3,3.5}} )
    mtx = matrix {{3,5,1},{2,4,5},{1,2,2}}
    assert( 2 / mtx == matrix{{4,16,-42},{-2,-10,26},{0,2,-4}} )

    -- matrix.det; number
    mtx = matrix {{1,4,3,2},{2,1,-1,-1},{-3,2,2,-2},{-1,-5,-4,1}}
    assert( mtx:det() == 78 )

    -- matrix.invert; number
    mtx = matrix{{3,5,1},{2,4,5},{1,2,2}}
    local mtxinv = matrix{{2,8,-21},{-1,-5,13},{0,1,-2}}
    assert( mtx^-1 == mtxinv )

    -- matrix.transpose
    mtx = matrix{{3,5,1},{2,4,5},{1,2,2}}
    assert(mtx^'T' == matrix{{3,2,1},{5,4,2},{1,5,2}})
end



if (sim_call_type==sim_childscriptcall_actuation) then

end


if (sim_call_type==sim_childscriptcall_sensing) then

end


if (sim_call_type==sim_childscriptcall_cleanup) then

end

 

Lua 模块与包

模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。

上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.

 

require 函数

Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:

require("<模块名>")

或者

require "<模块名>"

执行 require 后会返回一个由模块常量或函数组成的 table,并且还会定义一个包含该 table 的全局变量。

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

以上代码执行结果为:

这是一个常量
这是一个私有函数!

或者给加载的模块定义一个别名变量,方便调用

-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

以上代码执行结果为:

这是一个常量
这是一个私有函数!

 

 

 

参考:

Lua 模块与包

How to use other Lua library

matrix inversion and multiplication

Lua Libraries And Bindings

Lua Matrix

Lua 错误处理


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua 脚本注释 自动化去除发布时间:2022-07-22
下一篇:
Cocos2d-x Lua Node与Node层级架构发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap