使用OpenGL实现OpenCV的remap功能
我们希望对输入图片根据Distort
程序进行畸变处理:
1 | void Distort(const float &x_src, |
输入图像 | 处理后图像 |
---|---|
可以根据Distort
程序,生成OpenCV中cv::remap
函数所需的map1
,map2
映射矩阵,然后再使用cv::remap
对输入图片进行处理。为了加速这个图像处理速度,尝试使用OpenGL,通过显卡实现类似于cv::remap
函数的功能:
1 | /* |
我们希望对输入图片根据Distort
程序进行畸变处理:
1 | void Distort(const float &x_src, |
输入图像 | 处理后图像 |
---|---|
可以根据Distort
程序,生成OpenCV中cv::remap
函数所需的map1
,map2
映射矩阵,然后再使用cv::remap
对输入图片进行处理。为了加速这个图像处理速度,尝试使用OpenGL,通过显卡实现类似于cv::remap
函数的功能:
1 | /* |
罗汉杰. 磁力计数据的处理方法和装置[P]. 中国专利: CN115327452A, 2022.11.11.
磁力计也叫地磁、磁感器,它拥有三个正交方向的霍尔传感器,能够测量出三个方向的磁场强度。由于地球的磁场像一个条形磁体一样由磁南极指向磁北极,通过合成三个方向的霍尔传感器磁场强度读数,可以计算出出设备的航向和姿态。磁力计被广泛地应用于手机,飞行器,机器人等设备中。
然而在一般情况下,地球的磁场十分微弱。如果磁场计周围存在磁性物质或者可以影响局部磁场强度的物质存在,会对磁场造成干扰,使得地磁读取数据产生偏差。再加上受制造安装工艺、敏感轴电气性不一致及零点偏移等因素影响,磁力仪本身存在三轴非正交、敏感轴灵敏度不一致及零偏误差等性能缺陷,使得磁测的准确性受到较大影响。
而各种传感器都有各自的坐标系。在实际应用中,往往需要将多种传感器的坐标对齐到同一个坐标系下。例如,我们一般将磁力计的坐标系对齐到加速度传感器的坐标系下。但由于安装误差的存在,磁力计坐标系与加速度坐标系没有相互重合,存在一个旋转误差。
因此,我们在使用磁力计前,一方面需要对其进行标定工作,获得真实的地磁方向数据;另一方面将地磁计的坐标系与其他坐标系进行对齐,以方便后续使用。
磁力计误差一般包括硬铁误差,软铁误差,尺度误差,三轴非正交误差和零偏误差。
硬铁误差:永磁铁或者磁化金属会对磁场产生额外的磁场干扰,其干扰磁场的大小和相对于载体的方向一般保持不变。我们称这种干扰导致的误差为硬铁误差\(\textbf{b}_{n}\)。硬铁误差\(\textbf{b}_{n}\)相当于在磁场上添加一个偏移向量,我们定义为一个3×1向量(\(𝑇\)符号表示矩阵转置):
\[\begin{equation} \label{eq:mag1} \textbf{b}_{n}=[b_{n,x},b_{n,y},b_{n,z}]^{T} \end{equation}\]
软铁误差:软铁磁场是由铁磁材料如铁、镍、PCB 板等对受地磁场或电磁场的磁化而产生的。软铁磁场会随时间和载体航向的变化而变化。我们定义软铁磁场造成的误差\(\textbf{A}_{s}\)为一个3×3矩阵:
\[\begin{equation} \label{eq:mag2} \textbf{A}_{s}=\left[{\begin{array}{c c c}{a_{00}}&{a_{01}}&{a_{02}} \newline {a_{10}}&{a_{11}}&{a_{12}} \newline {a_{20}}&{a_{21}}&{a_{22}}\end{array}}\right] \end{equation}\]
尺度误差\(\textbf{S}\)为一个3×3矩阵:
\[\begin{equation} \label{eq:mag3} \textbf{S}=\left[{\begin{array}{c c c}{s_{x}}&{0}&{0} \newline {0}&{s_{y}}&{0} \newline {0}&{0}&{s_{z}}\end{array}}\right] \end{equation}\]
三轴非正交误差\(\textbf{N}\)为一个3×3矩阵:
\[\begin{equation} \label{eq:mag4} \textbf{N}=\left[{\begin{array}{c c c}{n_{x,x}}&{n_{y,x}}&{n_{z,x}} \newline {n_{x,y}}&{n_{y,y}}&{n_{z,y}} \newline {n_{x,z}}&{n_{y,z}}&{n_{z,z}}\end{array}}\right] \end{equation}\]
零偏误差\(\textbf{b}_{m}\)为一个3×1向量:
\[\begin{equation} \label{eq:mag5} \textbf{b}_{m}=[b_{m,x},b_{m,y},b_{m,z}]^{T} \end{equation}\]
综上所述,磁力计的误差模型为:
\[\begin{equation} \label{eq:mag6} \textbf{h}=\textbf{S}\textbf{N}(\textbf{A}_{s}\textbf{h}' + \textbf{b}_{n}) + \textbf{b}_{m} \end{equation}\]
其中,\(\textbf{h}=[h_{x},h_{y},h_{z}]^{T}\)为磁力计未经标定的直接读取值,\(\textbf{h}'=[h_{x}',h_{y}',h_{z}']^{T}\)为磁力计经过标定后的地磁真实值,简化公式\(\eqref{eq:mag6}\):
\[\begin{equation} \label{eq:mag7} \textbf{h}'=\textbf{A}(\textbf{h} - \textbf{b}) \end{equation}\]
其中,\(\textbf{A}=(\textbf{S}\textbf{N}\textbf{A}_{s})^{-1}\),\(\textbf{b}=\textbf{S}\textbf{N}\textbf{b}_{n}+\textbf{b}_{m}\)为未知的误差模型参数。通过对磁力计进行标定,我们可以得到参数\(\textbf{A}\)和\(\textbf{b}\)的值,然后我们可以使用公式\(\eqref{eq:mag7}\),将读取的,带误差的测量值\(\textbf{h}\)恢复为真实值\(\textbf{h}'\)。
假设空间中有\(𝑛\)个三维点集\(\lbrace \textbf{X}_{i} = [X_{i}, Y_{i}, Z_{i}]^{T} \mid 0 \le i < n \rbrace\),我们希望能够找到一个最佳椭圆体去拟合这些三维点。描述椭圆体的一般方程为:
\[\begin{equation} \label{eq:mag8} 𝑎𝑋^{2} +𝑏𝑌^{2} +𝑐𝑍^{2} + 2𝑑𝑋𝑌 + 2𝑒𝑋𝑍 + 2𝑓𝑌𝑍 + 2𝑔𝑋 + 2h𝑌 + 2𝑖𝑍 + 𝑗 = 0 \end{equation}\]
上式可以写为矩阵形式:
\[\begin{equation} \label{eq:mag9} [X \quad Y \quad Z] \left[{\begin{array}{c c c}{a}&{d}&{e} \newline {d}&{b}&{f} \newline {e}&{f}&{c}\end{array}}\right] \left[{\begin{array}{c}{X} \newline {Y} \newline {Z}\end{array}}\right] + [X \quad Y \quad Z] \left[{\begin{array}{c}{2g} \newline {2h} \newline {2i}\end{array}}\right] + j = 0 \end{equation}\]
其中,\(𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, h, 𝑖, 𝑗\)为描述椭圆体的参数,表示了椭圆体的中心位置,轴方向,和旋转等信息。椭圆体拟合,就是给定一个三维点集,求取满足公式\(\eqref{eq:mag9}\)的椭圆体的参数\(𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, h, 𝑖, 𝑗\)。椭圆体的拟合方法有很多,这里我们使用经典的最小二乘法。
设定未知的参数向量\(\textbf{v} = [𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, h, 𝑖, 𝑗]^{T}\),对于每一个点\(\textbf{X}_{i} = [X_{i}, Y_{i}, Z_{i}]^{T}\),定义一个临时向量\(\textbf{P}_{i}\):
\[\begin{equation} \label{eq:mag10} \textbf{P}_{i} = (X_{i}^{2}, Y_{i}^{2}, Z_{i}^{2}, 2Y_{i}Z_{i}, 2X_{i}Z_{i}, 2X_{i}Y_{i}, 2X_{i}, 2Y_{i}, 2Z_{i}, 1)^{T} \end{equation}\]
定义10×n矩阵\(\textbf{D} = (\textbf{P}_{0}, \textbf{P}_{1}, \cdots, \textbf{P}_{n-1})\),它包含了所有的三维点集的信息。
定义6×6大的临时矩阵\(\textbf{C}_{1}\):
\[\begin{equation} \label{eq:mag11} \textbf{C}_{1} = \left[{\begin{array}{c c c c c c}{-1}&{1}&{1}&{0}&{0}&{0} \newline {1}&{-1}&{1}&{0}&{0}&{0} \newline {1}&{1}&{-1}&{0}&{0}&{0} \newline {0}&{0}&{0}&{-4}&{0}&{0} \newline {0}&{0}&{0}&{0}&{-4}&{0} \newline {0}&{0}&{0}&{0}&{0}&{-4}\end{array}}\right] \end{equation}\]
定义10×10大的约束矩阵\(\textbf{C}\):
\[\begin{equation} \label{eq:mag12} \textbf{C} = \left[{\begin{array}{c c}{\textbf{C}_{1}}&{\textbf{0}_{6×4}} \newline {\textbf{0}_{4×6}}&{\textbf{0}_{4×4}}\end{array}}\right] \end{equation}\]
根据椭圆体的几何特性,拟合的椭圆体,在满足公式\(\eqref{eq:mag9}\)的前提下,还需满足约束公式\(\textbf{v}^{T}\textbf{C}\textbf{v}=1\)。将椭圆体拟合问题变成最小二乘优化问题,即求取\(\textbf{v}\),使得:
\[\begin{equation} \label{eq:mag13} \min_{\textbf{v}} \lVert \textbf{D} \textbf{v} \rVert ^{2}, 并且\textbf{v}^{T}\textbf{C}\textbf{v}=1 \end{equation}\]
使用增广拉格朗日乘子法,从公式\(\eqref{eq:mag13}\)能够得到:
\[\begin{align} \textbf{D}\textbf{D}^{T}\textbf{v} &= \lambda \textbf{C}\textbf{v} \label{eq:mag14} \newline \textbf{v}^{T}\textbf{C}\textbf{v} &= 1 \label{eq:mag15} \end{align}\]
其中,\(\lambda\)为拉格朗日乘数。\(\textbf{D}\textbf{D}^{T}\)为一个10×10大的矩阵,\(\textbf{v}\)为一个10×1的向量。分解矩阵\(\textbf{D}\textbf{D}^{T}\)和向量\(\textbf{v}\)为:
\[\begin{equation} \label{eq:mag16} \textbf{D}\textbf{D}^{T} = \left[{\begin{array}{c c}{\textbf{S}_{11}}&{\textbf{S}_{12}} \newline {\textbf{S}_{12}}&{\textbf{S}_{22}}\end{array}}\right] \end{equation}\]
\[\begin{equation} \label{eq:mag17} \textbf{v} = \left[{\begin{array}{c}{\textbf{v}_{1}} \newline {\textbf{v}_{2}}\end{array}}\right] \end{equation}\]
其中\(\textbf{S}_{11}\),\(\textbf{S}_{12}\),\(\textbf{S}_{22}\)大小为6×6,6×4和4×4,向量\(\textbf{v}_{1}\),\(\textbf{v}_{2}\)大小为6和4。公式\(\eqref{eq:mag14}\)可以改写为:
\[\begin{align} \textbf{C}_{1}^{-1}(\textbf{S}_{11}-\textbf{S}_{12}\textbf{S}_{22}^{-1}\textbf{S}_{12}^{T})\textbf{v}_{1} &= \lambda \textbf{v}_{1} \label{eq:mag18} \newline \textbf{v}_{2} &= - \textbf{S}_{22}^{-1}\textbf{S}_{12}^{T}\textbf{v}_{1} \label{eq:mag19} \end{align}\]
对公式\(\eqref{eq:mag18}\)中的矩阵\(\textbf{C}_{1}^{-1}(\textbf{S}_{11}-\textbf{S}_{12}\textbf{S}_{22}^{-1}\textbf{S}_{12}^{T})\textbf{v}_{1}\)进行奇异值分解,求取特征值和特征向量,则\(\textbf{v}_{1}\)的值为最大特征值所对应的特征向量。然后将\(\textbf{v}_{1}\)代入公式\(\eqref{eq:mag19}\)求取\(\textbf{v}_{2}\),最终椭圆体的参数向量\(v\)可得。
本磁力计标定方法包括两个部分,一方面是求取磁力计的误差模型,用来获取真实的地磁方向数据;另外一个方面将磁力计坐标系对齐到加速度坐标系下。
我们先采集数据。假定载体上有已经经过标定的加速度计和未经标定的磁力计。旋转载体,然后静置,采集在该静置姿态下的,已标定的加速度计读数\(\textbf{a}\)(由于是在静置姿态下,所以该读数即为重力加速度)和未经标定的磁力计读数\(\textbf{h}\)。重复以上操作\(𝑛\)次,获取载体在各种姿态下(尽量覆盖所有的方向)的重力加速度数据集\(\lbrace \textbf{a}_{i} = [a_{i,x}, a_{i,y}, a_{i,z}]^{T} \mid 0\le i < n \rbrace\)和地磁数据集\(\lbrace \textbf{h}_{i} = [h_{i,x}, h_{i,y}, h_{i,z}]^{T} \mid 0\le i < n \rbrace\),\(𝑛\)为数据集的大小。
公式\(\eqref{eq:mag7}\)为磁力计的误差模型,其中\(\textbf{h}\)为未经标定的磁力计值,\(\textbf{h}'\)为标定后的真实值。由于在实际应用中,一般只需要磁力计的矢量方向用来计算设备的航向角,而不关心磁场的大小,因此会对\(\textbf{h}'\)进行归一化处理,即有\(\textbf{h}'^{T} \textbf{h}'= {\lVert \textbf{h}' \rVert }^2\)。代入公式\(\eqref{eq:mag7}\)并展开,有:
\[\begin{equation} \label{eq:mag20} \textbf{h}^{T} \textbf{Q} \textbf{h} + \textbf{h}^{T} \textbf{n} + d = 0 \end{equation}\]
其中\(\textbf{Q}=\textbf{A}^{T}\textbf{A}\),\(\textbf{n}=-2\textbf{Q}\textbf{b}\),\(d=\textbf{b}^{T}\textbf{Q}\textbf{b} - 1\)。
对比公式\(\eqref{eq:mag20}\)和椭圆体公式\(\eqref{eq:mag9}\),我们发现磁力计误差模型\(\eqref{eq:mag20}\)相当于一个椭圆体公式,即磁力计的读值\(\textbf{h}\)会落在了一个椭圆体上(见下图):
去掉硬铁误差,软铁误差,尺度误差,零点误差等误差而得到的磁力计真实值\(\textbf{h}'\),应该落在一个圆心在原点的球体上。将未经标定的磁力计数据集\(\lbrace \textbf{h}_{i} \mid 0\le i < n \rbrace\)当作椭圆体上的三维点集\(\lbrace \textbf{X}_{i} \mid 0\le i < n \rbrace\),使用上述的椭圆体拟合法求取参数向量\(\textbf{v} = [𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, h, 𝑖, 𝑗]^{T}\)。根据公式\(\eqref{eq:mag9}\)和公式\(\eqref{eq:mag20}\),我们能够获得磁力计的误差模型参数\(\textbf{Q}\),\(\textbf{n}\),\(d\):
\[\begin{equation} \label{eq:mag21} \textbf{Q} = \left[{\begin{array}{c c c}{a}&{d}&{e} \newline {d}&{b}&{f} \newline {e}&{f}&{c}\end{array}}\right], \quad \textbf{n} = \left[{\begin{array}{c}{2g} \newline {2h} \newline {2i}\end{array}}\right], \quad d = j \end{equation}\]
实际上通过公式\(\eqref{eq:mag20}\)计算获得的误差模型参数\(\textbf{Q}\),\(\textbf{n}\),\(d\)并非是真实值,它们与真实值\(\overline{\textbf{Q}}\),\(\overline{\textbf{n}}\),\(\overline{d}\)之间存在一个矢量\(\alpha\)值,即\(\overline{\textbf{Q}} = \alpha \textbf{Q}\),\(\overline{\textbf{n}} = \alpha \textbf{n}\),\(\overline{d} = \alpha d\)(\(\textbf{Q}\),\(\textbf{n}\),\(d\)乘以一个任意矢量\(\alpha\)值都会满足公式\(\eqref{eq:mag20}\),所以我们通过公式\(\eqref{eq:mag20}\)获 得的\(\textbf{Q}\),\(\textbf{n}\),\(d\)并非是唯一值)。我们将\(\alpha\)设定为尺度变量,根据定义有\(\overline{\textbf{n}}=-2\overline{\textbf{Q}}\textbf{b}\),\(\overline{d} = \textbf{b}^{T}\overline{\textbf{Q}} \textbf{b} - 1\),进一步得出:
\[\begin{equation} \nonumber \begin{aligned} 1 &= \textbf{b}^{T}\overline{\textbf{Q}} - \overline{d} \newline &= (-0.5\overline{\textbf{n}}^{T}\overline{\textbf{Q}}^{-1}) \overline{\textbf{Q}} (-0.5\overline{\textbf{n}}^{T}\overline{\textbf{Q}}^{-1}) - \overline{d} \newline &= 0.25 \overline{\textbf{n}}^{T}\overline{\textbf{Q}}^{-1} \overline{\textbf{n}} - \overline{d} \newline &= \alpha(0.25 \textbf{n}^{T}\textbf{Q}^{-1}\textbf{n}-d) \end{aligned} \end{equation}\]
\[\begin{equation} \label{eq:mag22} \longrightarrow \quad \alpha = \frac{4}{\textbf{n}^{T}\textbf{Q}^{-1}\textbf{n}-d} \end{equation}\]
根据\(\overline{\textbf{n}}= − 2\overline{\textbf{Q}}\textbf{b}\),\(\overline{\textbf{Q}} = \alpha\textbf{Q}\),\(\overline{\textbf{n}} = \alpha\textbf{n}\),有:
\[\begin{align} b &= -\frac{1}{2} \overline{\textbf{Q}}^{-1}\overline{\textbf{n}} \nonumber \newline &= -\frac{1}{2} \textbf{Q}^{-1} \textbf{n} \label{eq:mag23} \end{align}\]
根据\(\overline{\textbf{Q}}=\overline{\textbf{A}}^{T}\overline{\textbf{A}}\),\(\overline{\textbf{Q}}=\alpha\textbf{Q}\),有:
\[\begin{equation} \label{eq:mag24} \textbf{A} = (\alpha \textbf{Q})^{\frac{1}{2}} \end{equation}\]
则标定后的磁力计值\(\textbf{h}'=\textbf{A}(\textbf{h} - \textbf{b})\),为一个半径为1的球体上的点,如下图:
设定有3×3旋转矩阵\(\textbf{R}\),能够将磁力计坐标系下的,经过标定的地磁向量\(\textbf{h}'\)对齐到加速度坐标系下,即:
\[\begin{equation} \label{eq:mag25} \textbf{h}^{a} = \textbf{R}\textbf{h}' \end{equation}\]
在局部地理环境下,地磁向量\(\textbf{h}'\)与重力加速度\(\textbf{a}\)有固定的夹角\(\theta\),根据几何关系有:
\[\begin{equation} \label{eq:mag26} \cos(\theta) - \frac{\textbf{a}^{T} \textbf{R} \textbf{h}'}{ {\lVert \textbf{a} \rVert}{\lVert \textbf{h}' \rVert} } = 0 \end{equation}\]
我们使用高斯-牛顿优化方法求取旋转矩阵\(\textbf{R}\)。为方便后续计算,我们使用李代数\(\boldsymbol{ \phi } = [{\phi}_{1}, {\phi}_{2}, {\phi}_{3}]\)表示旋转矩阵\(\textbf{R}\),李代数\(\boldsymbol{ \phi }\)与旋转矩阵\(\textbf{R}\)有以下关系\(\textbf{R}(\boldsymbol{ \phi })={e}^{\boldsymbol{ \phi }^{\wedge}}\)。\(e\)为自然常数,\(\wedge\)符号表示以下操作:
\[\begin{equation} \label{eq:mag27} \boldsymbol{ \phi }^{\wedge} = ([{\phi}_{1}, {\phi}_{2}, {\phi}_{3}])^{\wedge} = \begin{bmatrix} {0}&{-\phi_{3}}&{\phi_{2}} \newline {\phi_{3}}&{0}&{-\phi_{1}} \newline {-\phi_{2}}&{\phi_{1}}&{0} \end{bmatrix} \end{equation}\]
根据公式\(\eqref{eq:mag26}\),对重力加速度数据集\(\lbrace \textbf{a}_{i} \mid 0\le i < n \rbrace\)和标定后的地磁数据集\(\lbrace \textbf{h}_{i}' = \textbf{A} (\textbf{h}_{i} - \textbf{b}) \mid 0\le i < n \rbrace\)建立代价函数\(L(\textbf{x})\),有:
\[\begin{equation} \label{eq:mag28} L(\textbf{x}) = L([\boldsymbol{ \phi },k]^{T})=\frac{1}{2}\sum_{i=0}^{n-1}(k-\overline{\textbf{a}}_{i}^{T}\textbf{R}(\boldsymbol{ \phi })\overline{\textbf{h}}_{i})^2 \end{equation}\]
其中\(\textbf{x}=[\boldsymbol{ \phi },k]^{T}=[{\phi}_{1}, {\phi}_{2}, {\phi}_{3}, k]^{T}\),\(k=\cos(\theta)\),\({\overline{\textbf{a}}_{i}} = {\textbf{a}_{i}} / {\lVert \textbf{a}_{i} \rVert}\),\({\overline{\textbf{h}}_{i}} = {\textbf{h}_{i}'} / {\lVert \textbf{h}_{i}' \rVert}\)。我们希望通过最小化代价函数,即\(\min_{L(\textbf{x})}\),计算得到\(\textbf{x}\),来求取未知的旋转矩阵\(\textbf{R}(\boldsymbol{ \phi })\)和夹角变量\(k\)。
对于数据集\(\lbrace \textbf{a}_{i} \mid 0\le i < n \rbrace\),\(\lbrace \textbf{h}_{i}' \mid 0\le i < n \rbrace\),有n×4雅可比矩阵\(J(\textbf{x})\):
\[\begin{equation} \label{eq:mag29} J(\textbf{x}) = \left[{\begin{array}{c c } {-(\textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{0})^{T}\overline{\textbf{a}}_{0}^{\wedge}}&{1} \newline {-(\textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{1})^{T}\overline{\textbf{a}}_{1}^{\wedge}}&{1} \newline {\vdots}&{\vdots} \newline {-(\textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{n-1})^{T}\overline{\textbf{a}}_{n-1}^{\wedge}}&{1} \end{array}}\right] \end{equation}\]
和n×1残差矩阵\(F(\textbf{x})\):
\[\begin{equation} \label{eq:mag30} F(\textbf{x}) = \left[{\begin{array}{c} {k - \overline{\textbf{a}}_{0}^{T} \textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{0}} \newline {k - \overline{\textbf{a}}_{1}^{T} \textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{1}} \newline {\vdots} \newline {k - \overline{\textbf{a}}_{n-1}^{T} \textbf{R}(\boldsymbol{ \phi }) \overline{\textbf{h}}_{n-1}} \end{array}}\right] \end{equation}\]
高斯-牛顿优化方法的算法流程如下:
通过步骤1,我们获得磁力计的误差模型参数\(\textbf{A}\)和\(\textbf{b}\)。根据\(\eqref{eq:mag7}\),可以将带误差的磁力计原始测量值\(\textbf{h}\)转换为真实的地磁值\(\textbf{h}'\)。
通过步骤2,我们获得地磁计坐标系与加速度计坐标系之间的旋转关系\(\textbf{R}\), 并且根据公式\(\eqref{eq:mag25}\),将地磁向量\(\textbf{h}'\),对齐到加速度坐标系下,\(\textbf{h}^{a}\)为最终标定的结果。
开源代码:https://github.com/HanjieLuo/drone/tree/master/Client/magnetometer_calibration
罗汉杰. 磁力计数据的处理方法和装置[P]. 中国专利: CN115327452A, 2022.11.11.
1 | brew install node |
1 | node -v |
1 | npm install -g hexo-cli |
1 | npm info hexo-cli version |
在Blog
文件夹下初始化Hexo:
1 | cd Blog |
进入带有package.json
文件的Hexo文件夹
1 | npm update |
在Blog
文件夹下:
1 | npm install hexo-theme-next@latest |
修改Blog/_config.yml
文件:
1 | theme: next |
测试:
1 | hexo clean |
浏览器打开http://localhost:4000
。
1 | hexo -v |
在Hexo中有两份主要的配置文件,其名称都是_config.yml
。
其中,一份位于站点根目录下,主要包含Hexo本身的配置;另一份位于主题目录下/node_modules/hexo-theme-next/_config.yml
,这份配置由主题作者提供,主要用于配置主题相关的选项。为了描述方便,在以下说明中,将前者称为站点配置文件
,
后者称为主题配置文件
。
在主题配置文件
文件/node_modules/hexo-theme-next/_config.yml
中修改:
1 | scheme: Pisces |
1 | language: en |
1 | # Usage: `Key: /link/ || icon` |
手动创建页面tags:
1 | hexo new page "tags" |
修改Blog/source/tags/index.md
:
1 | --- |
1 | hexo new page "categories" |
修改Blog/source/categories/index.md
:
1 | --- |
手动创建页面categories:
1 | hexo new page "categories" |
修改Blog/source/categories/index.md
:
1 | --- |
手动创建页面about:
1 | hexo new page "about" |
修改Blog/source/about/index.md
:
1 | --- |
1 | sidebar: |
放置在source/images/
目录下,配置为:avatar: /images/avatar.png
。
1 | # Sidebar Avatar |
1 | # Google Analytics |
1 | social: |
1 | disqus: |
1 | codeblock: |
1 | # Show Views / Visitors of the website / page with busuanzi. |
修改hexo-theme-next/layout/_third-party/statistics/busuanzi-counter.njk
文件为如下内容:
1 | {%- if theme.busuanzi_count.enable %} |
本地显示的数字是随机的,部署到服务器上面就好了。
1 | footer: |
1 | npm install hexo-generator-searchdb |
Blog\_config.yml
添加:
1 | search: |
修改/node_modules/hexo-theme-next/_config.yml
:
1 | # Local search |
1 | brew install pandoc |
1 | # Math Formulas Render Support |
1 | vendors: |
准备一张260x260以上大的图片:
用软件转换成svg格式,改名为logo.svg
。在realfavicongenerator或者websiteplanet(It
allows to create favicons from pictures that are up to 5 MB. thanks to
Virgy)上生成favicon_package
包,包括favicon-16x16-next.png
(由favicon-16x16.png
改名),favicon-32x32-next.png
(由favicon-32x32.png
改名),apple-touch-icon-next.png
(由apple-touch-icon.png
改名)。将以上4张图片复制到Blog/node_modules/hexo-theme-next/source/images/
进行替换。
在站点配置文件
文件_config.yml
中修改:
1 | title: Hanjie's Blog |
1 | # URL |
文章的Formatter
:
1 | title: Mac上安装和配置Hexo博客 |
1 | # Writing |
1 | index_generator: |
可以通过将markdown渲染器替换为hexo-renderer-markdown-it
,使得支持footnote功能6。必须要先卸载原先的渲染器,然后安装:
1 | npm un hexo-renderer-marked --save |
然后在网站\_config.yml
文件中添加:
1 | markdown: |
然后发现每一条footnote间都有一行间隔。想要去掉的话,可以在/Blogs//Users/luohanjie/Workspace/Web/Blog/node_modules/hexo-theme-next/source/css/_common/components/post/post-footer.styl
中添加:
1 | .footnote-item p { |
hexo-renderer-markdown-it
还支持很多其他的功能,具体可以到官网了解。
The html setting defines whether or not HTML content inside the document should be escaped or passed to the final result.
1 | markdown: |
1 | npm install --save hexo-pdf |
在主题配置文件
文件/node_modules/hexo-theme-next/_config.yml
中修改:
1 | pdf: |
使用:
1 | # Normal PDF |
修改/node_modules/hexo-theme-next/_config.yml
:
1 | font: |
编辑主题的Blog/node_modules/hexo-theme-next/source/css/_variables/base.styl
文件:
1 | // Font size |
1 | npm install hexo-generator-sitemap --save |
使用Git Hook
自动部署到vps上。
服务器上,创建git用户并且赋予权限:
1 | adduser git |
1 | # User privilege specification |
1 | chmod 440 /etc/sudoers |
本地Mac上,查看密钥(没有的话需要创建一个):
1 | ls -al ~/.ssh |
创建钥匙密钥:
1 | cd ~/.ssh |
1 | Host * |
1 | ssh-add -K ~/.ssh/id_rsa |
复制公匙:
1 | pbcopy < ~/.ssh/id_rsa.pub |
服务器上:
1 | cd /home/git //切换到git用户目录 |
1 | chmod 700 /home/git |
1 | nano /etc/ssh/sshd_config |
1 | // 取消这些注释 |
1 | sudo /etc/init.d/ssh restart |
关闭git用户的shell权限,设置后git用户可以通过ssh正常使用git服务,但无法登录shell:
1 | nano /etc/passwd |
1 | git:x:1001:1001:,,,:/home/git:/bin/bash 改成 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell |
服务器上:
1 | apt-get install git |
修改/home/git/blog.git
目录的用户组权限为git:git
:
1 | sudo chown git:git -R /home/git/.ssh |
本地Mac上测试:
1 | ssh -v git@ip |
在本地编辑Markdown文章,然后使用Git推送到VPS的Git仓库。Git Hooks实际上就是当Git仓库收到最新的push时,将Git仓库接受到的内容复制到VPS上的网站目录内。相当于完成了手动将public文件夹复制到VPS的网站根目录里的操作。
建立网站根目录:
1 | cd /home/git |
创建post-receive文件:
1 | cd /home/git/blog.git/hooks //切换到hooks目录下 |
1 | #!/bin/bash |
1 | chmod +x post-receive |
服务器上:
1 | sudo apt-get install nginx |
写入:
1 | server { |
由于nginx的运行用户没有权限访问网站所在的目录,检查:
1 | /etc/nginx/nginx.conf |
可以将user的值改为git
。
重启:
1 | service nginx restart |
1 | apt install ufw |
允许80端口:
1 | ufw allow 80 |
1 | Rule added |
本地Blog
文件夹下:
1 | npm install hexo-deployer-git --save |
在站点配置文件
文件_config.yml
中修改:
1 | deploy: |
1 | git clone ssh://git@ip:port/home/git/blog.git |
1 | hexo clean |
https://hexo.io/zh-cn/docs/↩︎
https://dandyxu.me/Hexo/How-to-update-Hexo-and-Hexo-theme-properly/↩︎
http://theme-next.iissnan.com/getting-started.html↩︎
https://israynotarray.com/hexo/20201101/60919/↩︎
https://github.com/theme-next/hexo-theme-next/blob/master/docs/zh-CN/MATH.md↩︎
https://github.com/hexojs/hexo-renderer-markdown-it↩︎
https://www.eula.club/搭建Hexo静态博客并使用Git部署到VPS.html↩︎