本帖最后由 lhs_hfs 于 2024-9-30 17:34 编辑
本来其实也打算做一个,智能家居的中控来着,但是看到有人已经做了一个了,所以这两天换了一个新的方向,做了一个偏向科研方向的辅助工具。
小安派的开箱和环境搭建可以看上一个帖子
【产品开箱】小安派R2 - 小安派Cam - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
点云
点云可以理解成空间中的3D点,它实际上是一种数字化的三维数据表达方式,通常由一组具有三维坐标(x, y, z)的点组成,每个点代表物体表面或空间中的一个特定位置。比如下面这个就是带颜色的点云可视化结果,当然也有一些稀疏点云是没有颜色的,主要就是看一下空间结构。
应用场景
一般来说,一些自动驾驶机器人(slam机器人)会需要先用雷达、rgbd相机之类的传感器来先对场景建一个地图,然后基于这个地图进行导航等操作。
但是因为slam机器人都是在比较复杂的环境里面运动,如果想要实时查看机器人建图的效果,要么就在机器人上装一个屏幕,要么就把机器人重建出来的点云传到pc机上。但是因为需要频繁调试机器人硬件,所以经常出现:去调试下硬件--回到pc机上看下点云重建效果--再去调试硬件。
这样非常不方便,而正好小安派R2有一块大屏幕和wifi,所以我就打算利用小安派R2来接受机器人发送出来的点云数据,然后显示在屏幕上,因为小安派可以直接用电池供电,加一个外壳之后就能很方便地随身携带,实时查看点云数据,大大提升了效率。
设计思路
首先需要解决的是GUI问题,直接用GUI-guide生成出来的画布是有点小问题的,所以需要单独在lvgl里添加一个画布,画布是用来显示点云数据的。然后随便做一些表格来显示信息,最后再随便画一点艺术字来作为logo。
然后在代码中添加好wifi和mqtt订阅,我这里也是直接参考论坛里面别人写好的框架,这样就算把通信解决了。
然后接下来是重点,因为点云是3D空间中的点,但是我们屏幕是2D的,所以需要把3D点投影到2D平面里面来。就类似用摄像机去拍照,拍照时候相机的不同,那么拍出来的照片也是不同的。
要把3D点云可视化出来,需要首先确定我们虚拟摄像机的位置,这个位置的设定可以比较随意,可以多设置几个位置来进行变换视角。既然已经确定了虚拟相机的位置,那么就可以根据下图的相机成像模型来计算出3D点云的在2D点的投影。
具体而言,假设点云为(X_w, Y_w, Z_w),而相机的旋转和平移都是我们手动设定的,所以这些参数都是已知的,所以最终的目的就是计算下面这个矩阵乘法,对应的成像结果就是最左边列向量的(u, v),只需要把屏幕上对应的点涂黑就相当于把这个3D点云投影完成了。
小安派每次通过mqtt接收到一个3D点云,就通过上面的公式计算出投影点,然后显示在屏幕上即可。
成果展示
因为点比较小,拍照出来摩尔纹比较严重,看的可能不是特别清楚,不过线下看可是非常清楚的,大概就是跟下面这个图一样
|