導語
今天小編給大家帶來一個來源于李飛飛大佬團隊的3D仿真環境iGibson,iGibson通過Python就能呼叫,在ROS中可直接觀察,阿chai推薦做機器人、3D以及模型構建的小伙伴可以嘗試,iGibson中的物理引擎是真的很強,


想領取完整原始碼跟Python學習資料可點擊這行字體
我們先看一段有關iGibson的介紹,
iGibson是一個仿真環境,可基于Bullet提供快速的視覺渲染和物理仿真,iGibson配備了15個完全互動式的高質量場景,從真實的房屋和辦公室重建的數百個大型3D場景,并與CubiCasa5K和3D-Front等資料集兼容,提供了8000多個附加的互動式場景,iGibson的一些功能包括域隨機化,與運動計劃器集成以及易于使用的工具來收集人類演示,借助這些場景和功能,iGibson允許研究人員訓練和評估使用視覺信號來解決導航和操縱任務(例如開門,撿起和放置物體或在櫥柜中搜索)的機器人代理,

環境搭建
系統要求如下:
-
Ubuntu 16.04
-
具有VRAM> 6.0GB的Nvidia GPU
-
Nvidia驅動程式> = 384
-
CUDA> = 9.0,CuDNN> = v7
-
CMake> = 2.8.12(可以安裝
pip install cmake)
1. pip安裝
可以使用pip將iGibson的模擬器安裝為python軟體包:
pip install gibson2 -i xxxx(鏡像網址)
#測驗
python -m gibson2.scripts.demo_static
iGibson支持自定義pybullet版本來加快物理速度,如果要加快速度,則在安裝后需要執行以下步驟:
# 卸載pybullet
pip uninstall pybullet
pip instal lhttps://github.com/StanfordVL/bullet3/archive/master.zip
2. Docker安裝
Docker版本至少為v19.0,并啟用本機GPU,接下來,使用iGibson回購中的腳本下載我們的預構建影像:
cd iGibson
./docker/pull-images.sh
將下載兩個影像:
-
igibson/igibson:latest:不支持GUI, -
igibson/igibson-gui:latest:支持VNC進行GUI和遠程桌面,
提供以從頭開始構建影像的腳本:
# 不帶GUI
cd iGibson/docker/base
./build.sh
# GUI和VNC:
cd iGibson/docker/headless-gui
./build.sh
3. 自己編譯原始碼
原始碼編譯需要Anaconda
# clone原始碼
git clone https://github.com/StanfordVL/iGibson --recursive
cd iGibson
# Python 3.6、3.7、3.8均可
conda create -n py3-igibson python=3.6 anaconda
source activate py3-igibson
# 在末尾添加-i xxxx(鏡像網站)
pip install -e .
iGibson支持自定義pybullet版本來加快物理速度,如果要加快速度,則在安裝后需要執行以下步驟:
# 卸載pybullet
pip uninstall pybullet
pip instal lhttps://github.com/StanfordVL/bullet3/archive/master.zip
資料下載、測驗
首先,配置iGibson(機器人代理,物件,3D環境等)存盤位置,它在your_installation_path/gibson2/global_config.yaml
存盤資料的默認位置是:
assets_path: your_installation_path/gibson2/data/assets
g_dataset_path: your_installation_path/gibson2/data/g_dataset
ig_dataset_path: your_installation_path/gibson2/data/ig_dataset
threedfront_dataset_path: your_installation_path/gibson2/data/threedfront_dataset
cubicasa_dataset_path: your_installation_path/gibson2/data/assetscubicasa_dataset
如果使用默認路徑,則無需執行任何操作,否則可以運行以下腳本:
python -m gibson2.utils.assets_utils --change_data_path
直接運行以下下載腳本:
# 或者直接從此處下載
python -m gibson2.utils.assets_utils --download_assets
需要從資料集中下載一些大型的3D重構現實世界環境(例如房屋和辦公室),并將路徑設定為your_installation_path/gibson2/global_config.yaml(默認和推薦:your_installation_path/gibson2/data/g_dataset和your_installation_path/gibson2/data/ig_dataset),通過填寫以下許可協議來訪問和下載Gibson和iGibson資料集,也可以下載一個小型環境進行演示,
要下載演示資料,請運行:
python -m gibson2.utils.assets_utils --download_demo_data
可以使用以下命令下載完整的Gibson和iGibson資料集,此腳本將自動下載,解壓縮資料集并將其放置到正確的位置,URL填寫協議表格后將獲取,
下載iGibson資料集:
python -m gibson2.utils.assets_utils --download_ig_dataset
下載Gibson資料集(需要獲得協議簽名URL)
python -m gibson2.utils.assets_utils --download_dataset URL
測驗是否正確安裝了gibson2,可以運行:
python
>>> import gibson2
>>>
通過運行測驗腳本測驗:
cd test
pytest --ignore disabled --ignore benchmark
terminal中將看到如下輸出:
=============================== test session starts ================================
platform linux -- Python 3.5.6, pytest-4.6.9, py-1.5.3, pluggy-0.13.1
rootdir: /cvgl2/u/chengshu/gibsonv2
plugins: openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 27 items
test_binding.py .. [ 7% ]
test_navigate_env.py .. [ 14% ]
test_object.py .... [ 29% ]
test_render.py ... [ 40% ]
test_robot.py .......... [ 77% ]
test_scene_importing.py .... [ 92% ]
test_simulator.py . [ 96% ]
test_viewer.py
物理引擎與渲染
1. 渲染器
iGibson中使用自己開發的MeshRenderer,它支持可自定義的相機配置和各種影像模式,并以超快的速度進行渲染,可以在的建構式中指定影像的寬度,高度和垂直視場以及呼叫以檢索影像,iGibson支持六種不同的影像模態:RGB,表面法線,分割,3D點云(z通道可以提取為深度圖),光流和場景流,我們還支持兩種型別的LiDAR傳感器:1光束和16光束(例如Velodyne VLP-16),大部分代碼可以在gibson2 / render中找到,class MeshRenderer``renderer.render(modes=('rgb', 'normal', 'seg', '3d', 'optical_flow', 'scene_flow'))
接下來使用幾行代碼渲染了一個iGibson場景:
import cv2
import sys
import os
import numpy as np
from gibson2.render.mesh_renderer.mesh_renderer_cpu import MeshRenderer
from gibson2.utils.assets_utils import get_scene_path
def main():
if len(sys.argv) > 1:
model_path = sys.argv[1]
else:
model_path = os.path.join(get_scene_path('Rs'), 'mesh_z_up.obj')
renderer = MeshRenderer(width=512, height=512)
renderer.load_object(model_path)
renderer.add_instance(0)
camera_pose = np.array([0, 0, 1.2])
view_direction = np.array([1, 0, 0])
renderer.set_camera(camera_pose, camera_pose + view_direction, [0, 0, 1])
renderer.set_fov(90)
frames = renderer.render(
modes=('rgb', 'normal', '3d'))
frames = cv2.cvtColor(np.concatenate(frames, axis=1), cv2.COLOR_RGB2BGR)
cv2.imshow('image', frames)
cv2.waitKey(0)
if __name__ == '__main__':
main()
渲染結果將如下所示:

可以使用PBR演示測驗基于物理的渲染器,渲染iG資料集中包含的任何物件,例如,此處顯示一個接收器,因為它包含不同的材質,需要構建檔案夾,因為它將加載該檔案夾中的所有物件,
cd examples/demo
python mesh_renderer_example_pbr.py <path to ig_dataset>/objects/sink/sink_1/shape/visual
效果如下:

同樣可以結合Pytorch,測驗例子如下(需要了解Pytorch):
import sys
import os
import numpy as np
from gibson2.render.mesh_renderer.mesh_renderer_tensor import MeshRendererG2G
from gibson2.render.profiler import Profiler
from gibson2.utils.assets_utils import get_scene_path
import matplotlib.pyplot as plt
def main():
if len(sys.argv) > 1:
model_path = sys.argv[1]
else:
model_path = os.path.join(get_scene_path('Rs'), 'mesh_z_up.obj')
renderer = MeshRendererG2G(width=512, height=512, device_idx=0)
renderer.load_object(model_path)
renderer.add_instance(0)
print(renderer.visual_objects, renderer.instances)
print(renderer.materials_mapping, renderer.mesh_materials)
camera_pose = np.array([0, 0, 1.2])
view_direction = np.array([1, 0, 0])
renderer.set_camera(camera_pose, camera_pose + view_direction, [0, 0, 1])
renderer.set_fov(90)
for i in range(3000):
with Profiler('Render'):
frame = renderer.render(modes=('rgb', 'normal', '3d'))
print(frame)
img_np = frame[0].flip(0).data.cpu().numpy().reshape(
renderer.height, renderer.width, 4)
normal_np = frame[1].flip(0).data.cpu().numpy().reshape(
renderer.height, renderer.width, 4)
plt.imshow(np.concatenate([img_np, normal_np], axis=1))
plt.show()
if __name__ == '__main__':
main()
2. 物理引擎測驗
iGibson使用PyBullet作為基礎物理引擎,可以準確有效地模擬機器人和關節物體的剛體碰撞和關節致動,由于使用iGibson構建的MeshRenderer進行渲染,使用PyBullet進行物理模擬,因此需要始終保持同步,
通常在使用場景時,物件和機器人p.createMultiBody并將p.loadURDF其加載到PyBullet中,用于p.resetBasePositionAndOrientation設定機器人和物件的基本姿勢,p.resetJointState設定機器人和關節物件的關節位置以及p.setJointMotorControl2控制機器人和關節物件,
下面代碼將場景,機器人和物件匯入PyBullet并逐步仿真:
from gibson2.utils.assets_utils import get_scene_path, get_texture_file
import gibson2
import os
import sys
import time
def main():
if len(sys.argv) > 1:
model_path = sys.argv[1]
else:
model_path = os.path.join(get_scene_path('Rs'), 'mesh_z_up.obj')
p.connect(p.GUI)
p.setGravity(0,0,-9.8)
p.setTimeStep(1./240.)
# Load scenes
collision_id = p.createCollisionShape(p.GEOM_MESH,
fileName=model_path,
meshScale=1.0,
flags=p.GEOM_FORCE_CONCAVE_TRIMESH)
visual_id = p.createVisualShape(p.GEOM_MESH,
fileName=model_path,
meshScale=1.0)
texture_filename = get_texture_file(model_path)
texture_id = p.loadTexture(texture_filename)
mesh_id = p.createMultiBody(baseCollisionShapeIndex=collision_id,
baseVisualShapeIndex=visual_id)
# Load robots
turtlebot_urdf = os.path.join(gibson2.assets_path, 'models/turtlebot/turtlebot.urdf')
robot_id = p.loadURDF(turtlebot_urdf, flags=p.URDF_USE_MATERIAL_COLORS_FROM_MTL)
# Load objects
obj_visual_filename = os.path.join(gibson2.assets_path, 'models/ycb/002_master_chef_can/textured_simple.obj')
obj_collision_filename = os.path.join(gibson2.assets_path, 'models/ycb/002_master_chef_can/textured_simple_vhacd.obj')
collision_id = p.createCollisionShape(p.GEOM_MESH,
fileName=obj_collision_filename,
meshScale=1.0)
visual_id = p.createVisualShape(p.GEOM_MESH,
fileName=obj_visual_filename,
meshScale=1.0)
object_id = p.createMultiBody(baseCollisionShapeIndex=collision_id,
baseVisualShapeIndex=visual_id,
basePosition=[1.0, 0.0, 1.0],
baseMass=0.1)
for _ in range(10000):
p.stepSimulation()
p.disconnect()
if __name__ == '__main__':
main()
將看到PyBullet界面,界面中包含一個Turtlebot機器人和一個藍色的罐子,

ROS中使用iGibson
ROS包含了很多驅動以及演算法的實作,因此需要利用ROS軟體包來完善機器人應用程式,iGibson與ROS集成有三個關鍵應用,
-
在可控的逼真的仿真環境中對現有演算法進行基準測驗,從而可以將基于學習的方法與模擬環境中的傳統方法進行比較,
-
將仿真中的機器人與現實世界中的機器人進行比較,在模擬中,iGibson可以模擬機器人的傳感器并發布為訊息,在現實世界中,真正的機器人會發布傳感器訊息,因此,可以僅更改訂閱的訊息并基準測驗下游應用程式的性能,這有助于定位域間隙和除錯演算法,
-
在仿真中使用ROS功能,例如許多運動計劃的實作,
我們測驗一下斯坦福官方提供的iGibson與ROS集成進行導航的示例,這是一個ros軟體包,它將iGibson Env與ros導航堆疊集成在一起,

-
安裝ROS:在此軟體包中,使用ros dynamic的導航堆疊,
-
由于ROS目前僅支持
python2.7,因此您需要創建python2.7虛擬環境而不是python3.x,因此需要原始碼編譯,請參考上文, -
如果您使用annaconda設定python環境,則需要對
PATH和進行一些調整PYTHONPATH以避免沖突,特別是:echo $PATH | grep -oP "[^:;]+" | grep conda ## Remove these paths from $PATH-
對于
PYTHONPATH:/usr/lib/python2.7/dist-packages/,/opt/ros/kinetic/lib/python2.7/dist-packages(ROS python庫),(gibson依賴項)并且需要位于中,<anaconda installation root>/anaconda2/envs/py27/lib/python2.7/site-packages``<gibson root>``PYTHONPATH -
對于
PATH:conda相關的需要從中洗掉PATH
-
-
將gibson-ros檔案夾復制(或軟鏈接)到您的檔案夾中,
catkin_ws/src然后運行catkin_make來索引gibson-ros軟體包,
ln -s $PWD/examples/ros/gibson-ros/ ~/catkin_ws/src/
cd ~/catkin_ws && catkin_make && cd -
安裝gibson2-ros依賴項:
rosdep install gibson2-ros
檢查demo:
which python
python -c 'import gibson2, rospy, rospkg'
運行gibson + ros的demo:
source /opt/ros/kinetic/setup.bash
source <catkin-workspace-root>/catkin_ws/devel/setup.bash
roslaunch gibson2-ros turtlebot_rgbd.launch
# Gmapping
roslaunch gibson2-ros turtlebot_gmapping.launch
# hector mapping
roslaunch gibson2-ros turtlebot_hector_mapping.launch
# navigation stack
roslaunch gibson2-ros turtlebot_navigation.launch
# navigation stack with ground truth localization
roslaunch gibson2-ros turtlebot_gt_navigation.launch
將看到如下效果:

Gmapping的效果如下:

訊息訂閱與節點可以通過ROS中的指令查詢,這里不再演示,

end
這期就到這里結束啦~~希望對你們有些許幫助!!
喜歡的話記得給小編個三連再走也不遲啦~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/431049.html
標籤:AI
