【Chrono Engine学习总结】6-创建自定义场景-6.1-3D场景获取

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。

Chrono可以导入自定义的三维模型,所以想自己搭建一个3D仿真环境。过程中遇到了一些问题,记录与整理。

1、3D环境的创建方法

Chrono的Irrlicht模块支持导入mesh贴图,因此可以用任何可以创建obj格式的工具创建一个3D环境。如何制作一个3D场景?我尝试了使用图像拍照环境然后重建、激光雷达扫描仪扫描真实环境重建、公开激光雷达数据集点云重建、以及直接绘制三维模型这几种方法。

1.1 COLMAP

首先是大量拍照然后采用COLMAP工具重建,总的来说效果一般,在没有纹理区域重建效果很差,而且重建的时间非常长。建的车棚,效果图如下,有大量的空缺区域:

1.2 手持激光雷达三维扫描仪

  • 其次,用尝试了用手持激光雷达扫描仪进行重建,使用的是留形科技的留形机360,建造了室内场景。客观评价,虽然点云看着很不错,但重建的效果有些差,而且探测距离只有40m左右,在大范围场景下效果肯定更差。下图分别是室外的(带颜色)点云,以及室内的重建。可以看出,重建效果有些差,不太能直接用于仿真。

1.3 高精度点云数据重建

还尝试了用高精度的公开点云数据集进行重建,采用的是MCD数据集,下图右下角是高精度的点云,真的精度非常高,但由于该数据集是用于SLAM任务,所以角度覆盖不是很好。用meshlab进行重建,可以看出,对于规则的平面/曲面重建还行,但树木效果就极差,同时还有大量的错误连通区域,造成后处理复杂。所以也没有采用。

1.4 三维设计软件进行制作

最后,可以尝试用三维设计软件进行制作,只要能够到处obj格式文件即可,solidwork、autocad等都行。我采用的是sketchup草图大师。

2、SketchUp草图大师绘制场景

这里略过SketchUp的基本操作,只放一下绘制的结果,以及一些注意事项。
注意事项

  • SketchUp2024比2023优化的好一些,不容易卡顿;
  • 卡顿的解决方法,参考知乎:
  • 模型尽量选择面元较少的,一般一个几十K上百K还能接受,如果有好几M,最终到处obj时会非常大,在chrono里面仿真会非常的卡。
  • 导出obj文件时,注意单位,以及把贴图也一并导出,配置如下:

3、Chrono中代码

Chrono中关键部分的代码如下,即添加obj格式的mesh,然后添加到system当中即可。注意chrono默认的添加单位是米,如果sketchup中设置不是m,或者solidwork等导出的可能是英寸/mm,需要在Transform函数中进行缩放。

cpp 复制代码
std::string scene_3d = "C:/Users/larrydong/Desktop/sketchup-obj/outdoor_simple.obj";
auto mmesh = chrono::geometry::ChTriangleMeshConnected::CreateFromWavefrontFile(scene_3d, true, true);
double inch_2_mm_scale = 0.0254;
mmesh->Transform(ChVector<>(-0, -0, -0.5), ChMatrix33<>(1));
auto trimesh_shape = chrono_types::make_shared<ChVisualShapeTriangleMesh>();
trimesh_shape->SetMesh(mmesh);
trimesh_shape->SetName("scene mesh");
trimesh_shape->SetMutable(false);
auto mesh_body = chrono_types::make_shared<ChBody>();
mesh_body->SetPos({ 0, 0, 0 });
mesh_body->AddVisualShape(trimesh_shape, ChFrame<>());
mesh_body->SetBodyFixed(true);
std::cout << "<-- Adding mesh. " << std::endl;
sys.Add(mesh_body);

运行截图:
左侧是lidar的扫描,右侧是场景。可以明显看出,场景中的东西颜色不正确,这是因为光照设置不合理。参考下一篇文档解决方法。

tif格式贴图加载的Bug:

导出obj格式时,sketchup有些贴图是tif格式,有些是png/jpg。tif格式在chrono加载时会出现路径的斜杠方向不正确:

显然,所有jpg格式的路径中都是/,而tif格式的前半部分路径变成了\,这个路径是通过obj所在路径自动加载的,所以没法修改。我也不知道为什么会出这个问题。如果出了这个问题,仿真时是会崩溃的。解决办法,就是把tif另存为png/jpg格式,然后修改xxx.mtl文件中的tif为png/jpg即可。

我也不知道为啥。

相关推荐
slomay1 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa1 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
小小洋洋3 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
Ace'4 小时前
每日一题&&学习笔记
笔记·学习
IM_DALLA4 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
丶Darling.4 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
z樾6 小时前
Github界面学习
学习
道爷我悟了7 小时前
Vue入门-指令学习-v-html
vue.js·学习·html
计算机学姐8 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
彤银浦8 小时前
python学习记录7
python·学习