V-REP教程(二)Script

1.两幅图(暂时看不懂不必在意)
这里写图片描述
支持的语言和特性吗,lua,c++,matlab常用
这里写图片描述
消息传递机制
2.Embedded scripts(嵌入式脚本)主要用的脚本
V-REP是一个高度可定制的模拟器:几乎每一步的模拟都是用户定义的。。脚本语言是用Lua(另外介绍)。
嵌入式脚本是嵌入在场景(或模型)中的脚本,是场景的一部分,将被保存并与场景(或模型)一起加载。
Simulation scripts:仿真脚本仅在仿真过程中执行,用于定制仿真或仿真模型
main script:每个场景中都有一个主脚本,用于调用其他脚本。更改主脚本最好在子脚本中完成。可以理解成主函数。
这里写图片描述
child scripts:处理具体的仿真步骤,操控场景中物体。
这里写图片描述
The contact callback script: 这个脚本一般不用,它是用来处理动力学环境下两物体的碰撞反应。
Joint control callback scripts:关节动力学控制用
这里写图片描述
复制和粘贴操作objects,子脚本和联合控制回调脚本也将被复制。
主脚本:非必要不修改
三个部分,the initialization part:仿真开始时执行,用于准备仿真。
the regular part在每个仿真中多次调用,用于处理子脚本,the restoration part仿真结束时恢复初始状态(包括传感器,物体位置)

Child scripts

在vrep里面子脚本不限数量,必须绑定到物体上。把main脚本理解成main函数,子脚本理解成供main调用的普通函数。
Very easy synchronization with the simulation loop:可以非常简单的和仿真循环同步。
2.1Non-threaded child scripts 单线程脚本/非线程脚本
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。
这里写图片描述
单线程脚本每次调用必须return control,否则仿真会停顿。
单线程子脚本的执行顺序从根到叶(如下图从link0—joint1—link1……):
这里写图片描述
初始化(Initialization):初始化这个语句只执行一次,也是在仿真开始的时候执行,主要完成变量初始值的初始化,获取你需要的实体的handle。
执行(Actuation):“执行”相当于在提交到动力学引擎计算之前进行的操作,比如你这里设置了关节的转速,然后动力学引擎就驱动这个关节按照这个转速运动,直到下次再执行到此部分。
感知(Sensing):控制里最重要的一块内容,也是我认为控制系统设计的核心。一切控制算法都是基于反馈来做的,大家做机器人控制一定要注意有些值很难测量或者误差特别大(电机电流,受摩擦影响大),有些值可以精准测量并且误差小(关节角度)。这一部分的执行顺序是位于Actuation之后
清理(cleanup):这个部分只会在仿真结束时被执行一次,可以理解成c++里面的析构。
自动门的仿真模型:前部和后部的接近传感器允许检测接近的人。当人够近的时候,门会自动打开

if (sim_call_type==sim_childscriptcall_initialization) then
    sensorHandleFront=simGetObjectHandle("DoorSensorFront")
    sensorHandleBack=simGetObjectHandle("DoorSensorBack")
    motorHandle=simGetObjectHandle("DoorMotor")
end//初始化

if (sim_call_type==sim_childscriptcall_actuation) then
    resF=simReadProximitySensor(sensorHandleFront) 
    resB=simReadProximitySensor(sensorHandleBack)
    if ((resF>0)or(resB>0)) then
        simSetJointTargetVelocity(motorHandle,-0.2)
    else
        simSetJointTargetVelocity(motorHandle,0.2)
    end
end//执行

if (sim_call_type==sim_childscriptcall_sensing) then

end//感知

if (sim_call_type==sim_childscriptcall_cleanup) then
    -- Put some restoration code here
end//恢复

2.2 Threaded child scripts 多线程脚本
线程级子脚本的启动是通过默认的主脚本代码,通过SimRunCuthStudioDaScript脚本函数以级联方式处理的。当线程子脚本的执行仍在进行时,不可以再次启动。当线程子脚本结束时,只有在脚本属性中的执行一次项未选中时才可以重新启动。
同样是自动门:

threadFunction=function()
    while simGetSimulationState()~=sim_simulation_advancing_abouttostop do
        resF=simReadProximitySensor(sensorHandleFront)
        resB=simReadProximitySensor(sensorHandleBack)
        if ((resF>0)or(resB>0)) then
            simSetJointTargetVelocity(motorHandle,-0.2)
        else
            simSetJointTargetVelocity(motorHandle,0.2)
        end
        -- 这个循环浪费了很多时间,每次仿真时间改变都要重新读取值
    end
end

-- Put some initialization code here:
sensorHandleFront=simGetObjectHandle("DoorSensorFront")
sensorHandleBack=simGetObjectHandle("DoorSensorBack")
motorHandle=simGetObjectHandle("DoorMotor")

-- Here we execute the regular thread code:
res,err=pcall(threadFunction)
if not res then
    simAddStatusbarMessage('Lua runtime error: '..err)
end//下有解释

-- Put some clean-up code here:

和单线程的区别是正则部分:regular part部分可以在一个循环中执行。
res,err=pcall(threadFunction) 调用在头部编写的函数,回路中的代码负责处理仿真的特定部分(例如处理自动滑动门)。在上述具体示例中,它浪费计算时间,并且与主仿真回路异步运行。
注意:默认情况下,一个线程在自动切换到另一个线程之前,线程子脚本将执行约1-2毫秒。 simSetThreadSwitchTiming函数用于修改这个时间。
simSwitchThread():

threadFunction=function()
    while simGetSimulationState()~=sim_simulation_advancing_abouttostop do
        resF=simReadProximitySensor(sensorHandleFront)
        resB=simReadProximitySensor(sensorHandleBack)
        if ((resF>0)or(resB>0)) then
            simSetJointTargetVelocity(motorHandle,-0.2)
        else
            simSetJointTargetVelocity(motorHandle,0.2)
        end
        simSwitchThread() -- 切换到另一个线程
        -- 这个方式可以不浪费时间还保持同步。
    end
end

某些操作不可以被中断(想象在一个循环中移动多个对象)。在这种情况下,用simSetThreadAutomaticSwitch 函数禁止切换线程。
3.脚本仿真参数:
这里写图片描述
如上图:用于快速调节参数,机器人最大速度,机器人加速度。
如果用户修改参数列表中的值,脚本根据修改做出反应。脚本可以使用 simGetScriptSimulationParameter函数检索参数的值,或者 simSetScriptSimulationParameter函数来修改参数的值。脚本模拟参数也可以用于特定的脚本间消息传递目的。
Parameter is private:参数私有,也就是在仿真期间不能被显示和修改;
Parameter is persistent:参数持久,结束仿真不会恢复成初始值,比如让机械臂的关节保持仿真结束时的位姿。
4.Contact callback script 一般不用
当启用时,物理引擎检测到两个可响应的形状之间的碰撞,然后将以适当的参数调用回调脚本,允许用户自定义碰撞处理。
Joint control callback scripts
控制电机,一般会被频繁调用。
这里写图片描述
Customization scripts:
添加在场景中的物体后面,尽量不要用这个,最好是用child scripts。
General callback script
具体看代码,lua另写一文

if sim_callback_id==sim_callbackid_dynstep then
    -- This is called at the beginning or end of
    -- an individual dynamics simulation step (by
    -- default, there are 10 times more dynamics
    -- simulation steps as simulation steps)
    if sim_callback_tag==0 then
        -- at the beginning of a dynamics step
    end

    if sim_callback_tag==1 then
        -- at the end of a dynamics step
    end

    return 0
end

if sim_callback_id==sim_callbackid_userdefined+42 then
    -- This is a user defined callback. User defined
    -- callbacks start at ID sim_callbackid_userdefined upwards.

    return 1
end

脚本对话框的注意点:
Execute just once:此项仅适用于带线程的子脚本。当这个条目不被选中时,一个结束的线程将被主脚本重启。
Execution order:设置执行优先级,normal,last,first。
5.脚本编辑
脚本编辑器有以下特点:
auto-completion自动补充
call tips通话提示
syntax highlighting语法高亮显示
Highlighting of all occurrences of selected word强调所选单词的所有出现
source folding/unfolding源折叠/展开
simple word search 通过ctrl +f键进行简单的单词搜索
no need for explicit saving 不需要显式储蓄,写完关闭,默认保存

require “myExternalLuaFile”//相当于#include <**>;
另外,不同脚本关系如下
这里写图片描述

猜你喜欢

转载自blog.csdn.net/danieldingshengli/article/details/80547400
今日推荐