鱼眼镜头的成像原理到畸变矫正(完整版)

2023-05-16

  最近刚接触鱼眼相机,发现网上资料还是比较零散的,于是把搜罗到的资料汇总梳理了一下。这里推荐大家直接看链接6的论文,从成像模型到畸变矫正整个过程讲的比较清楚,网上很多版本其实都是根据这两篇论文来的,而且绝大部分博客只写到了成像畸变过程,至于如何进行畸变矫正完全没有提。

  1. 摄影入门之相机镜头的分类
  2. 鱼眼镜头是怎么「鱼眼」的?
  3. 鱼眼相机成像模型
  4. 鱼眼相机成像模型学习
  5. 2004 - A generic camera calibration method for fish-eye lenses
  6. 2006 - A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses
  7. OpenCV 4.5.1 – Fisheye camera model
  8. 鱼眼摄像头标定与畸变校正(双OPENCV版本)
  9. {畸变矫正}图像去畸变opencv各种方法与matlab各种方法-联合分析(一统江湖)
  10. 【数值分析】一元方程的迭代解法
  11. 数值分析笔记整理(1)——求解方程的方法

1. 什么是鱼眼镜头

1.1 镜头分类

镜头类型特征描述
变焦镜头在一定范围内可以变换焦距、从而得到不同宽窄的视场角,不同大小的影象和不同景物范围的照相机镜头。
定焦镜头标准镜头视角在40°~45°之间,焦距长度与底片对角线长度基本相等。
广角镜头普通广角镜头镜头焦距小于底片对角线长度的镜头称为广角镜头。普通广角镜头视角在90°以内。
超广角镜头视角在90° ~ 180°之间
鱼眼镜头视角超过180°。
长焦镜头中长焦镜头长焦镜头也称为远摄镜头,焦距比底片对角线要大得多,可以把远处的景物拍得较大。视角在20°左右。
长焦镜头视角在10°左右。
超长焦镜头视角在8°以内。

  相机镜头大致上可以分为变焦镜头和定焦镜头两种。顾名思义,变焦镜头可以在一定范围内变换焦距,随之得到不同大小的视野;而定焦镜头只有一个固定的焦距,视野大小是固定的。鱼眼镜头是定焦镜头中的一种视野范围很大的镜头,视角通常大于180°。 如下图所示,在获取更大视野范围的同时,鱼眼镜头成像的畸变也更大。

1.2 鱼眼镜头和普通镜头的区别

  那么鱼眼镜头为什么可以获得比普通镜头更大的视野范围呢,他们两者之间的差别在哪?
  其实,我们平常接触的大多数镜头都可以近似看做针孔相机模型,该模型下,光线沿直线传播,像与物之间是相似的,或者更严格地用数学语言来说,像与物之间是经过了透视变换(Perspective Transform)。在透视变换下,直线经过变换仍是直线,曲线经过变换仍是曲线,两直线交点经过变换仍是两直线相交的点等。正因为投影变换保持了很多几何性质不变,所以我们看照片是能够与原场景联系起来的,照片与原场景之间存在某些相似的特性。

  从某种意义上来说,相机镜头所起的作用,就是做了一个数学变换,将物空间变换为像空间,成像平面就是在像空间内切了一刀,截取了一个平面,成为拍下的照片。
  但基于针孔相机模型的镜头存在一个缺陷——光线始终沿直线传播使得镜头难以捕捉位于边缘的物体。如下图所示,对于同样长度的红色箭头,越靠近边缘的经过镜头成像后就变得越长,而实际上我们底片的尺寸是有限的,所以极端接近边缘的物体普通的镜头就无法成像记录了。

  于是人们想到的水下的鱼。由于水的折射率比空气大,光线从空气进入水中,折射角比入射角更小,并且入射角越大,这个变小的程度也越大。由于这个特性,使得在水中向上看时,能一眼看到整个水面上的这个半球形空间,整个空间的影像都背扭曲、压缩到了一个半顶角约为48°的锥形内。

在这个锥形空间内部,是来自水面上的空间的光线,在这个锥形外部,是来自水面下景色的反射。也就是说,在水下向上看,在一个圈之外,只能看到水底的景色;所有水面上的景色,都被压缩在一个圈内,如下图所示。鱼眼镜头也是人们根据这种特性发明的,另外,鱼眼镜头的前镜片直径很短,且呈抛物状像前部凸出,与鱼的眼睛十分相似,“鱼眼镜头”因此而得名。

2. 鱼眼镜头的投影模型

  鱼眼镜头一般是由十几个不同的透镜组合而成的,如下图所示,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。

  在研究鱼眼相机成像时,可以将上面的镜头组简化为一个球面,如下图 (b) 所示, O 1 − X c Y c Z c O_1-X_cY_cZ_c O1XcYcZc是相机坐标系, O 2 − x y O_2-xy O2xy是成像平面。现实世界有一点 P P P,入射角为 θ \theta θ,如果按照普通相机的针孔相机模型,入射光线 P O 1 PO_1 PO1经过镜头后不改变路线, P 、 O 1 、 p ′ P、O_1、p' PO1p三点共线, p ′ p' p P P P的像点;但对于鱼眼相机,入射光线 P O 1 PO_1 PO1经过镜头后会发生折射,因此 P P P的像点为 p p p点,极坐标表示为 ( r , φ ) (r, \varphi) (r,φ)

  为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计,如上图 (a) 所示。根据投影函数的不同,鱼眼相机的设计模型大致能被分为五种:透视投影(即针孔相机模型)、等积投影、等距投影、体视投影、正交投影。

投影模型投影函数特征
i. 透视投影 (perspective projection) r = f tan ⁡ θ r=f\tan\theta r=ftanθ针孔相机模型
ii. 体视投影 (stereographic projection) r = 2 f tan ⁡ θ 2 r=2f\tan\frac{\theta}{2} r=2ftan2θ任何直线相交的角度,在变换后保持不变
iii. 等距投影 (equidistance projection) r = f θ r=f\theta r=fθ物体成像面上距离画面中心的距离与入射角成正比
iv. 等积投影 (equisolid angle projection) r = 2 f sin ⁡ θ 2 r=2f\sin\frac{\theta}{2} r=2fsin2θ在变换前后,物体所占的立体角大小不变
v. 正交投影 (orthogonal projection) r = f sin ⁡ θ r=f\sin\theta r=fsinθ投影畸变最大,而且最大视场角不能大于180°

3. 鱼眼镜头的成像过程

  实际的镜头因为各种原因并不会精确的符合投影模型,为了方便鱼眼相机的标定,一般取 r r r关于 θ \theta θ泰勒展开式的前5项来近似鱼眼镜头的实际投影函数: r ( θ ) ≈ k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 (1) r(\theta)\approx k_0\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9\tag{1} r(θ)k0θ+k1θ3+k2θ5+k3θ7+k4θ9(1)

  假设相机坐标系下有一点 P ( x , y , z ) P(x,y,z) P(x,y,z),点 P ( x , y , z ) P(x,y,z) P(x,y,z)如果按照针孔相机模型投影,则不存在畸变,像点为 P 0 ( a , b ) P_0(a,b) P0(a,b)不妨假设 f = 1 f=1 f=1(最终可以求得 r d r_d rd r r r的比值与 f f f无关),可求得 P 0 P_0 P0点坐标y以及入射角 θ \theta θ { a = x / z b = y / z r 2 = a 2 + b 2 θ = a t a n ( r ) (2) \left \{ \begin{aligned}a&=x/z \\ b&=y/z \\ r^2&=a^2+b^2 \\ \theta&=atan(r)\end{aligned}\right.\tag{2} abr2θ=x/z=y/z=a2+b2=atan(r)(2)
  由于畸变的存在,像点到图像中心的距离 r r r被压缩成 r d r_d rd,实际的像点位置为 p ′ ( x ′ , y ′ ) p'(x',y') p(x,y),有 ∣ O p ′ ∣ = r d , ∣ O P 0 ∣ = r |Op'|=r_d,|OP_0|=r Op=rd,OP0=r。结合等距投影函数和式(1)有: r d = f θ ≈ k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 (3) r_d=f\theta \approx k_0\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9\tag{3} rd=fθk0θ+k1θ3+k2θ5+k3θ7+k4θ9(3)因为 f = 1 f=1 f=1,且 θ d \theta_d θd的一次项系数 k 0 k_0 k0可以为1,最终可以得到OpenCV中使用的鱼眼相机模型:
r d = f ⋅ t a n θ d = θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) (4) r_d=f \cdot tan \theta_d = \theta_d=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8)\tag{4} rd=ftanθd=θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)(4)由相似三角形原理: r d r = θ d r = x ′ a = y ′ b (5) \frac{r_d}{r}=\frac{\theta_d}{r}=\frac{x'}{a}=\frac{y'}{b}\tag{5} rrd=rθd=ax=by(5)所以就求得了畸变后点 p ′ p' p的坐标为: { x ′ = θ d r a y ′ = θ d r b (6) \left \{ \begin{aligned}x'&=\frac{\theta_d}{r}a \\ y'&=\frac{\theta_d}{r}b \end{aligned}\right.\tag{6} xy=rθda=rθdb(6)最后利用相机内参将像平面的点转换到像素坐标系就得到了最终图像上的点: { u = f x x ′ + c x v = f y y ′ + c y (7) \left \{ \begin{aligned}u&=f_xx'+c_x \\ v&=f_yy'+cy\end{aligned}\right.\tag{7} {uv=fxx+cx=fyy+cy(7)

对于公式(3)的解释

  首先感谢评论区几位认真的小伙伴指出这个问题,这里我确实表示的有错误,导致不少人对公式3有误解,这里单独再拎出来解释一下。
  这里对比下面两张图一起看,左边的是论文的截图,右边是我按照自己理解画的,两者的符号表示会不太一样,不要混淆在一起。

  论文指出(左图),根据投影函数的不同,鱼眼相机的设计模型大致能被分为五种:透视投影、等积投影、等距投影、体视投影、正交投影,最常用的是等距投影模型,即 r = f θ (eq1) r=f\theta\tag{eq1} r=fθ(eq1),但投影模型这么多是不利于自动标定的,于是将上述几种投影模型统一用 r r r关于 θ \theta θ的泰勒展开式来近似表示,这么做会带来一些精度损失,但基本可以忽略: r ( θ ) = f θ ≈ k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 (eq2) r(\theta) = f\theta \approx k_0\theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9\tag{eq2} r(θ)=fθk0θ+k1θ3+k2θ5+k3θ7+k4θ9(eq2)这里 θ \theta θ是入射光线 ∣ P O 1 ∣ |PO_1| PO1和光轴的夹角,即入射角, r r r表示相机空间任意点 P P P在相机成像平面的像点 p p p距离光心的距离 ∣ O 2 p ∣ |O_2p| O2p。根据 e q 3 eq3 eq3我们能够知道,成像点到光心的距离 r r r是关于入射角 θ \theta θ的函数,但光线入射后以什么角度射出我们是难以计算的,因为鱼眼镜头是由一组透镜组成的,光线入射后的光路非常复杂,会在不同透镜间反复折射,可以看到论文的截图中入射光线经过 O 1 O_1 O1射到点 p p p的光路画的也是一条曲线。

  然后再来看看我自己画的图(右图),畸变前的像点 P 0 ( a , b ) P_0(a,b) P0(a,b)和畸变后的像点 p ′ ( x ′ , y ′ ) p'(x',y') p(x,y)到光心 O O O的距离分别为 r r r r d r_d rd。实际中我们一般知道相机空间的点 P P P坐标,如果不考虑畸变,知道相机焦距 f f f的情况下,根据出射角等于入射角,畸变点的像点 P 0 P_0 P0也很容易可以得到,所以 r r r的值也知道,根据相似三角形原理: r d r = x ′ a = y ′ b (eq3) \frac{r_d}{r}=\frac{x'}{a}=\frac{y'}{b}\tag{eq3} rrd=ax=by(eq3)从而可以求得,一般记 s c a l e = r d / r scale=r_d/r scale=rd/r: { x ′ = r d r a = s c a l e ⋅ a y ′ = r d r b = s c a l e ⋅ b (eq4) \left \{ \begin{aligned}x'&=\frac{r_d}{r}a=scale\cdot a \\ y'&=\frac{r_d}{r}b=scale\cdot b \end{aligned}\right.\tag{eq4} xy=rrda=scalea=rrdb=scaleb(eq4) k 0 = 1 k_0=1 k0=1,将 r d r_d rd代入 e q 3 eq3 eq3有: r d ≈ θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 (eq5) r_d \approx \theta+k_1\theta^3+k_2\theta^5+k_3\theta^7+k_4\theta^9\tag{eq5} rdθ+k1θ3+k2θ5+k3θ7+k4θ9(eq5)到这一步为止应该没有什么歧义,至于 k 0 k_0 k0为什么取1我暂时没找到比较官方的解释,个人感觉是为了少标定一个参数,实际上一次项系数对于整个表达式的值影响也没那么大, k 0 = 1 k_0=1 k0=1带来的精度损失靠后面高次项系数补回来就好了。然后重点来了,这也是我之前理解错的地方,如果不是评论区的小伙伴指出我就一直想当然地错下去了。
  翻阅过opencv文档的小伙伴们会发现opencv文档中是这么写的: θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) (eq6) \theta_d = \theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8)\tag{eq6} θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)(eq6)如果和上面我们推导出来的 e q 5 eq5 eq5比较,会得到 r d = θ d (eq7) r_d=\theta_d\tag{eq7} rd=θd(eq7)的结论,之前我的解释是错误的,正确理解应该是

   θ \theta θ是入射角, θ d \theta_d θd畸变后的等效折射角(不是实际的折射角), r d r_d rd θ d \theta_d θd满足 r d = f ⋅ t a n θ d r_d=f \cdot tan\theta_d rd=ftanθd,如果取等效焦距 f = 1 f=1 f=1(由eq4可以得到,畸变和相机焦距无关,仅和 s c a l e scale scale值有关,所以 f f f取多少都无所谓, f f f变了, r d r_d rd相应的也会跟着变化),就有 r d = t a n θ d r_d= tan\theta_d rd=tanθd,考虑到相机的成像CCD平面尺寸一般都是几毫米,焦距在几百毫米左右,所以相机实际成像过程中 θ d \theta_d θd是比较小的, t a n θ d tan \theta_d tanθd可以近似用 θ d \theta_d θd表示( x → 0 , t a n x = x x\rightarrow0, tanx=x x0,tanx=x),所以才有了这么一个等式 r d = θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) (eq7) r_d=\theta_d=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8)\tag{eq7} rd=θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)(eq7)  所以不管鱼眼镜头使用的什么模型,推导过程都是一样的,至于 t a n θ d tan\theta_d tanθd是否要近似成 θ d \theta_d θd,我个人觉得只要畸变参数的标定过程和解畸变过程保持一致就不会有太大问题。

  另外,本文讨论的只有径向畸变,如果考虑切向畸变的话 e q 6 eq6 eq6会有所不同。

4. 鱼眼镜头的畸变矫正

  谈畸变矫正之前先简单回顾一下畸变成像过程。
  相机坐标系存在一点 P ( x , y , z ) P(x,y,z) P(x,y,z),现在要获得该点在鱼眼相机像平面的投影,需要经过如下步骤:

Step1:根据针孔相机模型成像原理,可以求得未发生畸变时,点 P P P的像点 P 0 ( a , b ) P_0(a,b) P0(a,b),极坐标形式表示为 ( r , φ ) (r,\varphi) (r,φ),以及点 P P P的投影入射角 θ \theta θ
Step2:实际上由于畸变的存在,光线出射角 θ d ≠ θ \theta_d \neq \theta θd=θ,实际的像点为 p ′ ( x ′ , y ′ ) p'(x',y') p(x,y)
Step3:利用等距投影公式以及泰勒展开式,可以近似求得 θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) \theta_d=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8) θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)
Step4:因为 r d = θ d r_d=\theta_d rd=θd,所以点 p ′ p' p的极坐标为 ( θ d , φ ) (\theta_d,\varphi) (θd,φ),从而求得笛卡尔坐标值 x ′ = ( θ d / r ) a , y ′ = ( θ d / r ) b x'=(\theta_d/r)a,y'=(\theta_d/r)b x=(θd/r)a,y=(θd/r)b
Step5:最后根据相机内参将 p ′ p' p转换到像素坐标系: u = f x x ′ + c x , v = f y y ′ + c y u=f_xx'+c_x,v=f_yy'+c_y u=fxx+cx,v=fyy+cy

  鱼眼相机的成像过程是已知入射角 θ \theta θ求出射角 θ d \theta_d θd,而鱼眼相机的畸变矫正则是已知畸变后的像点位置 ( x ′ , y ′ ) (x',y') (x,y)求实际的入射角 θ \theta θ。由于相机参数已知,可以根据 ( x ′ , y ′ ) (x',y') (x,y)以及相机焦距求得 θ d \theta_d θd的值,所以畸变矫正的本质问题是求解关于 θ \theta θ的一元高次方程: θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) \theta_d=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8) θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)其中 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4是畸变参数,由相机标定结果提供。
  常用的求解一元高次方程的方法有二分法、不动点迭代、牛顿迭代法。这里使用牛顿迭代法求解: f ( θ ) = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) − θ d θ 0 = θ d θ n + 1 = θ n − f ( θ n ) f ′ ( θ n ) f(\theta)=\theta(1+k_1\theta^2+k_2\theta^4+k_3\theta^6+k_4\theta^8) -\theta_d \\ \theta_0=\theta_d \\ \theta_{n+1}=\theta_n-\frac{f(\theta_n)}{f'(\theta_n)} f(θ)=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)θdθ0=θdθn+1=θnf(θn)f(θn)循环迭代直到 f ( θ ) ≈ 0 f(\theta)\approx0 f(θ)0(具体精度根据需要自行设置),或达到迭代次数上限。求得 θ \theta θ之后,未畸变像点 P 0 P_0 P0到像平面中心的距离也可以求得: r = t a n ( θ ) r=tan(\theta) r=tan(θ)根据式(6)可以求得 P 0 P_0 P0的坐标: { a = r θ d x ′ b = r θ d y ′ (8) \left \{ \begin{aligned}a&=\frac{r}{\theta_d}x' \\ b &=\frac{r}{\theta_d}y' \end{aligned}\right.\tag{8} ab=θdrx=θdry(8)最后利用相机内参将 P 0 ( a , b ) P_0(a, b) P0(a,b)转换到像素坐标系即可得到未畸变的像素坐标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

鱼眼镜头的成像原理到畸变矫正(完整版) 的相关文章

  • ArduPilot飞行前检查——PreArm解析

    ArduPilot飞行前检查 主要包括两个部分 1 初始化中遥控器输入检查 xff1b 2 1Hz解锁前检查 附 xff1a 显示地面站信息 参考文章 xff1a Ardupilot Pre Arm安全检查程序分析 1 初始化中遥控器输入检
  • ROS_PX4_gazebo学习记录

    在官方程序上 xff08 PX4 wiki上为offboard起飞到2m高度 xff09 进行更改 xff0c 实现首先起飞到固定点 xff08 x 61 1 y 61 2 z 61 5 然后按照给定角度飞行 补充 xff1a 最终实现效果
  • Rospy初次使用记录-定点飞行

    由于接触到pytorch xff0c 所以用python完成与ROS的通信 xff0c 下面例子为从程序中摘出来的一部分 xff0c 用到了ROS消息的订阅与发布 xff0c 服务的通信 xff0c 可以作为参考使用 xff1a span
  • 四旋翼飞行器数学模型

    最近接触到四旋翼无人机的位置控制方法 xff0c 就又了解了一下四旋翼飞机的数学模型 xff0c 现总结如下 xff1a 位置环 xff08 均定义在惯性坐标系下 xff09 P
  • 基于ROS与optitrack的四旋翼飞机开发流程

    本文将一些注意点记录下来 xff0c 适合于开发调试 xff1a 目前只是分段调试通了 xff0c 带后续联合开发的时候在来补充还有没有什么注意点 xff08 过程也算麻烦 xff0c 也算不麻烦 xff09 xff1b xff32 xff
  • ROS_调试(三) 打印输出

    ROS INFO 采用类似C语言的形式 ROS DEBUG ROS DEBUG STREAM 采用类似C 43 43 语言的形式打印 ROS DEBUG STREAM NAMED ROS DEBUG STREAM THROTTLE NAME
  • px4调试bug--添加mavlink_log_info信息

    写在前面的话 有一阵子没有看px4的代码了 由于项目和论文的需要 又要接触这个 其中又遇到一些新的问题 找到了一些新的解决方法 故在此记录一下 总是在几种飞控代码之间跳来跳去 没有认真研究一个 有点遗憾 PX4的代码调试还没有找到什么好的方
  • APM,PX4之开源协议

    APM代码设计的是GPLv3协议 xff0c PX4代码采用的是BSD协议 从上图可以看出 xff0c ardupilot的代码是允许别人修改 xff0c 但是修改之后必须开源且采用相同的许可证书 而PX4代码则是允许别人修改 xff0c
  • C语言实现mavlink库与px4通信仿真

    参照网址 http mavlink io en mavgen c 首先从github上下载对应的C uart interface example 对应的github仓库网址为https github com mavlink c uart i
  • RK3308--8声道改成双声道+录音增益

    改为双声道 修改dts文件 相关路径 xff1a Y hxy RK3308 sdk 1 5 kernel arch arm64 boot dts rockchipY hxy RK3308 sdk 1 5 kernel Documentati
  • Flightmare install 安装指南

    flightmare 是ETH推出的一个用于gazebo仿真 xff0c 强化学习训练的平台 xff0c 并在github上公开了其源代码 本文主要记录在配置环境过程中出现的问题 github网址链接 https github com uz
  • matlab发送mavlink消息

    主要介绍了通过matlab脚本实现UDP发送mavlink消息 xff0c 为后面matlab计算 xff0c 与Optitrack联合调试 xff0c 控制无人机做准备 示例演示效果链接为 matlab通过UDP协议发送mavlink消息
  • apm-ros-optitrack初步尝试

    本文记录采用ArduPilot固件 xff0c 室内optitrack环境下飞行实现中遇到的一些问题 在apm mavros仿真中 xff0c 总是出现mavros state 显示 not connected 在实际的操作中 xff0c
  • APM代码调试知识点汇总

    由于项目的需要 xff0c 对ardupilot的源码进行二次开发 本文记录在二次开发中遇到的问题以及注意事项 xff1a CUAV V5 实测 apm 串口 xff0c 对于姿态数据的发送和接收在200Hz的时候 xff0c 是没有问题的
  • ardupilot之mavlink消息--从飞控发出--单向

    飞控采用mavlink消息进行数据的传输 普遍说法是 xff0c 现有的mavlink消息几乎已经涵盖了所有你的能想象到的内容 xff0c 完全可以覆盖多处需求 无奈科研总是要定义一些新鲜玩意 xff0c 所以总是有无法完全满足需求 xff
  • ardupilot之mavlink消息--飞控接收--单向

    由于项目需要 xff0c 完成一个测试demo 本次从dronekit中发送mavlink消息给飞控 xff0c 飞控接收发来的wp信息 xff0c 然后进行修改供程序使用 首先祭出测试视频 dronekit arudpilot test
  • ArduPilot 添加自定义调节参数

    实际变成操作中 xff0c 需要对ardupilot代码进行修改并添加对应的调试参数 xff0c 这样 xff0c 可以通过地面站很方便的进行修改参数 目前修改代码在parameter h中的G2类 xff0c 表示为全局的参数列表 参数类
  • Python_mavros_manual_contoller

    利用python完成mavros与PX4的通信工程 xff0c 同时也完成了对应的PX4中对应消息代码的调试查看 span class token keyword from span future span class token keyw
  • PX4 混控部分分析

    PX4的混控部分大体思路和ardupilot是一致的 更多的PX4采用的是脚本读取的形式完成其中的读取 转换以及最后的应用 首先从机型选择后 对应为toml文件 如下图所示 采用对应的px generate mixers py来自动生成对应
  • PX4 Position_Control RC_Remoter引入

    PX4飞控位置环控制中如何引入遥控器的控制量 本文基于PX4 1 12版本 相比于之前的版本 多引入了Flight Task这么一个模块 省流总结 遥控器的值通过 flight tasks update gt velocity setpoi

随机推荐

  • AS--Location specified by ndk.dir...

    问题 span class token operator span span class token class name What span went wrong span class token operator span span c
  • ros中的message filters时间同步--> 用于image和imu的结合

    转载自 xff1a https blog csdn net He3he3he article details 109643391 xff11 xff0e message filters介绍 message filters用于对齐多种传感信息
  • autoware.ai docker配置

    配置环境 xff1a Ubuntu18 04 显卡驱动 510 85 02 cuda 11 1 用了我一整天的时间 xff0c 累死了 先按照此博文操作 博文里的这一步骤我没有用 sudo apt key fingerprint 0EBFC
  • 使用libcurl发送HTTP请求的一个简单示例代码

    代码简单解释 设置header 首先要声明header的结构体变量 xff0c 然后设置对应header值 xff0c 最后将其设置到curl结构体中 span class hljs comment 声明 span CURL curl sp
  • make -C和M=的作用

    当make的目标为all时 xff0c C KDIR 指明跳转到源码目录下读取那里的Makefile xff1b M 61 PWD 表明然后返回到当前目录继续读入 执行当前的Makefile
  • docker参数详解

    1 xff1a docker参数详解 docker useage of docker D 默认false 允许调试模式 debugmode H 默认是unix var run docker sock tcp host port 来绑定 或者
  • 【星伦商学院】中小企业经济复苏公益座谈会圆满结束

    中小企业经济复苏公益座谈会 为帮助中小微企业破解难题 渡过难关 xff0c 全面推进复工复产 xff0c 6月30日 xff0c 中小企业座谈会 xff08 以下简称会议 xff09 在中国 浙江诸暨市召开 力求创新举措破解制约中小微企业用
  • 从旋转矩阵到欧拉角

    摄影测量中 xff0c R转角系统一般是以y轴为主轴 xff0c 但是在很多代码中 xff0c 发现R的定义很多 xff0c 据自己需求 工业标准中一般采用Z X Y转角系统 xff0c 先绕x旋转 xff0c 再绕y 最后是Z 即如下所示
  • Git只clone指定的分支

    默认的clone会下载远程仓库的所有分支 有时候为了避免创建多个git仓库 xff0c 想将一些资源在一个git仓库下统一管理 xff0c 这时候就会出现 xff1a git远程仓库分支很多 xff0c 但是各个分支没有多大关联 xff0c
  • Ubuntu系统无法update的解决方法

    今天安装Ubuntu系统的时候 xff0c 出现了一些状况 xff0c 首先说个自己犯的幼稚错误 首先我制作好了启动盘 xff0c 并且按着步骤安装完系统 进入系统 xff0c 我自认为输入了密码 xff0c 进入了我的账号 xff08 其
  • 什么是嵌入式AI开发?人工智能芯片指什么?STM32、树莓派、Jetson TX2、华为昇腾部署神经网络区别在哪?

    嵌入式芯片 xff1a https zhuanlan zhihu com p 449570075 芯片公司代表 xff1a https www jiqizhixin com articles 2020 01 31 9 相较于CPU GPU等
  • RK3308--固件编译

    快捷路径 相关路径 xff1a cd work hxy RK3308 sdk 1 5 添加依赖包 若编译遇到报错 xff0c 可以视报错信息 xff0c 安装对应的软件包 当时下面一大段依赖包直接添加时 xff0c 不能实现 可能是因为中间
  • ChatGPT会如何影响我们的工作生活和人力资源需求

    ChatGPT xff0c 这几天体验了一下 xff0c 确实是非常震撼 一方面是因为它的回答确实相当好 xff0c 自带一点框架逻辑 xff0c 有上下文理解能力 xff0c 可以追问 xff0c 有情商 虽然很多时候都是一些正确的废话
  • Linux设备驱动思想在STM32编程中的应用

    这几天看了一下Linux设备驱动 xff0c 发现这套思想其实也可以用在普通的单片机编程上 这种思想较好的分割了驱动层和应用层的任务 xff0c 方便分层开发 以前 xff0c 我们开发STM32驱动的时候 xff0c 会给设备写一套函数来
  • 36.【linux驱动】spi framebuffer驱动(切换并显示虚拟终端)

    1 framebuffer驱动 2 spi framebuffer驱动 3 spi framebuffer驱动 切换并显示虚拟终端 切换终端输出 接这上一节 spi framebuffer驱动实现了 xff0c 但是只有刷屏 6个虚拟终端并
  • ubuntu 移除PPA

    ubuntu 移除PPA 问题描述解决方案1 移除PPA源2 移除key3 查看那些包被替换4 从官方源下载包并替换5 测试是否替换成功 总结反思 问题描述 试图在ubuntu 20 04上安装Phalcon框架 xff0c 但是发现版本不
  • django内置的密码加密与解密

    Django 内置的User类提供了用户密码的存储 验证 修改等功能 xff0c 默认使用pbkdf2 sha256方式来存储和管理用的密码 django通过PASSWORD HASHERS来设置选择要使用的算法 xff0c 列表的第一个元
  • TF坐标变换的学习

    官方教程 xff1a http wiki ros org tf ROS中的很多软件包都需要机器人发布tf变换树 xff0c 那么什么是tf变换树呢 xff1f 抽象的来讲 xff0c 一棵tf变换树定义了不同坐标系之间的平移与旋转变换关系
  • Docker 服务端口一览

    最近研究微服务 xff0c 使用Docker来进行部署应用 说实话docker是个好东西 xff0c 只要编写好Dockerfile文件和docker compose yml文件 xff0c 便能快速启动并运行相关服务 调试过程中查看服务可
  • 鱼眼镜头的成像原理到畸变矫正(完整版)

    最近刚接触鱼眼相机 xff0c 发现网上资料还是比较零散的 xff0c 于是把搜罗到的资料汇总梳理了一下 这里推荐大家直接看链接6的论文 xff0c 从成像模型到畸变矫正整个过程讲的比较清楚 xff0c 网上很多版本其实都是根据这两篇论文来