• VREP中使用其它Lua库


       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	2
    3	4" )
        -- vector
        mtx = matrix {1,2,3}
        assert( tostring(mtx) == "1
    2
    3" )
        -- matrix with size 2x2
        mtx = matrix (2,2)
        assert( tostring(mtx) == "0	0
    0	0" )
        -- matrix with size 2x2 and default value 1/3
        mtx = matrix (2,2,1/3)
        assert( tostring(mtx) == "0.33333333333333	0.33333333333333
    0.33333333333333	0.33333333333333" )
        -- identity matrix with size 2x2
        mtx = matrix (2,"I")
        assert( tostring(mtx) == "1	0
    0	1" )
    
        -- 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("这是一个公有函数!
    ")
    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 错误处理

  • 相关阅读:
    js学习总结----js中的三个判断
    js学习总结----js中的变量和数据类型
    js学习总结---js组成和命名规范
    ES6-----学习系列十八(模块化)
    ES6-----学习系列十七(Decorator)
    ES6-----学习系列十六(Generator)
    迭代器和for-of循环 顺便带一下Es5中的.map遍历
    Pc端css初始化
    css3常用属性
    css布局一屏幕的自适应高度
  • 原文地址:https://www.cnblogs.com/21207-iHome/p/7363088.html
Copyright © 2020-2023  润新知