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

原文地址:https://www.cnblogs.com/jonty/p/9798405.html