MATLAB 函数:笛卡尔坐标系到Frenet坐标系转换,含一阶和二阶导数
以下是一个可能的实现:
function [s, ds, dds, d, dd] = cartesianToFrenet(x, y, ref_x, ref_y, ref_yaw)
% x, y: 车辆坐标系下的x和y坐标
% ref_x, ref_y: 参考轨迹点的x和y坐标
% ref_yaw: 参考轨迹点处的航向角
% 返回s, ds, dds, d, dd,分别为车辆在参考轨迹上的纵向距离、纵向速度、纵向加速度、横向距离、横向速度、横向加速度
% 计算参考轨迹上每个点到起点的距离
dx = ref_x - ref_x(1);
dy = ref_y - ref_y(1);
yaw = ref_yaw - ref_yaw(1);
cos_yaw = cos(yaw);
sin_yaw = sin(yaw);
s = cumsum(sqrt(dx.^2 + dy.^2));
% 计算车辆在参考轨迹上的投影点坐标
x_diff = x - ref_x(1);
y_diff = y - ref_y(1);
x_proj = cos_yaw .* x_diff + sin_yaw .* y_diff;
y_proj = -sin_yaw .* x_diff + cos_yaw .* y_diff;
% 按照参考轨迹上的s,插值计算车辆在参考轨迹上的位置和速度
d_interp = interp1(s, dy, s(end), 'linear', 'extrap');
s_interp = interp1(s, s, x_proj, 'linear', 'extrap');
ds_interp = interp1(s, dy./sqrt(dx.^2 + dy.^2), s_interp, 'linear', 'extrap');
dds_interp = interp1(s, diff(dy)./diff(sqrt(dx.^2 + dy.^2)), s_interp, 'linear', 'extrap');
% 计算车辆在参考轨迹上的横向距离、速度、加速度
d = y_proj;
d_interp = interp1(s, d, s_interp, 'linear', 'extrap');
dd_interp = interp1(s, diff(d)./diff(sqrt(dx.^2 + dy.^2)), s_interp, 'linear', 'extrap');
% 输出结果
s = s_interp;
ds = ds_interp;
dds = dds_interp;
d = d_interp;
dd = dd_interp;
end
该函数利用插值方法,可以计算出车辆在参考轨迹点之间的任意位置上的状态信息,但也会引入一些误差。此外,该函数假设参考轨迹是从原点出发的,如果不是,需要进行平移变换。
原文地址: https://www.cveoy.top/t/topic/oE4u 著作权归作者所有。请勿转载和采集!