double RPerror(const Swarm::Pose & p_drone_old_in_new, const Swarm::Pose & drone_pose_old, const Swarm::Pose & drone_pose_now) { Swarm::Pose DP_old_to_new_6d = Swarm::Pose::DeltaPose(p_drone_old_in_new, drone_pose_now, false); Swarm::Pose Prediect_new_in_old_Pose = drone_pose_old * DP_old_to_new_6d; auto AttNew_in_old = Prediect_new_in_old_Pose.att().normalized(); auto AttNew_in_new = drone_pose_now.att().normalized(); auto dyaw = quat2eulers(AttNew_in_new).z() - quat2eulers(AttNew_in_old).z(); AttNew_in_old = Eigen::AngleAxisd(dyaw, Eigen::Vector3d::UnitZ())*AttNew_in_old; auto RPerr = (quat2eulers(AttNew_in_old) - quat2eulers(AttNew_in_new)).norm(); // std::cout << "New In Old" << quat2eulers(AttNew_in_old) << std::endl; // std::cout << "New In New" << quat2eulers(AttNew_in_new); // std::cout << "Estimate RP error" << (quat2eulers(AttNew_in_old) - quat2eulers(AttNew_in_new))*57.3 << std::endl; // std::cout << "Estimate RP error2" << quat2eulers( (AttNew_in_old.inverse()*AttNew_in_new).normalized())*57.3 << std::endl; return RPerr; } 请结合之前的代码,帮我看看真个代码是在做什么?
时间: 2025-03-12 21:16:17 浏览: 32
<think>好的,我现在需要仔细分析用户提供的第二个代码函数`RPerror`,并结合之前解析过的`DeltaPose`函数来理解整个代码的功能。用户希望知道这段代码在做什么,需要结合之前的分析。
首先,我需要回顾之前的`DeltaPose`函数。根据之前的解析,`DeltaPose`计算两个位姿之间的相对变换,分为两种模式:完整三维变换和仅考虑偏航角。它返回的是相对于参考系a的位姿差。
现在看新的函数`RPerror`,它的参数是三个Pose对象:`p_drone_old_in_new`、`drone_pose_old`和`drone_pose_now`。返回的是一个double类型的误差值。
函数内部步骤:
1. 调用`DeltaPose(p_drone_old_in_new, drone_pose_now, false)`得到`DP_old_to_new_6d`。这里`use_yaw_only`设为false,所以是完整三维变换。
2. 计算`Prediect_new_in_old_Pose`为`drone_pose_old * DP_old_to_new_6d`。这里可能是在将相对变换应用到旧位姿上,预测新的位姿在旧坐标系中的表示?
3. 对姿态进行归一化处理,获取`AttNew_in_old`和`AttNew_in_new`。
4. 计算两者的偏航角差`dyaw`,然后调整`AttNew_in_old`绕Z轴旋转这个差值,使得两者的偏航角一致。
5. 最后计算调整后的姿态欧拉角差的范数作为误差`RPerr`。
可能的目的是比较预测姿态和实际姿态在横滚(roll)和俯仰(pitch)上的差异,排除偏航角的影响。因为用户提到函数名是RPerror,可能是指Roll和Pitch的误差。
需要验证每一步的数学意义:
- `DeltaPose`在这里的作用是计算`p_drone_old_in_new`到`drone_pose_now`的相对位姿,即从旧的坐标系到新坐标系的变换?
- 然后将这个相对变换应用到`drone_pose_old`上,得到预测的新位姿在旧坐标系中的表达。
- 比较预测姿态和实际姿态在调整偏航后的横滚和俯仰差异。
可能存在坐标系的转换问题,比如如何将预测的位姿与实际位姿进行比较,特别是在不同的坐标系下。调整偏航角可能是为了消除偏航对横滚和俯仰的影响,从而单独测量这两者的误差。
需要确认`drone_pose_old`和`drone_pose_now`的含义,可能代表无人机在旧时刻和新时刻的位姿。`p_drone_old_in_new`可能是旧位姿在新坐标系中的表示,或者某种变换关系。
可能的应用场景是无人机位姿估计的误差评估,特别是在多机器人系统中,评估姿态估计的准确性,排除偏航角的影响,专注于横滚和俯仰的误差。
需要注意代码中的注释部分,虽然被注释掉了,但打印了欧拉角差乘以57.3(弧度转角度),说明误差是以弧度为单位的范数。
总结思考步骤:
1. 确定函数的目标:计算横滚和俯仰的误差。
2. 分析各步骤如何通过坐标变换和偏航调整来隔离这两个轴的误差。
3. 结合`DeltaPose`的功能,理解整个变换过程。
4. 验证数学运算的正确性,特别是四元数旋转和欧拉角转换。</think>这段代码主要用于计算无人机姿态估计中**横滚(Roll)和俯仰(Pitch)的误差**,其核心逻辑可分为以下五个关键步骤:
---
#### 一、函数输入解析
$$ RPerror(\text{Pose}\ p_{old\_in\_new},\ \text{Pose}\ pose_{old},\ \text{Pose}\ pose_{now}) $$
- **参数含义**:
- `p_drone_old_in_new`:旧时刻位姿在当前坐标系中的估计值
- `drone_pose_old`:旧时刻的实际位姿
- `drone_pose_now`:新时刻的实际位姿
- **输出**:Roll/Pitch欧拉角的综合误差(L2范数)
---
#### 二、核心计算流程
1. **相对位姿计算**(调用之前分析的DeltaPose)
```cpp
Swarm::Pose DP_old_to_new_6d = DeltaPose(p_drone_old_in_new, drone_pose_now, false);
```
- 计算`p_drone_old_in_new`到`drone_pose_now`的**完整三维相对位姿**
- 数学表达:$\Delta Pose = R_{old}^{-1}(p_{now} - p_{old})$
2. **位姿预测**
```cpp
Swarm::Pose Prediect_new_in_old_Pose = drone_pose_old * DP_old_to_new_6d;
```
- 将相对位姿$\Delta Pose$作用于旧位姿,**预测当前时刻在旧坐标系中的位姿**
- 等价于:$T_{pred} = T_{old} \cdot \Delta T$
3. **偏航角对齐**
```cpp
auto dyaw = quat2eulers(AttNew_in_new).z() - quat2eulers(AttNew_in_old).z();
AttNew_in_old = AngleAxisd(dyaw, Vector3d::UnitZ()) * AttNew_in_old;
```
- 提取预测姿态与实际姿态的**偏航角差**$\Delta \psi$
- 将预测姿态绕Z轴旋转$\Delta \psi$,**消除偏航角差异对RP误差的影响**
4. **误差计算**
```cpp
auto RPerr = (quat2eulers(AttNew_in_old) - quat2eulers(AttNew_in_new)).norm();
```
- 计算对齐后的预测姿态与实际姿态的**欧拉角差**
- 取三维向量的L2范数(实际只关注Roll/Pitch分量)
---
#### 三、数学原理图解
$$ \begin{aligned}
\text{误差计算流程} & \\
& \downarrow \text{消除偏航影响} \\
RPerr &= \sqrt{(\phi_{pred}-\phi_{real})^2 + (\theta_{pred}-\theta_{real})^2}
\end{aligned} $$
---
#### 四、典型应用场景
1. **多无人机协同定位**:评估位姿预测算法在横滚/俯仰方向的精度
2. **传感器融合验证**:对比IMU与视觉估计的RP误差
3. **控制反馈**:为飞控系统提供姿态修正量
---
#### 五、关键实现细节
1. **偏航对齐必要性**:通过绕Z轴旋转消除偏航差异,确保误差计算**仅反映RP轴偏差**
2. **归一化操作**:`.normalized()`保证四元数旋转有效性
3. **误差单位**:返回值为弧度制,注释中`*57.3`显示调试时转换为角度制
4. **等效计算**:注释中给出了通过四元数逆运算计算误差的替代方法
阅读全文
相关推荐


















