请用matlab写一个在给定参考轨迹点序列情况下车辆状态从笛卡尔坐标转frenet坐标系的函数同时输出s与d的一阶导数与二阶导数信息
以下是一个可能的实现:
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
这个函数的实现思路如下:
- 首先计算参考轨迹上每个点到起点的距离s;
- 然后计算车辆在参考轨迹上的投影点坐标,即将车辆坐标系下的x和y旋转到参考轨迹点处的航向角下,再平移到参考轨迹上;
- 按照参考轨迹上的s,插值计算车辆在参考轨迹上的位置和速度;
- 计算车辆在参考轨迹上的横向距离d,并插值计算横向速度和加速度。
需要注意的是,这里采用了插值的方法,可以保证在参考轨迹点之间的任意位置都能计算出车辆在参考轨迹上的状态信息,但也会引入一些误差。此外,这个函数还假设参考轨迹是从原点出发的,如果不是,需要进行平移变换
原文地址: https://www.cveoy.top/t/topic/hb86 著作权归作者所有。请勿转载和采集!