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 架构
- 常规API
- 远程API
- ROS接口
- BlueZero接口
- 辅助API
- 其他接口
二、远程控制
V-REP内部脚本只支持Lua语言,而远程API支持C/C++、Python、Java、Matlab/Octave以及Lua等多种语言。
1. 远程连接
- 实现远程连接,需要动态库remoteApi.so文件,将其存放于V-REP软件的根目录。
- 查看remoteApiConnections.txt文件,获取其远程连接默认端口号。
- 以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表示
随机位置,生成随机形状的物体。
可以利用随机数,控制物体的位置。
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
V-REP中有两个ttm文件
另外仿真场景中,还有加速选项。
(cdots cdots)
未完待续
参考资源
冬木远景
User Manual
V-REP Forum
GitHub