将现有场景生成网格导入mujoco的简要pipeline

Felix Christian Lv2

一、数据预处理

nerfstudio里整合了COLMAP工具,可通过它的指令直接对现有的数据进行预处理,转化为nerfstudio需要的格式。支持的数据类型如下表所示:

DataCapture DeviceRequirementsns-process-data Speed
📷 ImagesAnyCOLMAP🐢
📹 VideoAnyCOLMAP🐢
🌎 360 DataAnyCOLMAP🐢
📱 PolycamIOS with LiDARPolycam App🐇
📱 KIRI EngineIOS or AndroidKIRI Engine App🐇
📱 Record3DIOS with LiDARRecord3D app🐇
📱 Spectacular AIIOS, OAK, othersApp / sai-cli🐇
🖥 MetashapeAnyMetashape🐇
🖥 RealityCaptureAnyRealityCapture🐇
🖥 ODMAnyODM🐇
👓 AriaAria glassesProject Aria🐇
🛠 CustomAnyCamera Poses🐇

一个简单的处理的代码示例如下:

1
ns-process-data {video,images,polycam,record3d} --data {DATA_PATH} --output-dir {PROCESSED_DATA_DIR}

完整的参数集可参考此处。在教程网站也有更多其他类型数据的捕获教程。

踩坑记录 点击展开

colmap feature_extractor报错

报错内容

image-20241210152913623

解决方案

  1. 确认xcb插件是否安装:

    1
    2
    sudo apt update
    sudo apt install libxcb-*
  2. 设置环境变量:

    1
    2
    export QT_QPA_PLATFORM_PLUGIN_PATH=/home/felix/.local/lib/python3.10/site-packages/cv2/qt/plugins
    export QT_QPA_PLATFORM=offscreen

    (路径记得改成自己的路径)

这样应该就可以了,至少博主执行这两串代码后能成功运行。(虽然这个处理过程确实很慢)

二、模型训练

可直接对处理后的数据用nerfacto方法进行训练:

1
ns-train nerfacto --data {PROCESSED_DATA_DIR}

还有一些比较常用的参数:

1
2
3
4
5
6
--help #显示帮助菜单
--output-dir #输出文件夹
--steps-per-save #多少step保存一次,默认为2000
--max-num-iterations #最大iteration,默认为30000
--mixed-precision #是否启用混合精度,默认为true
--load-config #从配置文件读取,可从之前的训练中继续

训练结果默认会保存在outputs文件夹中。其中包含一个config.yml文件,记录了训练的配置信息。可通过读取它来进行接续的训练或者可视化:

1
ns-viewer --load-config {outputs/.../config.yml}

三、模型导出

在nerfstudio里支持三种类型的模型导出:3d gaussionpoint cloudmesh。这里只提及mesh的导出。

最简单的导出指令为:

1
ns-export poisson --load-config CONFIG.yml --output-dir OUTPUT_DIR

而在可视化界面中,可以自动生成导出指令:

image-20241210172317358

其中可以对参数进行调整,比如Use Crop可以自动裁剪保留中心物体,# Faces可以控制产生的面数的上限,# Points控制点数的上限。最后生成的指令为以下结构:

1
ns-export poisson --load-config {outputs/.../config.yml} --output-dir {OUTPUT_DIR} --target-num-faces 50000 --num-pixels-per-side 2048 --num-points 1000000 --remove-outliers True --normal-method open3d --obb_center 0.0000000000 0.0000000000 0.0000000000 --obb_rotation 0.0000000000 0.0000000000 0.0000000000 --obb_scale 1.0000000000 1.0000000000 1.0000000000

其中possion 表示使用泊松重建方法,nerfstudio还支持其他的重建方法,如marching-cubestsdf等,但效果都不尽如人意(可参考我之前的文章NeRF Studio简要教程 | FelixChristian's Blog,里面有重建结果)。

四、凸分解

在我之前的文章Mujoco - CoACD简略教程 | FelixChristian's Blog中有介绍到CoACD工具的安装和使用。

当编译完CoACD之后,可直接执行凸分解指令:

1
./main -i PATH_OF_YOUR_MESH -o PATH_OF_OUTPUT

需要注意的是,两个PATH都是需要以具体的.obj文件结尾的。最终导出的单个.obj文件是以多个组件结合的。如果直接导入mujoco,它还是会对整个文件再次进行替换。

为了在mujoco中实现正常的碰撞。必须把单个.obj文件导出为多个.stl文件,再在mujoco的.xml文件中进行引用。

这里借助了Blender的Super-Batch-Export插件:

image-20241210190612219

需要注意的是,根据mujoco的官方文档介绍:

MuJoCo can load triangulated meshes from OBJ files and binary STL. Software such as MeshLab can be used to convert from other formats. While any collection of triangles can be loaded and visualized as a mesh, the collision detector works with the convex hull. There are compile-time options for scaling the mesh, as well as fitting a primitive geometric shape to it. The mesh can also be used to automatically infer inertial properties – by treating it as a union of triangular pyramids and combining their masses and inertias. Note that meshes have no color, instead the mesh is colored using the material properties of the referencing geom. In contrast, all spatial properties are determined by the mesh data. MuJoCo supports both OBJ and a custom binary file format for normals and texture coordinates. Meshes can also be embedded directly in the XML.

mujoco可以从.obj文件和.stl文件加载三角网格,所以在用Blender进行批量导出时,需要选择这两种格式。

五、导入mujoco

.obj文件为例(.stl文件同理):

在上一步中导出的文件为convex_0.objconvex_1.obj、... 、convex_n.obj的形式。在我的FelixChristian011226/Mujoco-RL仓库中,编写了一个简单的脚本gen_convex.py,用于生成.xml文件中相应的引用。使用过程如下:

  1. 首先,将生成的多个.obj文件,存放在./terrain/mesh/{your_mesh_name}/文件夹中。

  2. 然后进入./terrain目录,使用如下指令:

    1
    python3 ./gen_component/gen_convex.py {model_folder} {indent_level} {total_count}

    其中model_folder对应your_mesh_name,即./terrain/mesh/目录下存放.obj文件的文件夹名称。

    indent_level是缩进量,一般为2,仅仅为了.xml文件中美观而设置。

    total_count是总的.obj文件数量,即最后一个文件的下标加一。

  3. 最后将.terrain/component/convex.xml文件中的前半部分内容,复制到对应的.xml<asset>部分,后半部分内容复制到<worldbody>部分。然后给其设置纹理,如:

    1
    <material name="mat_{name}" rgba="0.8 0.8 0.8 1"/>

    其中name应该和文件夹名对应。

  4. 最后再运行对应的.xml文件即可。

  • 标题: 将现有场景生成网格导入mujoco的简要pipeline
  • 作者: Felix Christian
  • 创建于 : 2024-12-10 14:52:05
  • 更新于 : 2024-12-16 16:23:38
  • 链接: https://felixchristian.top/2024/12/10/11-MeshToMujoco/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
将现有场景生成网格导入mujoco的简要pipeline