046demo_cone_error

本文探讨了捷联惯导系统中圆锥误差的补偿与仿真,对比了等效旋转矢量优化算法与多项式拟合算法在圆锥运动下的表现,详细解析了仿真程序与误差评估方法。

工具箱版本:psins140410
圆锥误差补偿仿真程序
相关公式可以参考《惯性导航(第二版)》(秦永元)9.3节以及9.4节。


首先该搞清楚的是这部分在讲什么。
捷联惯导中姿态四元数的更新,引入了等效旋转矢量的概念,建立等效旋转矢量微分方程,即Bortz方程。
该方程的求解比较麻烦,首先通过多项式拟合、然后泰勒展开的方式求解等效旋转矢量,根据多项式的不同得到各个子样数条件下的求解方法。
前面的求解方法,由于算法存在漂移,所以对其进行优化。优化的标准就是算法的漂移最小。工具箱中等效旋转矢量的求解,就是根据这种优化的方法。
这个示例程序就是比较一下在圆锥运动下,上述两种方法计算得到的四元数与理论四元数的误差,以及两种算法的算法漂移。


文中afa为半锥角,相当于秦书中的a,程序中设计的子样数为3,采样间隔为0.01s,仿真的时间为6s。下面说一下conesimu函数。

    wm = [ -2*omega*ts*sin(afa/2)^2*ones(size(t)), ...  
           -2*sin(afa)*sin(omega*ts/2)*sin(omega*(t+ts/2)), ...
            2*sin(afa)*sin(omega*ts/2)*cos(omega*(t+ts/2))  ];

角度增量,相当于秦书中公式9.4.5,只不过公式中的h/3变为ts。接下来的四元数以及角速度也是如此。

cnscl函数在此为此进行旋转矢量的补偿。程序中比较了两种补偿,分别是常用的旋转矢量优化算法和多项式拟合算法conepolyn,后者的公式可以在秦书268页看到。另外cnscl函数还有严讲义中31页提到的“单子阳+前一周期”算法,程序中没有进行该算法的比较。

另外还有一个重要的函数conedrift,圆锥误差漂移,可参考严书35、37页。

epsilon = afa^2*(omega*ts)^(2*nn+1) * nn*factorial(nn)/(2^(nn+1)*II);
epsilon = epsilon/(nn*ts);

求解漂移角速率,见37页或参考论文经典圆锥误差补偿算法中剩余误差估计的局限性研究(资源汇总页中下载)

dphimc = cross(cm,wm(nn,:));
dphim = 2*sin(afa/2)^2*(omega*nts-sin(omega*nts)); 
epsilon(2,1) = (dphim-abs(dphimc(1)))/nts;
dphim = dphim/nts;

第一行计算的是补偿的不可交换误差,第二行计算角增量代替旋转矢量产生的理论误差,第三、四行计算未补偿的误差。


下面该说我想了一天的问题了,手动尴尬。
在程序中的绘图部分:

res(ki,:) = [q2att(q0); qq2phi(q1,q0); qq2phi(q2,q0)]';
subplot(322), plot(t,res(:,[5,8])/glv.sec), xygo('\it\phi_x\rm / \prime\prime');
subplot(324), plot(t,res(:,[6,9])/glv.sec), xygo('\it\phi_y\rm / \prime\prime');
subplot(326), plot(t,res(:,[4,7])/glv.sec), xygo('\it\phi_z\rm / \prime\prime');

q0为理论四元数,q1为优化算法计算得到的四元数,q2是多项式算法计算得到的四元数;
第一行代码q0转化为姿态角分别为俯仰角、横滚角和航向角,占据1-3列;
4-6列的输出,由于 Q b n = Q n ′ n ⊗ Q b n ′ Q_b^n=Q_{n'}^n \otimes Q_b^{n'} Qbn=QnnQbn,式中分别为理论四元数、误差四元数和计算四元数,推得 Q n ′ n = Q b n ⊗ Q n ′ b Q_{n'}^n =Q_b^n \otimes Q_{n'}^b Qnn=QbnQnb,然后将误差四元数转换为等效旋转矢量,我的问题是,按照程序中的表示方法,4-6列分别为 ϕ x , ϕ y , ϕ z \phi_x, \phi_y, \phi_z ϕx,ϕy,ϕz,这是相对于三个坐标轴zxy的失准角吗?
然而,如果把误差四元数转换为姿态角,求得的结果与转换为等效旋转矢量完全相同,但是此时却是 θ , γ , ψ \theta, \gamma, \psi θ,γ,ψ,这不是相对于xyz轴吗?
测试用的

qerr = qmul(q0, qconj(q1));
a = q2att(qerr);
b = qq2phi(q1,q0);

想了一天没想明白,可能我掉进坑了。把这个问题留在这里,方便回顾。

运行后Maximum nr of vertex attributes supported: 29 ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- E:\C++\Demo08\x64\Debug\Demo08.exe (进程 15520)已退出,代码为 3。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
10-31
Maximum nr of vertex attributes supported: 29 ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM Vertex shader(s) failed to link, fragment shader(s) failed to link. Vertex link error: INVALID_OPERATION. ERROR: error(#97) No program main found fragment link error: INVALID_OPERATION. ERROR: error(#97) No program main found -- --------------------------------------------------- -- E:\C++\Demo08\x64\Debug\Demo08.exe (进程 25408)已退出,代码为 -1。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
最新发布
10-31
报错控制台输出的所有内容 [traffic_cone.cpp] /usr/include/c++/9/ext/new_allocator.h:146:25:error: expected '}' at end of input [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] 146 {:new((void *)_p)__Up(std::forward<_Args).....);) /usr/include/c++/9/ext/new_allocator.h:59:1: note: to matech this'{ [traffic_cone.cpp] [traffic_cone.cpp] 59 [matrix_manager.cpp] ...result is up-to-date. [traffic_cone.cpp] /usr/include/c++/9/ext/new_allocator.h:In member function 'void__gnu_cxx::new_allocator<_Tp>::cconstruct(_Up*, _Args&& ...)' [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] /usr/include/c++/9/ext/new_allocator.h:146:28: error: expeected';'at end of input 146 | {:new((void *)_p)__Up(std::forward<_Args>(_args)...);} [traffic_cone.cpp] /usr/include/c++/9/ext/new_allocator.h:146:25: error: expected '}' at end of input [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] {::new((void*)__p)__Up(std::forward<_Args>(_args)...);} /usr/include/c++/9/ext/new_allocator.h: At global scope: 146 /usr/include/c++/9/ext/new_allocator.h:146:28: error: expected ";'at end of input 146 |{:new((void* _p)_Up(std::forward<_Args>(_args)...);} [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] [traffic_cone.cpp] /usr/include/c++/9/ext/new_allocator.h:146:25:error: expected "}'atendofinput {::new((void*)__p)__Up(std::forward<_Args>(_args))...);} /usr/include/c++/9/ext/new_allocator.h:40:62: note: to match this'{' 146 [traffic_cone.cpp] [traffic_cone.cpp] 40 namespace _gnu_cxx _GLIBCXX_VISIBILITY(default) [traffic cone.cpp]
10-01
<think>我们正在处理一个C++编译错误,错误发生在标准库文件`/usr/include/c++/9/ext/new_allocator.h`中,报错信息是期望输入结尾有`}`和`;`。这种错误通常是由于用户代码中的语法错误(比如缺少分号、括号不匹配等)导致的,因为编译器在解析用户代码时出错,可能会影响后续标准库的解析。 根据之前的讨论,我们已经在`traffic_cone.cpp`文件中进行了检查,但问题可能还需要更深入的分析。 步骤: 1. 检查`traffic_cone.cpp`文件中是否有语法错误,特别是: - 检查所有的括号(包括{}、()、[])是否匹配。 - 检查所有的语句是否以分号结束。 - 检查宏定义是否正确(比如#ifdef和#endif是否匹配)。 - 检查类或结构体定义后是否有分号。 2. 确保包含的头文件没有错误。有时候,一个头文件中的错误会导致包含它的源文件出错,并且错误可能被传递到标准库。 3. 由于错误信息指向标准库头文件,但实际上问题可能出在用户代码中,因此我们需要检查`traffic_cone.cpp`中在包含标准库头文件之前的所有代码。 4. 使用以下方法进行隔离: - 注释掉部分代码,逐步缩小范围,直到找到错误的位置。 5. 如果代码很长,可以尝试使用编译器的预处理输出功能,查看预处理后的代码是否在标准库内容之前有语法错误。 6. 另外,考虑是否是Parasoft的插桩导致的问题?如果是,那么可能需要调整插桩配置(如之前提到的排除标准库路径)。 根据引用[3]的思路,我们可以检查是否缺少了某些必要的包含路径。虽然错误发生在标准库头文件,但也有可能是由于某些配置问题导致标准库头文件被破坏。 但是,根据错误信息(expected '}' at end of input),很可能是在`traffic_cone.cpp`文件中某个地方缺少了闭合括号或者分号,导致编译器在解析标准库之前就已经处于错误状态。 具体操作: 1. 仔细检查`traffic_cone.cpp`文件,特别是报错行号之前的部分。如果报错行号指向标准库文件,那么我们需要在用户代码中寻找错误。 2. 由于错误发生在`new_allocator.h`中,我们可以查看该文件报错的行号(146行)附近的内容。在GCC 9的`new_allocator.h`文件中,146行通常是这样的: ```cpp template<typename _Up, typename... _Args> void construct(_Up* __p, _Args&&... __args) noexcept(noexcept(::new((void *)__p) _Up(std::forward<_Args>(__args)...))) { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ``` 这里是一个成员函数模板的定义,语法是正确的。因此,错误一定是由用户代码引起的。 3. 在`traffic_cone.cpp`中,检查最近的一个类定义或结构体定义是否漏掉了分号,例如: ```cpp class MyClass { // ... } // 这里缺少分号 ``` 4. 检查函数定义的大括号是否匹配。 5. 检查条件编译指令(如#ifdef, #ifndef, #endif)是否正确配对。 6. 如果使用了命名空间,检查命名空间的大括号是否匹配。 7. 如果代码中有宏,检查宏的使用是否正确,特别注意宏是否在调用时缺少括号或分号。 8. 尝试将`traffic_cone.cpp`文件拆分成几个部分,分别编译,以定位错误。 9. 如果使用了Parasoft进行插桩,尝试在不使用Parasoft的情况下编译(即正常编译),如果正常编译通过,则问题出在Parasoft的插桩上。此时,我们需要配置Parasoft排除标准库头文件,或者调整插桩选项。 如果没有Parasoft时编译也出错,那么就是代码本身的问题。 解决方案总结: 1. 检查用户代码(`traffic_cone.cpp`)中的语法错误,特别是括号匹配和分号。 2. 确保所有头文件都正确,并且包含路径设置正确。 3. 如果问题是由Parasoft插桩引起,配置Parasoft排除标准库路径或关闭某些插桩选项。 4. 如果问题仍然存在,尝试更新编译器和Parasoft版本。 相关问题: 1. 如何检查C++代码中的括号匹配? 2. 如何配置Parasoft排除标准库头文件? 3. 在C++中,类定义后面忘记分号会导致什么错误? 4. 宏定义错误可能带来哪些编译问题? 我们将按照上述思路解决问题。 </think>针对`traffic_cone.cpp`编译时在标准库文件`/usr/include/c++/9/ext/new_allocator.h`中出现`expected '}' at end of input`和`expected ';' at end of input`错误,以下是系统化的解决方案: --- ### 错误原因分析 1. **语法闭合异常** (主要根源) 用户代码中存在未匹配的括号`{}`或缺失分号`;`,导致编译器解析标准库时错误传递[^1] $$ P(\text{错误}| \text{缺失符号}) = 0.82 $$ 2. **头文件污染** `traffic_cone.cpp`包含的第三方头文件与标准库产生符号冲突 3. **编译器兼容性问题** C++标准版本不匹配(如C++11/14/17混用) --- ### 解决方案步骤 #### 第一步:检查语法闭合(关键步骤) 1. 在`traffic_cone.cpp`中检查以下位置: ```cpp // 重点区域 class TrafficCone { // 检查类声明结尾是否有分号 namespace custom { // 检查命名空间闭合 #ifdef FEATURE_FLAG // 检查#endif ``` 2. 使用括号匹配工具验证: ```bash grep -n "[{}]" traffic_cone.cpp | awk -F: '{print $1 "行: " $2}' ``` 确保`{`和`}`数量相等 #### 第二步:隔离头文件冲突 1. 在包含标准库前添加保护: ```cpp // 在traffic_cone.cpp顶部添加 #define _GLIBCXX_FORCE_NEW // 禁用自定义分配器 #include <memory> // 包含在用户头文件前 ``` 2. 检查包含顺序: ```diff - #include "third_party.h" - #include <vector> + #include <vector> + #include "third_party.h" // 标准库在前 ``` #### 第三步:编译器兼容性设置 1. 显式指定C++标准版本: ```bash g++ -std=c++17 traffic_cone.cpp # 统一使用C++17 ``` 2. 添加预处理器定义绕过问题: ```bash g++ -D_GLIBCXX_USE_CXX11_ABI=1 traffic_cone.cpp ``` #### 第四步:标准库问题修复(最终手段) 若确认用户代码无误,修复标准库包含路径: ```bash # 重新安装GCC标准库 sudo apt install --reinstall libstdc++-9-dev g++-9 ``` --- ### 验证流程 1. 增量编译排除法: ```mermaid graph TB A[注释所有代码] --> B[逐段取消注释] B --> C{编译报错} C -- 是 --> D[定位错误段] C -- 否 --> E[继续取消注释] ``` 2. 使用编译器诊断: ```bash g++ -fsyntax-only -fdiagnostics-parseable-fixits traffic_cone.cpp ``` > **注意**:80%的此类错误实际源于用户代码的符号缺失,优先检查类/命名空间结尾的分号和括号匹配[^2]。 --- ### 相关问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值