iGibson:Python就能玩的3D环境仿真
我是来自山区、朴实、不偷电瓶的AI算法工程师阿chai,给大家分享人工智能、自动驾驶、机器人、3D感知相关的知识
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,对于Anaconda的安装参考阿chai之前的教程。
# 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 /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依赖项)并且需要位于中。/anaconda2/envs/py27/lib/python2.7/site-packages`` ``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_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中的指令查询,这里不再演示。
本文参考了官方的教程,更多iGibson的介绍请移步官网进行阅读,阿chai这里只是针对安装、渲、物理仿真以及ROS驱动等方面进行介绍。
iGibson是斯坦福大学继ROS后出的“吊炸天”的工具。ROS在机器人、自动驾驶、人工智能的落地与科研上起到了不可替代的作用(百度的Apollo除外),iGibson几乎是针对ROS定制的3D模拟环境,物理引擎的效果真的太强了,阿chai从第一版本用到现在,真的受益很多。
推荐阅读
• 川普的退休生活?不,是AI算法的宅舞演绎• 「充电学习」物体检测的主流方法• 「修炼开始」一文带你入门深度学习