【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即可。

我也不知道为啥。

相关推荐
西岸行者9 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意9 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码9 天前
嵌入式学习路线
学习
毛小茛9 天前
计算机系统概论——校验码
学习
babe小鑫9 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms9 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下9 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。9 天前
2026.2.25监控学习
学习
im_AMBER9 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J9 天前
从“Hello World“ 开始 C++
c语言·c++·学习