由于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
函数中进行缩放。
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即可。
我也不知道为啥。