iGibson:Python就能玩的3D环境仿真

Jack Cui

共 10725字,需浏览 22分钟

 ·

2020-12-18 14:30



我是来自山区、朴实、不偷电瓶的AI算法工程师阿chai,给大家分享人工智能、自动驾驶、机器人、3D感知相关的知识



好久不出SLAM和3D方面的推文了,阿chai今天给大家带来一个来源于李飞飞大佬团队3D仿真环境iGibson。iGibson通过Python就能调用,在ROS中可直接观察,阿chai推荐做机器人、3D以及模型构建的小伙伴可以尝试,iGibson中的物理引擎是真的很强。



我们先看一段有关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,对于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_datasetyour_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([001.2])
    view_direction = np.array([100])
    renderer.set_camera(camera_pose, camera_pose + view_direction, [001])
    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([001.2])
    view_direction = np.array([100])
    renderer.set_camera(camera_pose, camera_pose + view_direction, [001])
    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.00.01.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导航堆栈集成在一起。

  1. 安装ROS:在此软件包中,使用ros dynamic的导航堆栈。

  2. 由于ROS目前仅支持python2.7,因此您需要创建python2.7虚拟环境而不是python3.x。因此需要源码编译,请参考上文。

  3. 如果您使用annaconda设置python环境,则需要对PATH和进行一些调整PYTHONPATH以避免冲突。特别是:

    echo $PATH | grep -oP "[^:;]+" | grep conda ## Remove these paths from $PATH
    1. 对于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
    2. 对于PATH:conda相关的需要从中删除PATH
  4. 将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算法的宅舞演绎•   「充电学习」物体检测的主流方法•   「修炼开始」一文带你入门深度学习



浏览 147
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报