VREP学习笔记(五):例程脚本学习

就算看了Lua参考手册,直接上手开始在V-REP上进行编程完成仿真实验还是有些吃力,更关键的是V-REP的资料是真的少,这时候官方给的例程就至关重要了。

1.bubbleRob

打开脚本可以看到分为标准的初始化部分,执行部分和结束部分。首先是初始化部分

    bubbleRobBase=sim.getObjectAssociatedWithScript(sim.handle_self) -- this is bubbleRob's handle
    leftMotor=sim.getObjectHandle("bubbleRob_leftMotor") -- Handle of the left motor
    rightMotor=sim.getObjectHandle("bubbleRob_rightMotor") -- Handle of the right motor
    noseSensor=sim.getObjectHandle("bubbleRob_sensingNose") -- Handle of the proximity sensor

初始化,创建四个句柄,sim.getObjectAssociatedWithScript获得的是同当前脚本相关联的句柄,,其他三个是获得后面对应名称的句柄。

接下来是创建一个UI,

    xml = '<ui title="'..sim.getObjectName(bubbleRobBase)..' speed" closeable="false" resizeable="false" activate="false">'..[[
                <hslider minimum="0" maximum="100" on-change="speedChange_callback" id="1"/>
            <label text="" style="* {margin-left: 300px;}"/>
        </ui>
        ]]
    ui=simUI.create(xml)

title对应UI的标题,这里使用了一个连接符,先获取bubbleRobBase对应的句柄名再连接上speed。后面三个属性依次使能是否可隐藏,可调整大小,最后一个不知道用来设置什么的触发,搞懂了再补上。hslider代表滑块,最大值最小值也很好理解,label text就是滑块的名字,比如加个speed

除了滑块,还有一些其他的,比如spinbox,button等,改成spinbox就变成如下

但这些都不关键,关键的是后面这个回调函数。

function speedChange_callback(ui,id,newVal)
    speed=minMaxSpeed[1]+(minMaxSpeed[2]-minMaxSpeed[1])*newVal/100
end

这个回调函数很简单,就是将滑块的值做一个归一化后赋给speed,熟悉C的话可能会有些奇怪,这里没有返回值也没有声明全局变量,怎么就能改变全局的speed呢?这是因为Lua默认的变量都是全局变量,除非显式local声明为局部变量。最后只剩下怎么让车子动起来了,通过设置左右关节的速度即可。

        sim.setJointTargetVelocity(leftMotor,speed)
        sim.setJointTargetVelocity(rightMotor,speed)

2.lineFollowingBubbleRob

看名字就知道,这是一个加强版的BubbleRob,前面都是一样的,不一样的地方在于多了个巡线部分。巡线是怎么实现的呢?

通过三个视觉传感器来判断地面的黑线

    -- read the line detection sensors:
    sensorReading={false,false,false}
    for i=1,3,1 do
        result,data=sim.readVisionSensor(floorSensorHandles[i])
        if (result>=0) then
            sensorReading[i]=(data[11]<0.3) -- data[11] is the average of intensity of the image
        end
    end
    

我们在(二)中有提到,data[11]代表传感器所捕捉图像的灰度平均值,设立一个阈值为0.3,大于这个值则视为捕捉到黑线。

    if sensorReading[1] then
        leftV=0.03*speed
    end
    if sensorReading[3] then
        rightV=0.03*speed
    end

如果左边捕捉到黑线,则向右旋转,右边捕捉到黑线,则向左旋转。

3.Quadricopter

自带的四旋翼脚本的动力学模型参数没有备注一时半会儿我也没搞清楚,按照自己的理解将四旋翼控制的逻辑记录下来。首先看一下四旋翼的架构

可以看到一共有五个脚本,重点关注第一个即可,因为底下四个是对每个电机具体的控制,飞控参数接口都在第一个。

    -- Detatch the manipulation sphere:
    targetObj=sim.getObjectHandle('Quadricopter_target')
    sim.setObjectParent(targetObj,-1,true)

    d=sim.getObjectHandle('Quadricopter_base')

这里出现了两个句柄,一个是Quadricopter_target,一个是Quadricopter_base,在执行部分的控制垂直高度

    -- Vertical control:
    targetPos=sim.getObjectPosition(targetObj,-1)
    pos=sim.getObjectPosition(d,-1)
    l=sim.getVelocity(heli)
    e=(targetPos[3]-pos[3])

从这里我们可以看出四旋翼飞行的逻辑,target为目标位置,base固结在四旋翼上,通过获取二者的差值进行控制。

搞明白这个逻辑,就可以做一个简单的实验了,将目标位置设为圆周运动

    t=sim.getSimulationTime();
    sim.setObjectPosition(targetObj,-1,{math.cos(t*math.pi/2),math.sin(t*math.pi/2),1})

开始仿真就可以看见四旋翼追着目标飞了!

猜你喜欢

转载自blog.csdn.net/banzhuan133/article/details/86237661