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