ICME| RRDNet《ZERO-SHOT RESTORATION OF UNDEREXPOSED IMAGES VIA ROBUST RETINEX DECOMPOS》论文超详细解读(翻译+精读)

前言

RRDNet同济大学在2020年提出来的一种新的三分支全卷积神经网络,认为图像由三部分构成:光照分量反射分量噪声分量。在没有pair对的情况下实现低光图像增强,通过对loss进行迭代来有效估计出噪声和恢复光照。

之前因为相对来说比较久远了,以及我尝试别的方法已经有了较好的结果,所以一直没研究这个算法。前几天心血来潮拜读了一下论文,发现这个思路非常新奇,代码实现过程有点苦涩(下篇再说),今天先来一起读一下这篇论文吧!

学习资料:


目录

前言

ABSTRACT—摘要

翻译

精读

1. INTRODUCTION—引言

翻译

精读

2. RELATEDWORK AND OUR CONTRIBUTIONS—相关工作和本文的贡献

2.1. Related work—相关工作

翻译 

精读

2.2. Our contributions—本文的贡献

翻译

精读

3. RRDNET: A ROBUST RETINEX DECOMPOSITION NETWORK FOR UNDEREXPOSED IMAGE RESTORATION—RRDNET:一种用于曝光不足图像恢复的鲁棒Retinex分解网络

3.1. Three-branch decomposition and restoration—三分支分解与恢复

翻译

精读

3.2. Loss function for zero-shot learning—零触发学习的损失函数

翻译

精读

4. EXPERIMENTAL RESULTS—实验结果

翻译 

精读

5. CONCLUSION—结论

翻译

精读

ABSTRACT—摘要

翻译

曝光不足的图像通常会遭受严重的质量下降,例如黑暗中的可见度差和潜在噪声。大多数以前的曝光不足图像恢复方法都会忽略噪声并在拉伸对比度期间将其放大。我们明确地预测噪声以实现去噪的目标,同时恢复曝光不足的图像。具体来说,提出了一种新颖的三分支卷积神经网络,即 RRDNet(Robust Retinex Decomposition Network 的缩写),将输入图像分解为三个分量,即光照、反射和噪声。作为一个特定于图像的网络,RRDNet 不需要任何先前的图像示例或先前的训练。相反,RRDNet 的权重将通过迭代最小化专门设计的损失函数的零样本方案进行更新。这种损失函数旨在评估测试图像的当前分解并指导噪声估计。实验表明,RRDNet 可以实现稳健的校正,具有整体自然度和令人愉悦的视觉质量。为了使结果可重现,源代码已在 代码 上公开。     


精读

现存问题:

  曝光不足的图像由于能见度差和黑暗中的潜在噪声,通常会出现严重的质量下降

以往方法的不足:

  忽略了噪声,并在拉伸对比过程中放大了噪声。

本文方法:

  • 描述了一种名为RRDNet的新型三分支卷积神经网络。
  • 通过分解出噪声去除噪声分量,以达到去噪的目的,同时恢复曝光不足的图像。
  • RRDNet不需要成对的数据集作为数据驱动。 通过迭代最小化一个特殊设计的损失函数来更新。

1. INTRODUCTION—引言

翻译

 恶劣的光照条件可能导致捕获的图像出现严重的质量下降,比如整体暗淡或逆光区域表面细节难以辨认。此外,缺乏充足光线,相机传感器获取的图像通常包含潜在噪声。如何开发一种有效和稳健的恢复工具来处理曝光不足图像仍然是一个未解决的问题。

在曝光不足 图像增强中一个重要但被忽视的问题是在拉伸图像对比度的同时如何抑制暗区域的噪声。在经典的 Retinex 模型中 [1],这个领域中最广泛应用的范例之一 [2, 3, 4],一幅图像 I 可以被分解为光照 S 和反射 R:

其中 x 表示像素的空间位置。然而,这个经典的 Retinex 模型忽略了在曝光不足图像中不可避免的噪声。因此,在 [5] 中提出的鲁棒 Retinex 模型引入了一个噪声项 N,如下所示:

在这项工作中,我们采用了方程(2)中的鲁棒 Retinex 模型,并引入了一种零镜头方案,即 RRDNet,将输入图像分解为三个组件,光照、反射和噪声。RRDNet 是一种新颖的三分支 CNN(卷积神经网络[6]),可以明确地估计输入图像的三个组件。在分解之后,光照可以被调整,噪声可以被去除,最终生成一个具有高可见度的无噪声输出。图1中给出了几个示例。

大多数用于曝光不足图像恢复的最先进方法都是基于学习的,但数据驱动的训练方案极大地限制了它们模型的泛化能力。在我们的方案中,RRDNet 在测试时进行训练,这意味着其权重通过迭代最小化一个特别设计的损失函数进行更新。这样的损失函数被设计用来评估输入图像当前的分解,并确保恢复输出的质量。与此同时,它可以指导RRDNet根据光照分布估计噪声,从而进行去噪以避免噪声在暗处被放大。这样的零镜头方案不需要任何先前的图像示例或先前的训练。


精读

研究背景:

光照条件差会导致拍摄图像的质量严重下降,例如整体黑暗或背光区域中难以辨认的表面细节。

在光线不足的情况下,相机传感器获取的图像通常包含潜在噪声。

本文主要研究问题:

如何在拉伸图像对比度的同时抑制暗区域的噪声

经典的 Retinex 模型:

  • S:照度
  • R:反射率
  • x:表示像素的空间位置

不足:忽略了噪声

鲁棒型Retinex模型:

本文方法:

  1. 使用了鲁棒型Retinex模型方程,并引入了一种名为RRDNet零样本方案,是一种新型的三分支卷积神经网络。
  2. RRDNet分解输入图像为光照、反射率和噪声,明确估计这三个部分处理曝光不足图像。
  3. 设计的损失函数评估输入图像分解指导RRDNet估计噪声、防止噪声放大
  4. 这种零样本方案不需要先前的图像示例或训练,提高了模型的泛化能力和适用性。
Fig. 1.RRDNet的恢复结果。左列中的图像是不同场景中的曝光不足图像,而右列中的图像是恢复结果。

2. RELATEDWORK AND OUR CONTRIBUTIONS—相关工作和本文的贡献

2.1. Related work—相关工作

翻译 

在过去的十年里,曝光不足图像的恢复一直是一个长期存在的问题,在这方面取得了很大进展。在这里,我们将它们分为两类,即普通方法和数据驱动方法,根据是否使用了监督学习。

普通方法。传统的图像增强方法,比如基于直方图的方法,可以用于增强曝光不足的图像,但在大多数情况下,它们的有效性相当有限。Yuan 和 Sun 提出了一种使用 S 曲线色调映射的自动曝光校正方法。Zhang 等人设计了一种无监督方案来估计输入的最佳拟合 S 曲线。这些方法中采用的参数化 S 曲线可能会压缩中间色调,使输出图像显得过于平坦和不自然。早期基于 Retinex 理论的尝试主要是去除光照并直接提取反射作为增强结果。随后在这一领域的工作主要集中在光照的估计和调整上。这些基于 Retinex 的方法假设输入图像是无噪声的,并放大了暗区域的潜在噪声。Fu 等人同时估计了光照和反射。Li 等人进一步将噪声项引入到经典的 Retinex 分解中。这两种方法通过对反射或噪声施加约束来抑制噪声。不同的是,我们将光照引导应用于噪声估计,从而在暗部进行更有针对性的去噪处理。

数据驱动的方法。黑匣子模型大致遵循以下流程:首先收集或合成包含输入输出对的数据集,然后找到映射关系或基于该数据集训练一个曝光校正模型。基于Retinex理论,Shen等人提出了基于多尺度Retinex理论的MSR-net,并在合成成对图像上对其进行训练。Wang等人在他们构建的新数据集上训练了一个光照映射估计网络,其中包括曝光不足的图像和专家修饰的参考图像。Wei等人和Zhang等人在包含低/正常光照图像对的数据集上训练了分解网络。这些基于监督学习的方法的性能高度依赖于训练数据集,尽管构建包含各种类型光照和内容的数据集本身就是一个具有挑战性的任务。


精读

Plain methods—早期的方法

基于直方图的方法

  • 使用 S 曲线色调映射的自动曝光校正方法
  • 无监督方案来估计输入的最佳拟合 S 曲线

不足:参数化 S 曲线可能导致色调压缩,输出图像过于平坦且不自然。

Retinex

不足:放大了暗区的潜在噪声或引进新的噪声

Datadriven methods—数据驱动的方法

黑盒模型

MSR-net

不足:监督学习方法性能高度依赖于训练数据集,构建包含各种照明和内容类型的数据集是具有挑战性的任务。


2.2. Our contributions—本文的贡献

翻译

使用基于学习的方法是一种近期的趋势。然而,数据驱动方法在泛化能力上存在潜在的缺点。曝光不足图像中暗区域的潜在噪声也是大多数先前方法忽视的问题。我们的贡献总结如下:

  • 我们提出了一种针对曝光不足图像恢复的图像特定 CNN,即 RRDNet。RRDNet不需要先前的训练;相反,它依赖于单个输入图像的内部优化,确保其在各种拍摄场景和光照条件下具有泛化能力。
  • RRDNet具有三个分支,可以明确地预测输入图像的光照、反射和噪声。这使得调整光照并完全去除噪声以防止在对比度拉伸后噪声被放大成为可能。
  • 在RRDNet中,为了优化输入图像的分解,提出了一种新的损失函数。这种损失函数可以确保恢复的结果具有丰富的纹理细节。同时,它可以根据光照分布引导RRDNet专注于暗区域的噪声估计,因此执行更有针对性的去噪处理,以避免在暗部放大噪声。
  • 由于RRDNet的CNN结构,我们的方法可以学习Retinex分解的表示。随着处理图像的增多,RRDNet收敛到最佳分解的迭代次数在面对未知图像时减少,表明了基于无监督学习的方案的优越性。

精读

本文主要贡献:

  1. 提出了RRDNet不需要提前训练,相反,权重更新依赖于输入单张图像的内部优化,这样确保了在不同场景和多种光照条件下的泛化能力(generalization capability)。
  2. RRDNet有三个分支,可以预测光照(illumination)、反射率(reflectance)和噪声(noise),最终能够调整光照和移除噪声,避免在增加图像对比度的时候放大噪声。
  3. RRDNet设计了自己的损失函数,这样的损失函数既保证了恢复的图像有丰富的纹理细节又降低了噪声。
  4. 随着处理的图像的增多,RRDNet再遇到未处理过的图像的收敛速度增快,这显示了无监督学习的优势。

3. RRDNET: A ROBUST RETINEX DECOMPOSITION NETWORK FOR UNDEREXPOSED IMAGE RESTORATION—RRDNET:一种用于曝光不足图像恢复的鲁棒Retinex分解网络

3.1. Three-branch decomposition and restoration—三分支分解与恢复

翻译

 在这一部分,我们将介绍使用RRDNet进行曝光不足图像恢复的提议方法的工作流程,将在第3.1节中呈现;然后在第3.2节中,我们将介绍为零样本学习设计的RRDNet的损失函数的详细内容。

3.1. 三分支分解和恢复  
给定一个曝光不足的图像,根据鲁棒的Retinex模型[5]进行分解。具体而言,一个曝光不足的图像I可以分解为三个部分,反射率R、光照S和噪声N,如下所示:

需要注意的是,为了简化起见,通常假定三个颜色通道具有相同的光照[2]。图2展示了提议方法的工作流程,包括两个阶段,即分解和恢复。在分解阶段,RRDNet是一个三分支的全卷积神经网络,其结构如图2所示。这三个分支用于分别估计反射率、光照和噪声。反射率和光照的分支在末端采用sigmoid层以确保强度落在[0, 1]范围内。不同之处在于,为了更好地适应加性噪声,噪声分支的最后一层使用tanh层,可以使噪声值落在[-1, 1]范围内。图2中显示的噪声图是为了可视化而进行了归一化。经过最小化损失函数的迭代(损失函数的详细信息将在第3.2节中介绍)和更新RRDNet的权重之后,输入图像的最终分解就可以生成。  
在恢复阶段,通过Gamma变换调整光照分量,如下所示:

其中γ是预定义的参数。根据方程(3),可以计算出无噪声的反射率为:

结合调整后的光照和无噪声的反射率,最终的恢复结果可以计算为:


精读

图2.使用RRDNet进行曝光不足图像恢复的方法的工作流程。RRDNet的三个分支分别用于估计反射率、光照和噪声(噪声图经过归一化以实现可视化)。通过Gamma变换调整光照图,计算无噪声反射率。联合收割机将调整后的光照和恢复后的反射率进行组合,生成恢复后的输出。

如图2所示,工作流程分为两个阶段,分别是分解和恢复。

分解阶段:

经过分解,图像I分为三个部分,反射图R光照S噪声N,为了简化,三个通道的光照都是相同的。

反射率和照明的分支以sigmoid层结束,以确保强度落入[0,1]。

恢复阶段:

通过γ来调整光照分量,这一参数是预定义的。

去噪的反射图可以用下图公式计算:

最终的去噪的恢复的图像为:


3.2. Loss function for zero-shot learning—零触发学习的损失函数

翻译

要更新 RRDNet 的权重,我们需要一个损失函数来评估当前的分解,并引导网络生成更准确的分量。我们设计了一个损失函数 L,它包含三个部分,如下所示:

其中 Lr、Lt 和 Ln 是损失的组成部分,λt 和 λn 是相应的权重因子。

Retinex 重建损失。图像的分解成分必须首先满足根据方程重建图像的要求。 (3)、以保证合理分解。在 Retinex 理论中,R、G、B 通道强度的最大值 S0(x) = max c∈{R,G,B} Ic(x) 通常用作光照的初始估计,反射率通过图像与其光照图之间的像素分割[3, 4]。这里我们选择这种方式作为对光照和反射率的约束。 Retinex 重建损失可以表示为,

其中 I 表示输入图像,重建图像计算为 (R · S + N )。 ‖X‖1 计算 X 中所有条目的绝对值之和。l1-norm 用于指导网络生成锐利的照明和反射率。

纹理增强损失。在自然图像中,通常一个表面的光照强度是相对平坦的。分段平滑照明图有助于增强暗区的纹理。这是因为当相邻像素的强度接近时,它们的对比度会在除以相同的照度值(落在[0, 1])时被放大。为了保证纹理得到增强,设计了一个平滑度损失项 Lt 为:

其中 x 和 y 表示水平和垂直方向。 wx 和 wy 是确保估计的地图分段平滑的权重。受 RTV 损失 [26] 的启发,权重项应与梯度成反比。在这里,我们将权重设计为,

其中 G 是高斯滤波器,◦ 表示卷积算子,Ig 是输入的灰度版本。 wy 可以用类似的方式计算。

照明引导的噪声估计损失。在曝光不足的图像恢复任务中,暗区的对比度将被拉伸以提高其可见度。但与此同时,隐藏在黑暗中的噪音也会被放大。因此,有必要抑制噪声,尤其是在暗区。幸运的是,图像的光照图已经被估计出来,可以用来指导图像去噪任务,并且可以通过加权帮助 RRDNet 专注于估计黑暗中的噪声。光照引导的噪声估计损失项设计为,

其中‖X‖F 表示矩阵 X 的 Frobenius 范数,wn 和 wr 是光照引导的权重项,设计为,

其中 normalize 表示最小-最大归一化。我们为噪声估计设计的损失函数基于两个考虑。首先,需要限制噪声图中的值范围。其次,可以通过平滑反射分量来抑制噪声。与光照平滑不同,它侧重于水平梯度和垂直梯度都较小的点,确保对真实噪声点而不是边缘进行平滑处理。为了估计黑暗中的噪声,以上两项通过光照图进行加权和限制。

图 3 给出了一个分解示例。通过结合这三个损失项,最终的 RRDNet 可以收敛,将图像 (a) 分解为局部平滑光照图 (c)、无噪声和纹理丰富的反射率 (d),以及噪声集中在黑暗区域 (e)。 (b) 是恢复结果。


精读

本文一个损失函数L来评估当前的分解,并引导网络生成更准确的组件:

它由三部分组成,其中Lr,Lt和Ln是损失分量,λt和λn是相应的权重因子。

Retinex reconstruction loss—Retinex重建损失

图像的分解组件必须满足Robust Retinex的公式,将RGB三个通道中最大强度值S的初始值,在此基础上约束反射图和噪声。

Texture enhancement loss—纹理增强损失

通过平滑的光照图可以增强暗区域的纹理细节,公式中x和y是水平和垂直方向,Wx和Wy是确保图像平滑的权重参数。

权重与梯度呈反比,梯度大的地方权重小,梯度小的地方权重大,因此将高斯滤波G放在分母,这里公式中的I是输入图像转换成的灰度图,Wy的计算方式和Wx的相同。

Illumination-guided noise estimation loss—光照引导的噪声估计损失

为了增加图像的清晰度增加了图像的对比度,与此同时,图像的噪声也被放大,出于以下两点限制噪声:

  1. 噪声的范围需要被限制。
  2. 噪声可以平滑的反射图限制。

照明引导噪声估计损失项被设计为:

其中,wn和wr是照明引导权重项并且被设计为:

其中normalize表示最小-最大归一化。

图3.RRDNet的分解和恢复结果。(a)是输入曝光不足图像,(c)-(e)分别是其估计的照度、反射率和归一化噪声图,以及(b)是恢复输出。

分解实例如图3所示。结合这三个损失项,最终的RRDNet可以收敛,将图像(a)分解为局部光滑的光照贴图(c),无噪声且纹理丰富的反射率(d),噪声集中在暗区(e)。(b)为恢复结果。


4. EXPERIMENTAL RESULTS—实验结果

翻译 

我们进行了实验,以定量和定性地比较 RRDNet 与最先进的曝光不足图像恢复方法的性能。此外,进行消融研究以评估 RRDNet 损失函数的每个组件的影响。在所有实验中,我们设置 γ = 0.4,λt = 1 和 λn = 5000。实验在工作站上进行3.0GHz Intel Core i7-5960X CPU 和 Nvidia GeForce GTX 980Ti GPU。

数据集和比较方法。实验在四个曝光不足的图像数据集上进行,包括 MEF [24]、LIME [3]、DICM [25] 和 NPE [2]。 RRDNet 与五个曝光不足的图像恢复器进行了比较,包括 1) Yuan 和 Sun 的 [11]、2) NPE [2]、3) RetinexNet [22]、4) Zhang 等人的 [4] 和 5) ExCNet [12]。

客观评价。与[4,5]类似,我们采用了两种常用的无参考图像质量评估指标,NIQE(自然图像质量评估器)[27]和CPCQI(基于色彩丰富度的基于补丁的对比质量指数)[28],来评估欠曝光图像恢复方法。NIQE评估了恢复结果的整体自然度。CPCQI从三个方面评估了输入和增强输出之间的增强效果,包括平均强度、信号强度和信号结构分量。较低的NIQE值大致对应较高的整体自然度,而较大的CPCQI值则表示较高的对比度。在四个数据集上报告了结果,RRDNet在每个数据集上都可以获得较低的NIQE值和较高的CPCQI值。NPE [2]、RetinexNet [22]和ExCNet [12]的性能在自然度和对比度上均不如RRDNet,尤其是RetinexNet。因为RetinexNet基于监督学习,其泛化能力在未见测试集上显著降低。袁和孙的方法可以生成具有很高自然度的结果,但对比度相对较低。张等人的方法可以生成高对比度的输出。然而,由于它不抑制噪声,因此黑暗中的噪声被放大,导致结果图像看起来不自然。

视觉质量。图 4 和图 5 分别比较了噪声图像和曝光不足图像的恢复结果。图 4 和图 5 中的(c)、(d)和(e)由于过度增强,在暗区有严重的噪点,使它们显得不自然。至于两个图中的(b)和(f),它们的细节存在对比度失真。这是由于他们依赖的 S 曲线调整模型,它压缩了中间色调,使纹理看起来过于平坦。这些观察结果与表 1 中的客观评价一致。相比之下,我们的方法 RRDNet 可以自然地揭示隐藏在图像暗区中的细节,同时获得没有噪声伪影的高质量输出。

消融实验。我们对 MEF 数据集进行了消融研究,通过组合不同的损失项来定量评估 RRDNet 损失函数中每个项带来的优点。结果总结在表2中。可以看出,添加纹理增强损失项和噪声估计损失项可以明显提高恢复输出的对比度和自然度。性能的逐步改进证明了每个损失项的有效性。


精读

实验设置:

  1. γ = 0.4
  2. λt = 1
  3. λn = 5000
  4. 3.0GHz Intel Core i7-5960X CPU
  5. Nvidia GeForce GTX 980Ti GPU

Datasets and compared methods—数据集和比较方法

数据集: 4个曝光不足的图像数据集:MEF、LIME、DICM和NPE

比较方法:五种曝光不足图像恢复器

Objective evaluation—客观评价

评估指标:NIQE(自然图像质量评估器)和CPCQI(基于色彩的基于补丁的对比度质量指数)

表1.竞争方法的客观评价结果。

结论:在每个数据集上,RRDNet 可以获得低 NIQE 值和高 CPCQI 值。

Visual Quality—视觉质量

图4.在嘈杂的图像上进行比较。(a)是输入图像,(B)-(g)是Yuan和Sun [11],NPE [2],3)RetinexNet [22],Zhang等人[4],ExCNet [12]和RRDNet的结果。
图5.对比曝光不足的图像。(a)是输入图像,(B)—(g)是Yuan和Sun [11],NPE [2],3)RetinexNet [22],Zhang等人[4],ExCNet [12]和RRDNet的结果。

结论:

  1. 这些观察结果与表 1 中的客观评价一致。
  2. RRDNet 可以自然地揭示隐藏在图像暗区中的细节,同时获得没有噪声伪影的高质量输出。

Ablation Study—消融实验

表2.消融实验

结论:

  1. 添加纹理增强损失项和噪声估计损失项可以明显提高恢复输出的对比度和自然度。
  2. 性能的逐步改进证明了每个损失项的有效性。

5. CONCLUSION—结论

翻译

 在这篇论文中,我们专注于欠曝光图像恢复,并提出了一种零样本方案,即RRDNet,用于执行Retinex分解和恢复。RRDNet可以明确预测输入图像的分解映射。RRDNet的权重通过迭代地最小化一个特别设计的损失函数来更新。根据分解的光照、反射和噪声分量,可以生成高可见性和无噪声的输出。在不同数据集上的实验显示出我们方法在自然度和对比度上的优越性。未来,我们将进一步探索光照分量调整的方法。


精读

  • 本文专注于曝光不足的图像恢复,提出了零样本方案,即RRDNet执行Retinex分解和恢复。
  • RRDNet能够显式预测输入图像的分解图,并通过迭代最小化专门设计的损失函数来更新权重。
  • 通过处理分解的光照、反射率和噪声分量,生成高质量、无噪声的输出。
  • 未来,我们将进一步研究照明组件的调整方法。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
ICM-42670-P芯片中的算法(Algorithm)例程代码是一段用于演示ICM-42670-P芯片在实际应用中如何使用的示例代码。该代码主要包括以下几个模块: 1. 初始化模块 该模块主要用于初始化ICM-42670-P芯片,包括设置SPI或I2C接口、配置滤波器和测量范围等参数。具体代码如下: ``` void icm42670p_algo_init(void) { /* Initialize ICM-42670-P */ icm42670p_init(); /* Set accelerometer range to +/- 8g */ icm42670p_set_acc_range(ICM42670_ACC_RANGE_8G); /* Set gyroscope range to +/- 2000dps */ icm42670p_set_gyro_range(ICM42670_GYRO_RANGE_2000DPS); /* Enable low pass filter for accelerometer and gyroscope */ icm42670p_enable_acc_lpf(ICM42670_ACC_LPF_21HZ); icm42670p_enable_gyro_lpf(ICM42670_GYRO_LPF_21HZ); } ``` 该函数首先调用了icm42670p_init()函数,初始化ICM-42670-P芯片,然后设置了加速度计和陀螺仪的测量范围,以及启用低通滤波器。 2. 数据读取模块 该模块用于读取ICM-42670-P芯片中加速度计和陀螺仪的原始数据,并进行单位转换。具体代码如下: ``` void icm42670p_algo_read_data(float *ax, float *ay, float *az, float *gx, float *gy, float *gz) { int16_t raw_ax, raw_ay, raw_az, raw_gx, raw_gy, raw_gz; /* Read accelerometer and gyroscope data */ raw_ax = icm42670p_read_acc_x(); raw_ay = icm42670p_read_acc_y(); raw_az = icm42670p_read_acc_z(); raw_gx = icm42670p_read_gyro_x(); raw_gy = icm42670p_read_gyro_y(); raw_gz = icm42670p_read_gyro_z(); /* Convert raw data to physical units */ *ax = raw_ax * ICM42670_ACC_SENSITIVITY / 1000.0; *ay = raw_ay * ICM42670_ACC_SENSITIVITY / 1000.0; *az = raw_az * ICM42670_ACC_SENSITIVITY / 1000.0; *gx = raw_gx * ICM42670_GYRO_SENSITIVITY / 1000.0; *gy = raw_gy * ICM42670_GYRO_SENSITIVITY / 1000.0; *gz = raw_gz * ICM42670_GYRO_SENSITIVITY / 1000.0; } ``` 该函数首先调用icm42670p_read_acc_x()等函数读取加速度计和陀螺仪的原始数据,然后将其转换为物理单位(重力加速度和弧度/秒)。 3. 姿态解算模块 该模块主要用于计算物体在X、Y、Z三个轴上的倾斜角度。具体代码如下: ``` void icm42670p_algo_calc_angles(float ax, float ay, float az, float gx, float gy, float gz, float *roll, float *pitch, float *yaw) { float roll_rad, pitch_rad, yaw_rad; /* Calculate roll, pitch and yaw angles */ roll_rad = atan2(ay, az); pitch_rad = atan2(-ax, sqrt(ay*ay + az*az)); yaw_rad = atan2(gx, sqrt(gy*gy + gz*gz)); /* Convert angles to degrees */ *roll = roll_rad * 180 / PI; *pitch = pitch_rad * 180 / PI; *yaw = yaw_rad * 180 / PI; } ``` 该函数使用了三个公式,将原始数据转换为倾斜角度,并进行单位转换。 4. 主函数模块 主函数模块中调用了上述三个模块,实现了ICM-42670-P芯片的数据读取和姿态解算。具体代码如下: ``` int main(void) { float ax, ay, az, gx, gy, gz; float roll, pitch, yaw; /* Initialize algorithm */ icm42670p_algo_init(); while (1) { /* Read data from ICM-42670-P */ icm42670p_algo_read_data(&ax, &ay, &az, &gx, &gy, &gz); /* Calculate roll, pitch and yaw angles */ icm42670p_algo_calc_angles(ax, ay, az, gx, gy, gz, &roll, &pitch, &yaw); /* Output results */ printf("roll=%.2f, pitch=%.2f, yaw=%.2f\n", roll, pitch, yaw); } return 0; } ``` 该函数使用了一个while循环,不断读取ICM-42670-P芯片中的数据,并计算出倾斜角度,最后将结果输出到终端或其他外设上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路人贾'ω'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值