0%

高斯泼溅形状

为什么是椭球

一维高斯分布函数

一维高斯分布(Gaussian Distribution),通常被称为正态分布(Normal Distribution),其概率密度函数(PDF)的数学方程如下:

当概率取某个值时,x也对应的为一个常数值

二维高斯分布函数

二维高斯分布(Bivariate Gaussian Distribution 或 2D Normal Distribution)是一维高斯分布在二维平面上的推广。它的图像不再是一条平面曲线,而是一个三维空间中的“山包”或“钟形曲面”。

矩阵形式:若二维随机向量 $\mathbf{x} = [x, y]^T$ 服从均值向量为 $\mathbf{\mu}$,协方差矩阵为 $\mathbf{\Sigma}$ 的正态分布,其概率密度函数为:

其中:

  • 是二维变量
  • 是均值向量,决定了中心点的位置
  • $\mathbf{\Sigma} = \begin{bmatrix} \sigma_x^2 & \rho\sigma_x\sigma_y \ \rho\sigma_x\sigma_y & \sigma_y^2 \end{bmatrix}$是协方差矩阵,决定了分布的形状、方向和散度

当概率取某个常数值时:

此时xy的分布是一个椭圆,当概率值从[0,1]发生变化时,则x和y组成很多个椭圆,整体来说构成一个实心的椭圆面

三维高斯分布函数

在二维中,高斯分布是一个平面上的“山包”(等高线是椭圆)。 到了三维中,高斯分布描述的是三维空间中的一个“云团”“雾状球体”。它的等值面(密度相同点的集合)是三维空间中的椭球体 (Ellipsoid)

设三维随机向量 $\mathbf{x} = [x, y, z]^T$,其概率密度函数为:

其中:

  • $\mathbf{x}$ - 输入变量 (Input Vector): 三维空间中的一个点。 $\mathbf{x} = \begin{bmatrix} x \cr y \cr z \end{bmatrix}$

  • $\mathbf{\mu}$ - 均值向量 (Mean Vector): 这个三维“云团”中心点的位置坐标。 $\mathbf{\mu} = \begin{bmatrix} \mu_x \cr \mu_y \cr \mu_z \end{bmatrix}$

  • $\mathbf{\Sigma}$ - 3x3 协方差矩阵 (Covariance Matrix):

    这是最核心的部分,它定义了椭球体的形状、大小和方向。

    • 对角线元素 ($\sigma_x^2, \sigma_y^2, \sigma_z^2$):也就是方差,决定了椭球体沿 XYZ 三个轴向的拉伸程度(“胖瘦”)。
    • 非对角线元素 ():也就是协方差,表示了分布的x轴、y轴、z轴之间的关系,决定了椭球体在空间中的旋转姿态。如果它们全为 0,说明分布的xyz是独立的,椭球体的轴就与坐标轴平行。

    同时可以用来表示分布的特性

    • 各向同性:在各个方向具有相同的扩散程度(梯度)$\mathbf{\Sigma} = \begin{bmatrix} \sigma^2 & 0 & 0 \cr 0 & \sigma^2 & 0 \cr 0 & 0 & \sigma^2 \end{bmatrix}$,三个方向的方差相同,互不相关,则表示为一个正球体
    • 各向异性:在各个方向的均值不同,且方向相关(进行了旋转),因此高斯椭球具有各向异性,可以表示空间中的各种分布

当概率值取某个常数时$(\mathbf{x} - \mathbf{\mu})^T \mathbf{\Sigma}^{-1} (\mathbf{x} - \mathbf{\mu})=constant$,x的分布为椭球体,则当概率从[0,1]发生变化时,组成很多个椭球体,则所有的分布构成一个实心的椭球,这个就是高斯椭球

椭球形状的控制

上面已经推断出协方差矩阵控制了椭球的中心和各方向上的方向,根据椭球在空间上可以通过球进行仿射变换得到推出椭球的协方差矩阵可以通过球的协方差矩阵通过变换得到,即任意高斯可以看作标准高斯通过仿射变换得到。

对于高斯分布,假设其每个x均经过的仿射变换,那么其新的分布为

仿射变换可以分解为旋转和缩放,即$A=RS$,,反之,通过协方差矩阵之后可以通过特征值分求出R和S,即将高斯椭球的协方差矩阵用R、S进行表示,R作为旋转矩阵又可以通过四元数q进行表示,即最终的椭球,我们通过q、s进行表示

所以对于椭球的形状共有4元数+缩放3+中心3共10个参数

椭球的颜色

球谐函数

要理解球谐函数,你只需要理解一个概念:傅里叶变换(Fourier Transform)

  1. 一维的情况(傅里叶级数): 想象一段复杂的声波(音乐)。我们知道,这段复杂的波形其实是由无数个简单的正弦波(Sine waves)叠加而成的。
    • 低频正弦波决定了整体的大调。
    • 高频正弦波决定了细节和音色。
    • 结论: 任何一维周期函数,都可以分解为一组正弦波的加权和。
  2. 二维的情况(球谐函数): 现在,把目光从“一根线(声波)”移到“一个球(地球仪或灯光球)”上。 如果我想描述一个球体表面的颜色分布、凹凸起伏或者是围绕球体的光照强度,该怎么办?
    • 球谐函数就是定义在球表面上的“正弦波”
    • 结论: 任何定义在球表面上的函数(比如地球的地形、环境光照),都可以分解为一组球谐函数的加权和。

一句话总结定义: 球谐函数就是球面上的基函数(Basis Functions),就像积木一样,通过组合不同形状的积木(球谐函数),你可以拼出任何复杂的球面信号。

球谐函数公式

对于一个球谐函数有4个输入分别代表

  • : 指定的角度,也就是一个球谐函数可以求出空间中任意角度的值y,y代表的是这个球谐函数在这个角度的l,即长度
  • l(Degree, 阶数): 代表频率或细节程度、l越大球表面的褶皱越多,能表现的细节越明显。l=0是光滑的球;
  • m(order,阶次): 代表方向和纹理分布,范围m为整数,且. 正负代表了是否旋转90度

部件的作用:

  • :归一化常数,使得l和m不管怎么变,球谐函数在球面上的积分都等于1
  • :伴随勒让德多项式,这是核心形状生成器,专门负责切分南北(纬度)方向的形状

下面是l取3时m的所有取值所得出的表面图像:

m_3

椭球的颜色

我们要让椭球的颜色真实,就不能让椭球的颜色在各个角度看都意义,因此引入球谐函数,因为球谐函数恰好定义了每个不同的角度的值,我们可以将这个值作为颜色,也就是上图中不同方向的值不一样,代表颜色的占比不必要。

但是不能用一个球谐函数去代表颜色,因为实际上各个方向的并不规则,与傅里叶变换一样,可以用多个正余弦函数去拟合场景中的任意波形,因此,可以考虑多个球谐函数的叠加,去拟合空间中的任意椭球,也就是颜色的公式如下:

在高斯椭球颜色的渲染中,选择3阶即l等于3,其中的每个y都可以通过公式计算出来,所有的c为参数。且可以得出对于l,他的参数为2*l+1当最高取3时,所有的参数量为,同时,这仅能代表一个颜色值,对于真实的RGB,则需要个参数

高斯椭球参数

  • 形状参数:4个四元数+3个缩放+3个中心位置参数 =10
  • 颜色参数:16·3=48
  • 不透明度:1个$\alpha$

一共10+48+1=59个参数

本篇介绍我的世界的各种特性

铁傀儡刷新机制:村民被吓+区域内5个以上村民,僵尸吓村民表现为晚上上床后立马起床

简易刷铁机的制作

原料:

任意方框: 泥土、玻璃、石头均可以

收集装置

首先搭建下面的装置,一格深的装置,两个小箱子组成的大箱子——箱子*2 方块*15

收集1

接下来放置9个漏斗,漏斗连接到箱子上,方法是shift+右键点击对应方块,即可将漏斗连接到方块上、将红色线圈内的漏斗连接到箱子,其余漏斗依次连接

检验是否安装成果: 向漏斗里面丢东西,最后可以在箱子里面找到

漏斗安装

铁傀儡处死装置

在收集装置基础上向上搭建20格,并形成通道,部分区域可简化,以节省方块,当然也可以想底下挖,将收集装置位于-20处以节省方块,需要方块16*20=320,告示牌*9

玻璃通道

在距收集装置2格处放置告示牌,悬浮告示牌放置需要将光标指向告示牌右侧 shift+右键单机(下面的截图均高了一格)

告示牌放置方法

告示牌安置结果

在告示牌安置上一个放置岩浆,上图红框范围

岩浆放置结果

铁傀儡生成

搭建铁傀儡生成后的移动平台,利用水流将铁傀儡推到处死装置里

搭建9*9的方格,并在方格外侧添加围栏,挡住水的流动

铁傀儡流动平台

先在中心添加栅栏门,挡住水流向下的移动,在四个角的方块上放置水源,将铁傀儡向中心推动

![水流装置](水流装置.p

僵尸放置轨道

在水流上方四格处,放置一个横着的9格,并搭建为如图所示,其中最上方为半砖

僵尸行动轨道

在僵尸过道两侧建立有3*3*2空间的空间的村民房

村民房

放入床并封顶,注意床要顶格放,否则僵尸吓不到村民,如果夜晚村民睡觉了,说明距离太远了,以及注意床的方向,床的方向不对,村民不会睡觉

村民床

在最底下可以放置灵魂篝火,以加快效率

灵魂篝火

注意:

铁傀儡生成规则

一、ContextCapture先降低图像分辨率做空三再恢复继续做

首先下采样图像分辨率,一般为30%

下降分辨率

提交空三

image-20250804100937058

二、已有图像初始位姿,计算准确位姿

针对于:手持激光扫描仪由于时间同步或标定或者其他问题导致的图像位姿不准,但已有较好的初值,需要计算更为准确的位姿

将初始位姿转为blockexchange 的xml格式

这个格式是COntextCapture、Photoscan等软件的通用格式

image-20250804142715704

contextCapture导入xml结果

在已有位姿上提交空三

contextCapture提交空三

最后导出block,在metashape中生成稀疏点云即可

指定ip走指定的网卡

本文实验适用于,vpn走wifi的网卡,其余走网线,这样vpn不会影响其余端口的实用

查询本地网卡与网关

1
route print

网卡与网关信息

其中:10.104.255.254是网线的网关、192.168.1.1是wifi的网关

添加条件:指定的ip走指定的网关

1
route add 219.139.228.228 mask 255.255.255.255 192.168.1.1 metric 10 if 6

其中219.139.228.228是指定的ip 192.168.1.1是这个ip走的网关,其中6是指wifi对于的接口

wifi接口信息

即可实现219.139.228.228走wifi,其余走网线

常见命令

拉取容器

1
sudo docker pull image_name

创建镜像

1
docker run -i -d --gpus all --shm-size=24g -v F:/ubuntu/docker_data/fast-livo2:/data --name fast-livo2 cuda_11_8
  • -d: 容器在后台运行,并返回容器的id
  • —gpus all: 该镜像可以访问到的gpu设置为全部
  • —shm-size=24g: 设置容器的共享内存,默认为64MB,对于深度学习等应用来说,不够
  • -v local_path:image_path : 将容器路径映射到本地路径,用于存放代码和数据等等
  • —name: 容器名称
  • cuda_11_8: 镜像名称

进入已有容器的命令行进行操作

1
2
docker ps -a
docker exec -it <容器id或名称> /bin/bash

删除容器和镜像

1

加载本地镜像

常见问题

vscode连接远程docker权限问题

Failed to connect. Is Docker runing?

1
sudo chmod 777 /var/run/docker.sock

vscode连接远程本地docker版本冲突

Failed to connect to the remote extension host server (Error: Connection error: Client refused: version mismatch)

1
2
pkill -f vscode-server || true
rm -rf ~/.vscode-server ~/.vscode-server-insiders

pyinstaller常用参数

  • -F: 打包为一整个exe

  • -D: 打包为一个文件夹

  • -w: 运行时不显示命令行窗口(仅对windows有效)

  • -i: 图标路径

基础命令

本文代码:https://github.com/ouwenwu/UAV2GroundMapper.git

一、数据准备

无人机数据

无人机数据图片

手持扫码仪数据

手持扫描仪数据

二、无人机数据处理

Photoscan无人机处理流程

Align Photos->Build Point Cloud

无人机数据处理结果

导出camera.xml和点云备用,需要设置导出格式为blockexchange同时不需要导出tiepoints

photoscan导出camera

导出参数设置

点云导出参数设置

手持激光扫描仪处理流程

RayStudio打开工程文件—-Basic Data解算图片和点云数据

Raystudio解算数据

点云赋色

点云赋色

slam处理结果

RayStudio导出图片使用Photoscan空三

将RayStudio的文件导出图像初始位置

1
python main.py getImageXYZ --colmap_dir J:/jyg/chibi/zhihuilou/outdoor/shading/Colmap/sparse/0/images.txt --output_path J:/jyg/chibi/zhihuilou/outdoor/shading/Colmap/image_xyz.txt

图片路径位于:./image_undistorted/camera_front

Photoscan添加图片后,在Reference(参考页)添加图像位置作为参考,并选择之前输出的图像位置

phtotscan导入参考

可以适量的删除影像(只保留研究区域)以及稀疏影像,当前影像采集频率高于需求,适当减少加快效率,删除后align photos(对齐图片)->Build Point Cloud

手持密集点云

导出camera.xml和点云备用,需要设置导出格式为blockexchange同时不需要导出tiepoints

手持与无人机融合

手持到无人机坐标系统转换

cloudcampare计算变换矩阵

包含粗配准和精配准两个步骤:其中粗配准为手动调整点云使得两个点云具有初步配齐,再使用icp进行精配准.

记录下每一步点云的变换矩阵

旋转平移方法

粗配准结果

裁剪两个点云至相同范围,并做精配准

精配准

记录下每一步的变换矩阵如下:

变换矩阵

将手持坐标系按照变换关系旋转

将无人机的photoscan的xml格式转为colmap格式

1
python main.py from_photoscan_xml_2_colmap_txt --xml_path J:/jyg/test/camera_shouchi.xml --output_path J:/jyg/test/colmap

根据colmap结果计算图像位置

1
python main.py getImageXYZ --colmap_dir J:/jyg/test/colmap --output_path J:/jyg/test/image_xyz.txt

图像位姿

旋转图像位置到无人机的坐标系下:

1
python main.py rotate_image_xyz --image_xyz J:/jyg/test/image_xyz.txt --output_path J:/jyg/test/image_xyz_out.txt --matrix_path J:/jyg/test/matrix.txt

根据旋转后的图像位置去纠正colmap文件到指定坐标系

1
colmap model_aligner --input_path J:/jyg/test/colmap --output_path J:/jyg/test/colmap_rotate --ref_images_path J:/jyg/test/image_xyz_out.txt --alignment_type enu --ref_is_gps 0  --robust_alignment_max_error 3

将旋转后的bin文件转为txt格式

colmap->import model->export model as text

将旋转后的colmap的txt文件,写为photoscan的xml文件

1
python main.py write_colmap_txt_2_photoscan_xml --colmap_txt_path J:/jyg/test/colmap_rotate --output_xml_path J:/jyg/test/camera_shouchi_rotate.xml --image_path J:/jyg/test/20250726162036/image_undistorted/camera_front

融合无人机和手持影像

合并无人机的xml和手持影像的xml

1
python main.py merge_photoscan_xml --xml_lists J:/jyg/test/camera_wrj.xml J:/jyg/test/camera_shouchi_rotate.xml --output_xml_path J:/jyg/test/merged_camera.xml

将xml文件导出为colmap的txt格式

1
2
python main.py from_photoscan_xml_2_colmap_txt --xml_path J:/jyg/test/merged_camera.xml --output_path J:/jyg/test/colmap_m
erge

  1. Equations: conclude with comma or dot depending on what follows.

    公式后要根据后续的内容添加逗号或句号

一、创建文档

1.创建到_post默认的文件夹中

1
hexo new name

2.创建到_post下的指定子文件夹中

1
hexo new post "title" --path=latex/name.md

二、部署到github

1
hexo clean && hexo generate && hexo deploy