• V-REP


    vrep文档


    一、V-REP编程

    1. 编程方式

    V-REP支持六种编程方式。
    嵌入式脚本、add on、ros node、bluezuro node、plugin、remote api等。

    1. 嵌入式脚本

    嵌入式脚本包括一个main脚本,多个子脚本。
    子脚本包括线程和非线程脚本。
    主脚本包含以下几个函数。
    init、actuation、sensing、cleanup

    注意
    尽量不要修改子脚本,主脚本一旦打开,便改变为自定义脚本,不再能够自动更新。

    V-REP内部脚本只支持Lua语言。
    主脚本结构

    function sysCall_init()         // 初始化
    function sysCall_actuation()    // 执行器
    function sysCall_sensing()      // 传感器
    function sysCall_cleanup()      // 清除
    

    2. API 架构

    1. 常规API
    2. 远程API
    3. ROS接口
    4. BlueZero接口
    5. 辅助API
    6. 其他接口

    二、远程控制

    V-REP内部脚本只支持Lua语言,而远程API支持C/C++、Python、Java、Matlab/Octave以及Lua等多种语言。

    1. 远程连接

    1. 实现远程连接,需要动态库remoteApi.so文件,将其存放于V-REP软件的根目录。
    2. 查看remoteApiConnections.txt文件,获取其远程连接默认端口号。
    3. 以Python语言为例,测试远程连接。
    clientID=vrep.simxStart('127.0.0.1',19999,True,True,5000,5) # Connect to V-REP
    vrep.simxGetPingTime(clientID)
    vrep.simxFinish(clientID)   # Close
    

    众多远程连接示例保存在programming文件夹下。

    2. 远程API

    V-REP提供了众多远程API与常规API相对应,以便外部使用V-REP的各种功能。
    远程API通过套接字或者共享内存等方式与V-REP通信。

    远程API有两个独立的实体,通过套接字进行交互。
    比如导入场景、添加模型、启动仿真等。

    vrep.simxLoadScene()    
    vrep.simxGetObjectHandle()
    

    另外,还可以直接调用常规API实现远程调用。

    simxCallScriptFunction()
    

    该API支持直接使用内部常规API,在制定object handle和client ID的前提下,实现远程控制。
    函数调用类型有

    • 阻塞调用 simx_opmode_blocking
      在调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
    • 非阻塞调用 sim_opmode_oneshot
      在不能立刻得到结果之前,该函数不会阻塞当前线程,而回立刻返回。
      该调用不适合于不需要服务端应答的场合。
    • 数据流模式 simx_opmode_streaming simx_opmode_buffer
      等类型

    三、物体相关

    V-REP的仿真涉及众多数量、众多类型的模型。V-REP提供了Shape、八叉树,以及点云等多种类型。
    可以直接在图形界面中添加生成,也可以通过Lua脚本调用常规API,以及外部脚本调用远程API添加生成。

    1. 句柄

    V-REP场景中的每个物体都有句柄,无论是可见还是不可见的物体,以至于其他动作比如碰撞等,皆有句柄。
    每个生成或者检测物体或动作的API皆可返回对应的句柄。
    比如

    sim.getObjectHandle()
    sim.getCollisionHandle()
    

    另外还可以通过物体相对应的脚本返回自身的句柄

    sim.getObjectAssociatedWithScript(sim.handle_self)
    

    该API返回所在子脚本对应的物体的句柄。

    2. 物体生成

    在V-REP场景中添加物体可以直接右键添加,
    或者通过API比如sim.createPureShape()等。

    进一步可以通过sim.setObjectPosition()或``sim.设置其位置。
    达到对模型的充分设置。

    sim.createPureShape(0,43,{0.1,0.1,0.1},0.1,nil)
    

    关于shape的属性,43表示
    object

    随机位置,生成随机形状的物体。
    可以利用随机数,控制物体的位置。

    math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))
    print(math.random())
    

    另外物体的位置设置,应该选用相对位置,否则会出现新产生的物体被挤出去的现象。

    sim.setObjectPosition()
    

    即物体的相关物体的句柄不应是-1。

    2. 模型导入

    V-REP可以将现有的外部模型导入,支持URDF、点云等多种类型。
    可以直接将ttm文件导入至V-REP。

    V-REP的点云导入方式为,建立一个初始点云,然后逐渐向点云中添加点。

    点云导入

    导入机器人,以ER7为例
    导入机器人时,机器人无法保持正常的状态,会发生抖动或者散架的情况。

    dummy是为了运动学反解而准备的,需要成对出现

    3. 碰撞检测

    V-REP可以检测两个碰撞实体,碰撞过程中可以注册碰撞对象,既可以检测具体的两个物体之间的碰撞,也可以检测一个物体与其他所有物体之间产生的碰撞。碰撞对象之间的碰撞状态可以由不同的颜色可视化显示,也可以通过Graph与数据流对其进行记录。

    另外,对于一个复杂的模型,其内部由多个子结构构成,注册碰撞对象时,会在其内部检测到碰撞,需要将整个复杂结构体注册为一个Group,忽略其内部碰撞,以免影响正常的仿真验证。

    4. 物体抓取

    物体抓取有两种方式,一种是仿真实际的抓取过程,但是涉及众多物理参数的调节,较为复杂;另外还有伪抓取的方式,可以建立一个Link,实现有效地抓取。
    关于实际仿真抓取,其反应如同真实场景。

    关于伪抓取,通过建立连接,可以保证抓取稳定。

    sim.setObjectParent(attachedShape,connector,true)   # 建立连接
    sim.setObjectParent(attachedShape,-1,true)  # 断开连接
    

    四、视觉相关

    视觉传感器和相机都可以显示场景中的图像,但是一般用于不同的用途,一个侧重于视觉检测和处理,一个侧重于场景显示。

    1. 相机

    可以在场景中添加多个相机,并实现多个视角的切换。
    相机

    2. 视觉传感器

    视觉传感器有正交投影和透视投影两种类型。
    传感
    视觉传感器有*端切*面和远端切*面。
    使用剪切*面可以排除场景众多一些几何体,只查看或渲染场景中的某些部分。
    比*端切*面*和比远端切*面远的对象是不可见的。远*端切*面可以在属性对话框中加以设置。
    透视模式下的视场角等属性也可以设置。
    视觉传感器可以选择性的忽略RGB信息和深度信息以及其他信息以提高速度。
    视觉传感器的Z轴沿着视线方向,Y轴代表上方,X轴指向左侧。
    视觉传感器还可以通过设置滤波器进行进一步设置。

    视觉传感器获得的深度值是归一化的数值,并非真正的数值,需要根据远*端切*面的位置进一步运算得出真实的深度值。

    获取深度值以及RGB值

    sim.getVisionSensorDepthBuffer()
    sim.getVisionSensorImage()
    

    五、ROS接口

    v-REP与ROS的连接有三种接口,包括ROS Interface、ROS Plugin和诸如ROS Bridge等其他接口。

    1. ROS Interface

    ROS Interface为V-REP官方支持的连接方式。
    RosInterface以高保真度复制C/C++ ROS API。
    该功能通过libv_repRosInterface.so插件启用。
    在V-REP的脚本中,以simROS为前缀的API为RosInterface支持的API。

    通过RosInterface,V-REP可以充当ROS节点,其他节点通过ROS服务,ROS发布者和订阅者进行通信。

    pub=simROS.advertise('/image', 'sensor_msgs/Image')
    simROS.publisherTreatUInt8ArrayAsString(pub) -- treat uint8 arrays as strings (much faster, tables/arrays are kind of slow in Lua)
    sub=simROS.subscribe('/image', 'sensor_msgs/Image', 'imageMessage_callback')
    simROS.subscriberTreatUInt8ArrayAsString(sub) -- treat uint8 arrays as strings (much faster, tables/arrays are kind of slow in Lua)
    

    操作于ROS类似。

    2. ROS Plugin

    主要包括三部分

    v_repStart()
    v_repEnd()
    v_repMessage()
    

    关于libv_reoRosControl,
    由vrep_ros_control_example,依赖于
    vrep_commom、
    vrep_plugin_skeleton、
    vrep_skeleton_msg_and_srv编译生成。

    但是插件仅支持单机器人。

    可以自己制作ROS的相关插件,实现ROS

    3. 其他接口

    V-REP还支持通过ROS Bridge等接口实现。

    ROS Bridge

    六、性能优化

    1. headless模式

    V-REP支持headless模式启动,在headless模式下启动,可以省去图形界面消耗的资源,提高运行速度。

    ./vrep.sh -h -s5000 -q myScene.ttt
    

    经过实验,headless模式可以将启动速度提升*十倍。

    2. ghost

    ghost

    ghost

    V-REP中有两个ttm文件

    另外仿真场景中,还有加速选项。

    (cdots cdots)
    未完待续

    参考资源
    冬木远景
    User Manual
    V-REP Forum
    GitHub

  • 相关阅读:
    汇编学习笔记(25)
    在QT C++中调用 Python并将软件打包发布(裸机可运行)
    集合类
    解决python matplotlib 中文字体的显示乱码-Windows系统;RuntimeWarning: Glyph
    元数据库设计
    解决方案sln工程csproj
    托管代码和非托管代码的区别
    IIS安装和使用URL重写工具-URL Rewrite
    SSL证书及使用
    rpc和rpcwithcert两个虚拟目录
  • 原文地址:https://www.cnblogs.com/jonty/p/9798405.html
Copyright © 2020-2023  润新知