C++,Python 论文复现:使用单位四元数求解对齐轨迹的 Sim3

参考文献: Closed-form solution of absolute orientation using unit quaternions

在 SLAM 中, 轨迹会因为因为起始位姿、尺度设定的不同而不同

在轨迹形状大致相同时, 可以求取一个相似变换使得两个轨迹尽可能重合

给定两个分别具有 n n n 个空间点的轨迹, 分别定义为:
r l ∈ R n × 3 , r r ∈ R n × 3 r_l \in \mathbb{R}^{n \times 3}, r_r \in \mathbb{R}^{n \times 3} rlRn×3,rrRn×3

有相似变换 Sim3 ( s R , t ) \text{Sim3}(sR, t) Sim3(sR,t) 使得下式的和方差最小, 并使轨迹两个轨迹对齐:
SSE = ∑ i = 1 n ∣ ∣ s R ( r l , i ) + t − r r , i ∣ ∣ 2 \text{SSE} = \sum_{i=1}^n||sR(r_{l, i}) + t - r_{r, i}||^2 SSE=i=1n∣∣sR(rl,i)+trr,i2

平移向量

首先,计算两个轨迹的质心,并分别对两个轨迹零均值化:
r l ′ = r l − r l ˉ , r l ˉ ∈ R 3 r r ′ = r r − r r ˉ , r r ˉ ∈ R 3 t ′ = t + s R ( r l ˉ ) − r r ˉ SSE = ∑ i = 1 n ∣ ∣ s R ( r l , i ′ ) + t ′ − r r , i ′ ∣ ∣ 2 = ∑ i = 1 n ∣ ∣ s R ( r l , i ′ ) − r r , i ′ ∣ ∣ 2 + 2 t ′ ∑ i = 1 n ( s R ( r l , i ′ ) − r r , i ′ ) + n ∣ ∣ t ′ ∣ ∣ 2 r'_l = r_l - \bar{r_l}, \bar{r_l} \in \mathbb{R}^{3} \\ r'_r = r_r - \bar{r_r}, \bar{r_r} \in \mathbb{R}^{3} \\ t'= t + sR(\bar{r_l}) - \bar{r_r} \\ \text{SSE} = \sum_{i=1}^n||sR(r'_{l, i}) + t' - r'_{r, i}||^2 \\ = \sum_{i=1}^n ||sR(r'_{l, i}) - r'_{r, i}||^2 + 2t'\sum_{i=1}^n(sR(r'_{l, i}) - r'_{r, i}) + n||t'||^2 rl=rlrlˉ,rlˉR3rr=rrrrˉ,rrˉR3t=t+sR(rlˉ)rrˉSSE=i=1n∣∣sR(rl,i)+trr,i2=i=1n∣∣sR(rl,i)rr,i2+2ti=1n(sR(rl,i)rr,i)+n∣∣t2

零均值点经过线性变换后,其均值依然为零,即 ∑ i = 1 n s R ( r l , i ′ ) = 0 \sum_{i=1}^n sR(r'_{l, i}) = 0 i=1nsR(rl,i)=0, 所以第二项为 0:
SSE = ∑ i = 1 n ∣ ∣ s R ( r l , i ′ ) − r r , i ′ ∣ ∣ 2 + n ∣ ∣ t ′ ∣ ∣ 2 \text{SSE} = \sum_{i=1}^n ||sR(r'_{l, i}) - r'_{r, i}||^2 + n||t'||^2 SSE=i=1n∣∣sR(rl,i)rr,i2+n∣∣t2

第一项只与 s , R s, R s,R 有关, 第二项只与 t ′ t' t 有关。令第二项为 0, 解得平移向量:
t = r r ˉ − s R ( r l ˉ ) t = \bar{r_r} - sR(\bar{r_l}) t=rrˉsR(rlˉ)

其中只有 s , R s, R s,R 是未知量, 后续代入数值即可

尺度因子

接上文, 继续对 SSE \text{SSE} SSE 进行简化和分解 (点经旋转后模长不变, 即 ∣ ∣ R ( r ) ∣ ∣ 2 = ∣ ∣ r ∣ ∣ 2 ||R(r)||^2 = ||r||^2 ∣∣R(r)2=∣∣r2):
S l = ∑ i = 1 n ∣ ∣ R ( r l , i ′ ) ∣ ∣ 2 = ∑ i = 1 n ∣ ∣ r l , i ′ ∣ ∣ 2 S r = ∑ i = 1 n ∣ ∣ r r , i ′ ∣ ∣ 2 D = ∑ i = 1 n r r , i ′ ⋅ R ( r l , i ′ ) SSE = ∑ i = 1 n ∣ ∣ s R ( r l , i ′ ) − r r , i ′ ∣ ∣ 2 = s 2 S l − 2 s D + S r = s ( s S l − 2 D + 1 s S r ) = s ( s S l − 1 s S r ) 2 + 2 s ( S l S r − D ) S_l = \sum_{i=1}^n||R(r'_{l, i})||^2 = \sum_{i=1}^n||r'_{l, i}||^2 \\ S_r = \sum_{i=1}^n||r'_{r, i}||^2 \\ D = \sum_{i=1}^n r'_{r, i} \cdot R(r'_{l, i}) \\ \text{SSE} = \sum_{i=1}^n ||sR(r'_{l, i}) - r'_{r, i}||^2 = s^2 S_l - 2sD + S_r \\ = s(s S_l - 2D + \frac{1}{s} S_r) = s(\sqrt{s S_l} - \sqrt{\frac{1}{s} S_r})^2 + 2s(\sqrt{S_l S_r} - D) Sl=i=1n∣∣R(rl,i)2=i=1n∣∣rl,i2Sr=i=1n∣∣rr,i2D=i=1nrr,iR(rl,i)SSE=i=1n∣∣sR(rl,i)rr,i2=s2Sl2sD+Sr=s(sSl2D+s1Sr)=s(sSl s1Sr )2+2s(SlSr D)

令第一项 s S l − 1 s S r = 0 \sqrt{s S_l} - \sqrt{\frac{1}{s} S_r} = 0 sSl s1Sr =0, 可解得尺度因子 (表达式中所有数值均为已知量):
s = S r S l = ∑ i = 1 n ∣ ∣ r r , i ′ ∣ ∣ 2 ∑ i = 1 n ∣ ∣ r l , i ′ ∣ ∣ 2 s = \sqrt{\frac{S_r}{S_l}} = \sqrt{\frac{\sum_{i=1}^n||r'_{r, i}||^2}{\sum_{i=1}^n||r'_{l, i}||^2}} s=SlSr =i=1n∣∣rl,i2i=1n∣∣rr,i2

单位四元数

由于 S l , S r S_l, S_r Sl,Sr 已知为定值, 最小化 SSE \text{SSE} SSE 等价于最大化 D D D:
maximize : D = ∑ i = 1 n r r , i ′ ⋅ R ( r l , i ′ ) \text{maximize}: D = \sum_{i=1}^n r'_{r, i} \cdot R(r'_{l, i}) maximize:D=i=1nrr,iR(rl,i)

为了解决这个问题, 引入四元数进行化简, 首先利用 q ˙ , r ˙ ∈ R 4 × 1 \dot{q}, \dot{r} \in \mathbb{R}^{4 \times 1} q˙,r˙R4×1 对部分性质进行说明:
q ˙ = [ w x y z ] q ˙ ∗ = [ w − x − y − z ] \dot{q} = \left[ \begin{matrix} w & x & y & z \end{matrix} \right] \\ \dot{q}^* = \left[ \begin{matrix} w & -x & -y & -z \end{matrix} \right] q˙=[wxyz]q˙=[wxyz]

两个四元数之间的相乘, 可以等价为一个 4×4 矩阵和一个长度为 4 的向量之间的叉乘:
q ˙ r ˙ = Q r ˙ = [ w − x − y − z x w − z y y z w − x z − y x w ] r ˙ r ˙ q ˙ = Q ˉ r ˙ = [ w − x − y − z x w z − y y − z w x z y − x w ] r ˙ \dot{q} \dot{r} = Q\dot{r} = \left[ \begin{matrix} w & -x & -y & -z \\ x & w & -z & y \\ y & z & w & -x \\ z & -y & x & w \end{matrix} \right] \dot{r}\\ \dot{r} \dot{q} = \bar{Q} \dot{r} = \left[ \begin{matrix} w & -x & -y & -z \\ x & w & z & -y \\ y & -z & w & x \\ z & y & -x & w \end{matrix} \right] \dot{r} q˙r˙=Qr˙= wxyzxwzyyzwxzyxw r˙r˙q˙=Qˉr˙= wxyzxwzyyzwxzyxw r˙

Q , Q ˉ Q, \bar{Q} Q,Qˉ 为正交矩阵, 四元数 q ˙ \dot{q} q˙ 的共轭 q ˙ ∗ \dot{q}^* q˙ 则分别对应 Q T , Q ˉ T Q^T, \bar{Q}^T QT,QˉT:
q ˙ r ˙ q ˙ ∗ = ( Q r ˙ ) q ˙ ∗ = Q ˉ T Q r ˙ = [ A 11 A 22 A 23 A 24 A 32 A 33 A 34 A 42 A 43 A 44 ] r ˙ \dot{q} \dot{r} \dot{q}^* = (Q \dot{r}) \dot{q}^* = \bar{Q}^TQ \dot{r} = \left[ \begin{matrix} A_{11} \\ & A_{22} & A_{23} & A_{24} \\ & A_{32} & A_{33} & A_{34} \\ & A_{42} & A_{43} & A_{44} \end{matrix} \right] \dot{r} q˙r˙q˙=(Qr˙)q˙=QˉTQr˙= A11A22A32A42A23A33A43A24A34A44 r˙

如果四元数 r ˙ \dot{r} r˙ 为纯虚数 (即 w = 0 w=0 w=0, 看作空间点), 则 q ˙ r ˙ q ˙ ∗ \dot{q} \dot{r} \dot{q}^* q˙r˙q˙ 也为纯虚数 (看作旋转), 将 D D D 等价为:
maximize : D = ∑ i = 1 n q ˙ r ˙ l , i q ˙ ∗ ⋅ r ˙ r , i = ∑ i = 1 n ( Q ˉ T Q r ˙ l , i ) T r ˙ r , i = ∑ i = 1 n ( r ˙ l , i T Q T ) ( Q ˉ r ˙ r , i ) = ∑ i = 1 n ( R ˉ l , i q ˙ ) T ( R r , i q ˙ ) = q ˙ T ( ∑ i = 1 n R ˉ l , i T R r , i ) q ˙ = q ˙ T N q ˙ \text{maximize}: D = \sum_{i=1}^n \dot{q} \dot{r}_{l, i} \dot{q}^* \cdot \dot{r}_{r, i} = \sum_{i=1}^n (\bar{Q}^T Q \dot{r}_{l, i})^T \dot{r}_{r, i} \\ = \sum_{i=1}^n (\dot{r}_{l, i}^T Q^T) (\bar{Q} \dot{r}_{r, i}) = \sum_{i=1}^n (\bar{R}_{l, i} \dot{q})^T (R_{r, i} \dot{q}) \\ = \dot{q}^T (\sum_{i=1}^n \bar{R}_{l, i}^T R_{r, i}) \dot{q} = \dot{q}^T N \dot{q} maximize:D=i=1nq˙r˙l,iq˙r˙r,i=i=1n(QˉTQr˙l,i)Tr˙r,i=i=1n(r˙l,iTQT)(Qˉr˙r,i)=i=1n(Rˉl,iq˙)T(Rr,iq˙)=q˙T(i=1nRˉl,iTRr,i)q˙=q˙TNq˙

为了更快地计算 N N N, 定义查找表:
LUT = [ S x x S x y S x z S y x S y y S y z S z x S z y S z z ] S x x = ∑ i = 1 n x l , i ′ x r , i ′ , S x y = ∑ i = 1 n x l , i ′ y r , i ′ N = ∑ i = 1 n R ˉ l , i T R r , i = [ S x x + S y y + S z z S y z − S z y S z x − S x z S x y − S y x S y z − S z y S x x − S y y − S z z S x y + S y x S z x + S x z S z x − S x z S x y + S y x − S x x + S y y − S z z S y z + S z y S x y − S y x S z x + S x z S y z + S z y − S x x − S y y + S z z ] \text{LUT} = \left[ \begin{matrix} S_{xx} & S_{xy} & S_{xz} \\ S_{yx} & S_{yy} & S_{yz} \\ S_{zx} & S_{zy} & S_{zz} \end{matrix} \right] \\ S_{xx} = \sum_{i=1}^n x'_{l, i} x'_{r, i}, S_{xy} = \sum_{i=1}^n x'_{l, i} y'_{r, i} \\ N = \sum_{i=1}^n \bar{R}_{l, i}^T R_{r, i} = \left[ \begin{matrix} S_{xx} + S_{yy} + S_{zz} & S_{yz} - S_{zy} & S_{zx} - S_{xz} & S_{xy} - S_{yx} \\ S_{yz} - S_{zy} & S_{xx} - S_{yy} - S_{zz} & S_{xy} + S_{yx} & S_{zx} + S_{xz} \\ S_{zx} - S_{xz} & S_{xy} + S_{yx} & -S_{xx} + S_{yy} - S_{zz} & S_{yz} + S_{zy} \\ S_{xy} - S_{yx} & S_{zx} + S_{xz} & S_{yz} + S_{zy} & -S_{xx} - S_{yy} + S_{zz} \end{matrix} \right] LUT= SxxSyxSzxSxySyySzySxzSyzSzz Sxx=i=1nxl,ixr,i,Sxy=i=1nxl,iyr,iN=i=1nRˉl,iTRr,i= Sxx+Syy+SzzSyzSzySzxSxzSxySyxSyzSzySxxSyySzzSxy+SyxSzx+SxzSzxSxzSxy+SyxSxx+SyySzzSyz+SzySxySyxSzx+SxzSyz+SzySxxSyy+Szz

N N N 是个对称阵, 在特征值分解后可以得到 4 个特征向量 (单位向量), 而且:
x T N x = λ x^T N x = \lambda xTNx=λ

所以, 最大特征值所对应的特征向量即为使 D D D 最大的单位四元数 q ˙ \dot{q} q˙, 根据以下公式可求得旋转矩阵:
R = ( Q ˉ T Q ) 2 : 4 , 2 : 4 R = (\bar{Q}^TQ)_{2:4, 2:4} R=(QˉTQ)2:4,2:4

C++ 实现

Sophus::Sim3f align_trajectory(const std::vector<Eigen::Vector3f> &pts1,const std::vector<Eigen::Vector3f> &pts2) {assert(pts1.size() == pts2.size());int n = pts1.size();// 计算质心Eigen::Vector3d centroid1 = Eigen::Vector3d::Zero(), centroid2 = Eigen::Vector3d::Zero();for (int i = 0; i < n; ++i) {Eigen::Vector3d p1 = pts1[i].cast<double>(), p2 = pts2[i].cast<double>();centroid1 += p1;centroid2 += p2;}centroid1 /= n;centroid2 /= n;// 零均值化, 计算尺度因子、lutEigen::Matrix3<long double> lut = Eigen::Matrix3<long double>::Zero();long double Sl = 0, Sr = 0;for (int i = 0; i < n; ++i) {Eigen::Vector3d p1 = pts1[i].cast<double>() - centroid1, p2 = pts2[i].cast<double>() - centroid2;// 如果 pts 数值较大, 可能会溢出lut += (p1 * p2.transpose()).cast<long double>();Sl += p1.squaredNorm();Sr += p2.squaredNorm();}lut /= n;double Sxx = lut(0, 0), Sxy = lut(0, 1), Sxz = lut(0, 2),Syx = lut(1, 0), Syy = lut(1, 1), Syz = lut(1, 2),Szx = lut(2, 0), Szy = lut(2, 1), Szz = lut(2, 2);double s = std::sqrt(Sr / Sl);// 单位四元数Eigen::Matrix4d N;N << (Sxx + Syy + Szz) / 2, Syz - Szy, Szx - Sxz, Sxy - Syx,0, (Sxx - Syy - Szz) / 2, Syx + Sxy, Szx + Sxz,0, 0, (-Sxx + Syy - Szz) / 2, Szy + Syz,0, 0, 0, (-Sxx - Syy + Szz) / 2;N += N.transpose().eval();Eigen::SelfAdjointEigenSolver<Eigen::Matrix4d> eig(N);Eigen::Vector4d q = eig.eigenvectors().col(3);// 代入数值float w = q[0], x = q[1], y = q[2], z = q[3];Eigen::Matrix3f R;R << w * w + x * x - y * y - z * z, -2 * w * z + 2 * x * y, 2 * w * y + 2 * x * z,2 * w * z + 2 * x * y, w * w - x * x + y * y - z * z, -2 * w * x + 2 * y * z,-2 * w * y + 2 * x * z, 2 * w * x + 2 * y * z, w * w - x * x - y * y + z * z;Eigen::Vector3f t = centroid2.cast<float>() - s * R * centroid1.cast<float>();return Sophus::Sim3f(s, Eigen::Quaternionf(R), t);
}

Python 实现

import numpy as np
from scipy.spatial import transformSO3 = transform.Rotation  # 特殊正交群def align_trajectory(pts1: np.ndarray, pts2: np.ndarray):""" Closed-form solution of absolute orientation using unit quaternions """assert pts1.ndim == 2 and pts1.shape[1] == 3 and pts1.shape == pts2.shapepts1, pts2 = map(np.float64, (pts1, pts2))# 尺度因子centroid1, centroid2 = pts1.mean(axis=0), pts2.mean(axis=0)pts1, pts2 = pts1 - centroid1, pts2 - centroid2s = np.sqrt(np.square(pts2).sum() / np.square(pts1).sum())# 单位四元数Sxx, Sxy, Sxz, Syx, Syy, Syz, Szx, Szy, Szz = (pts1.T @ pts2).flatten()sumn = np.array([[(Sxx + Syy + Szz) / 2, Syz - Szy, Szx - Sxz, Sxy - Syx],[0, (Sxx - Syy - Szz) / 2, Syx + Sxy, Szx + Sxz],[0, 0, (- Sxx + Syy - Szz) / 2, Szy + Syz],[0, 0, 0, (- Sxx - Syy + Szz) / 2]])sumn += sumn.Teig_val, eig_vec = np.linalg.eig(sumn)w, x, y, z = eig_vec[:, eig_val.argmax()]# 代入数值R = SO3.from_matrix([[w ** 2 + x ** 2 - y ** 2 - z ** 2, -2 * w * z + 2 * x * y, 2 * w * y + 2 * x * z],[2 * w * z + 2 * x * y, w ** 2 - x ** 2 + y ** 2 - z ** 2, -2 * w * x + 2 * y * z],[-2 * w * y + 2 * x * z, 2 * w * x + 2 * y * z, w ** 2 - x ** 2 - y ** 2 + z ** 2]])t = centroid2 - s * R.as_matrix() @ centroid1return s, R, tif __name__ == "__main__":s = 2.5R = SO3.from_quat([0.8006, 0.1601, 0.3202, 0.4804]).as_matrix()t = np.array([0.1, 0.2, 0.3])pts1 = np.random.uniform(-1, 1, (100, 3))pts2 = (s * R @ pts1.T).T + ts, R, t = align_trajectory(pts1, pts2)e = (s * R.as_matrix() @ pts1.T).T + t - pts2print(np.square(e).sum())print(s, R.as_quat(), t)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

C语言——初识结构体定义与使用

C语言中的结构体&#xff08;Struct&#xff09;是一种复合数据类型&#xff0c;它允许你将不同类型的数据项组合成一个单一的类型。结构体在C语言中非常有用&#xff0c;特别是在需要处理复杂数据时&#xff0c;比如存储一个人的姓名、年龄、地址等信息时&#xff0c;使用结构…

回调函数简易笔记

定义 回调函数:用户手动定义了,但是没有手动调用,最终这个方法被系统/库/框架进行调用了… 举例 C语言 函数指针,主要有两个用途. 作为回调函数实现转移表 降低代码的复杂程度 java 数据结构 优先级队列(堆) 必须先定义好对象的"比较规则" Comparable compare…

2836. 在传球游戏中最大化函数值

Powered by:NEFU AB-IN Link 文章目录 2836. 在传球游戏中最大化函数值题意思路代码 2836. 在传球游戏中最大化函数值 题意 给你一个长度为 n 下标从 0 开始的整数数组 receiver 和一个整数 k 。 总共有 n 名玩家&#xff0c;玩家 编号 互不相同&#xff0c;且为 [0, n - 1…

韦东山嵌入式linux系列-异常与中断的概念及处理流程

1 中断的引入 一些概念&#xff1a; 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运…

RuoYi-Vue-Plus(动态添加移除数据源)

一、添加数据 private final DynamicRoutingDataSource dynamicRoutingDataSource;private final DefaultDataSourceCreator dataSourceCreator;//添加一个dynamic的数据源@GetMapping("createDynamic")public void createDynamic() {DataSourceProperty property =…

数据结构第二讲:顺序表

数据结构第二讲&#xff1a;顺序表 1.线性表2.什么是顺序表3. 静态顺序表4.动态顺序表4.1顺序表基础4.2顺序表的初始化4.3顺序表的销毁4.4顺序表的尾插4.5顺序表的头插4.6顺序表的尾删4.7顺序表的头删4.8顺序表在指定位置之前插入数据4.9顺序表删除指定位置的数据4.10顺序表查找…

JNPF全新V5.0版本!重磅升级——全局优化篇

尊敬的JNPF用户们&#xff1a; 我们非常高兴地宣布&#xff0c;经过团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本&#xff01;这一版本的更新发布&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是…

Visual stdio code 运行C项目环境搭建

参考 [1]VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;_visual studio code c配置-CSDN博客 [2]最新VS code配置C/C环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake_vscode launch.json如何配置-CSDN博客 先装visual stdi…

【高频面试题】java实现堆排序算法

目录 1.堆排序算法原理 1&#xff09;构建初始堆 2&#xff09;堆调整与排序 3&#xff09;时间复杂度 2.java代码实现&#xff08;可运行&#xff09; 1.堆排序算法原理 1&#xff09;构建初始堆 将待排序的数组元素构建成一个最大堆&#xff08;或最小堆&#xff09; …

谷歌搜索提取工具

谷歌搜索提取工具是指能够帮助用户从谷歌搜索引擎中提取所需信息的工具或插件。这些工具通常具有强大的数据抓取和分析能力&#xff0c;能够自动化地收集和处理搜索结果中的数据&#xff0c;从而为用户提供更加便捷和高效的信息获取方式。文本介绍专业工具<大镜山谷歌搜索大…

了解LR(逻辑回归)一

逻辑回归&#xff1a;一种强大的分类模型 逻辑回归&#xff08;Logistic Regression&#xff0c;简称LR&#xff09;是一种在统计学和机器学习中广泛应用的分类模型&#xff0c;尽管其名称中包含“回归”二字&#xff0c;但实际上它主要用于处理分类问题&#xff0c;特别是二分…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

el-table列的显示与隐藏

需求&#xff1a;实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑&#xff0c;和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段&#xff0c;并且 当表无数据时 提示不能 显示隐藏 …

Flink-CDC解析(第47天)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. CDC 概述1.1 什么是CDC&#xff1f;1.2 CDC的实现机制1) 基于主动查询的 CDC&#xff1a;2) 基于事件接收CDC&#xff1a; 前言 本文主要概述了Flink-CDC. …

双笼转子三相感应电动机的瞬态分析(3):定子绕组短接制动过程仿真分析

目录: 1. 概述 2. 定子绕组短接制动时端电压约束条件 3. 定子绕组短接制动的仿真研究 4. 结论 5. 参考文献 1.概述 制动是电机传动系统的重要问题之一,在工业生产中为了提高效率,许多生产机械都要求快速制动,实现准确停车,因此,对各种制动方法进行深入研究具有重要的…

人工智能驱动的光学检测技术可阻止假冒芯片

欢迎关注GZH《光场视觉》 在过去的60年里&#xff0c;半导体行业已经蓬勃发展&#xff0c;成为了一个价值5000亿美元的全球市场。然而&#xff0c;这个行业正面临着两大挑战&#xff1a;新芯片的严重短缺和假冒芯片的激增。这两个问题不仅带来了巨大的故障风险&#xff0c;还导…

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.

解决方案 1.打开Edit Configurations&#xff0c;进去编辑&#xff0c;如下&#xff1a; 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

FastAPI 请求和响应

FastAPI 请求和响应 FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,与 Python 3.6+ 类型提示一起使用。它基于标准 Python 类型提示,使得开发过程既快速又简单。在 FastAPI 中,请求和响应的处理是非常直观和高效的。本文将详细介绍 FastAPI 中的请求和响应…