matlab - 如何计算不是适当函数的轨迹的逐点曲率半径
问题描述
使用 Matlab,我试图计算使用投影到本地笛卡尔平面的 GPS 数据获得的轨迹的“曲率半径”信号。第 n 点上的信号值是与该点上的轨迹相切的密切圆之一。按照惯例,当与左转相关时,信号幅度必须为负,反之亦然。
使用具有适当功能的轨迹作为图形,我正在构建“符号”信号,评估密切圆中心的 y 坐标之间的数值差异:
for i=1:length(yCenter) -1
aux=Y_m(closestIndex_head:closestIndex_tail );
if yCenter(i) - aux(i) > 0
sign(i)=-1;
else
sign(i)=+1;
end
end
- yCenter 包含与轨迹的每个点相关的所有密切圆的 x 坐标;
- Y_m 包含轨迹中每个点的 y 坐标。
只要轨迹图是一个适当的函数,上述简单方法就可以工作(对于每个 x 只有一个 y)。
我正在研究的轨迹是这样的:
并且符号信号出现了一些异常:
标志似乎在一圈内改变。
我尝试使用切线向量和轨迹之间的角度的正弦、角度的切线的符号和其他类似的东西来纠正符号,但我仍然在看一些异常:
我很确定这些异常来自这样一个事实,即图形不是一个正确的函数,并且解决方案在于切线向量的角度,但仍然缺少一些东西。
任何建议将不胜感激,谢谢。
亚历山德罗
解决方案
要跟踪 2D 曲线,您应该使用适用于一般参数化 2D 函数的曲率表达式。
在实现Wikipedia 中的方程时,您可以使用离散差来近似导数。给定x
和y
坐标,可以按如下方式实现:
% approximate 1st derivatives of x & y with discrete differences
dx = 0.5*(x(3:end)-x(1:end-2))
dy = 0.5*(y(3:end)-y(1:end-2))
dl = sqrt(dx.^2 + dy.^2)
xp = dx./dl
yp = dy./dl
% approximate 2nd derivatives of x & y with discrete differences
xpp = (x(3:end)-2*x(2:end-1)+x(1:end-2))./(dl.^2)
ypp = (y(3:end)-2*y(2:end-1)+y(1:end-2))./(dl.^2)
% Compute the curvature
curvature = (xp.*ypp - yp.*xpp) ./ ((xp.^2 + yp.^2).^(1.5))
出于演示目的,我还构建了一个合成测试信号(可用于重新创建相同的条件),但您显然可以使用自己的数据:
z1 = linspace(2,1,N).*exp(1i*linspace(0.75*pi,-0.25*pi,N))
z2 = 2*exp(-1i*0.25*pi) + linspace(1,2,N)*exp(1i*linspace(0.75*pi,2.25*pi,N))
z = cat(1,z1,z2)
x = real(z)
y = imag(z)
具有相应的曲率结果:
推荐阅读
- android - 如何在我的 QT 应用程序中注册 Android Broadcast Reciever?
- enterprise-architect - Enterprise Architect 规则任务:规则编辑器验证警告“相同的操作逻辑绑定到不同的规则”
- php - 如何在数据库中以二进制格式保存文件?
- django - 为什么 HTTP 方法的 PATCH 会运行模型 save() 方法?
- mysql - 如何找到用户在特定年份的旅行距离?
- amazon-web-services - 通过 Elastic Beanstalk 和证书管理器让 Node JS Web 应用程序使用 https?
- python - 如何将元组坐标键的字典转换为稀疏矩阵
- python - python请求发布json数据
- java - PointF 与 X 成 90 度
- python - 如何使用 python-docx 从模板流式传输文件