【转载】frenet与笛卡尔cartesian坐标系的转换

本文为转载:原文链接如下:

自动驾驶规划算法基础第三节-frenet与笛卡尔cartesian坐标系的转换_frenet坐标系与笛卡尔坐标系的转化-优快云博客

以下为转载内容:

该笔记来自b站up主(偶像):憨厚老实的老王B站视频链接
跟着老王的视频手写推了一遍公式,这酸爽!
csdn中推导公式比较好的博主:Frenet坐标系与Cartesian坐标系互转

转载内容结束:

感谢原作者的笔记,非常的清晰明了

再次注明原文链接如下:

自动驾驶规划算法基础第三节-frenet与笛卡尔cartesian坐标系的转换_frenet坐标系与笛卡尔坐标系的转化-优快云博客

### MATLAB 中实现从笛卡尔坐标系Frenet 坐标转换 在 MATLAB 中,可以利用几何关系以及路径参数化的方法完成从笛卡尔坐标系Frenet 坐标系转换。以下是具体的算法描述和代码示例。 #### 1. 背景理论 Frenet 坐标系是一种局部坐标系,通常用于描述车辆沿道路行驶时的位置和方向。它由两个主要变量组成:纵向距离 \( s \) 和横向偏移量 \( d \),分别表示沿着参考路径的距离和垂直于参考路径的方向上的偏差。为了将全局笛卡尔坐标 (\( x, y \)) 转换Frenet 坐标 (\( s, d \)),需要以下几个步骤: - **计算最近点投影**:找到参考路径上离给定点 (\( x, y \)) 最近的一个点。 - **计算弧长 \( s \)**:测量该点相对于路径起点的累积长度。 - **计算横向偏移 \( d \)**:通过向量叉积或其他方法求解目标点路径之间的垂距。 这些操作可以通过数值积分或解析表达式来实现[^3]。 #### 2. 实现过程 下面提供了一个完整的 MATLAB 函数 `cartesianToFrenet` 来完成上述功能: ```matlab function [s, d] = cartesianToFrenet(x_global, y_global, path_x, path_y) % 将全局笛卡尔坐标 (x_global, y_global) 转换Frenet 坐标 (s, d) % 初始化变量 min_dist = Inf; nearest_idx = 1; % 遍历路径寻找最近点 for i = 1:length(path_x) dist = sqrt((path_x(i) - x_global)^2 + (path_y(i) - y_global)^2); if dist < min_dist min_dist = dist; nearest_idx = i; end end % 获取最近点及其前后两点 prev_point = [path_x(nearest_idx-1), path_y(nearest_idx-1)]; curr_point = [path_x(nearest_idx), path_y(nearest_idx)]; next_point = [path_x(mod(nearest_idx,length(path_x))+1), ... path_y(mod(nearest_idx,length(path_y))+1)]; % 计算切线矢量 tangent_vector = next_point - prev_point; unit_tangent = tangent_vector / norm(tangent_vector); % 判断当前点位于哪一侧并计算d值 global_to_path = [x_global, y_global] - curr_point; perpendicular_distance = cross([unit_tangent, 0], [global_to_path, 0]); d = perpendicular_distance(3); % 使用累计距离得到s值 if nearest_idx == 1 s = 0; else arc_lengths = zeros(size(path_x)); for j = 2:length(path_x) segment_length = norm([path_x(j)-path_x(j-1), path_y(j)-path_y(j-1)]); arc_lengths(j) = arc_lengths(j-1) + segment_length; end s = arc_lengths(nearest_idx); end end ``` 以上代码实现了以下逻辑: - 寻找路径上最接近输入点的节点; - 根据相邻两节点构建单位切向量; - 应用叉乘法则判断横摆位移 \( d \)[^4]; - 积累每一段路径的小段长度得出总路程 \( s \)。 #### 3. 测试实例 假设已知一条简单的曲线作为参考路径,并希望将其某一点映射至对应的 Frenet 表达形式,则可调用如下脚本测试前述函数的效果: ```matlab clc; clear all; % 定义参考路径(例如圆周的一部分) theta = linspace(0, pi, 100)'; path_x = cos(theta)*50 + 100; path_y = sin(theta)*50 + 100; % 待转换的目标点 target_points = [ 80, 90; % Point A 70, 120 % Point B ]; figure(); plot(path_x, path_y,'b'); hold on; grid minor; for k=1:size(target_points,1) xp = target_points(k,1); yp = target_points(k,2); plot(xp,yp,'ro'); [s_val, d_val] = cartesianToFrenet(xp, yp, path_x, path_y); fprintf('Point (%f,%f): S=%f D=%f\n',xp,yp,s_val,d_val); end hold off; axis equal; title('Cartesian to Frenet Conversion Example'); xlabel('X Coordinate'); ylabel('Y Coordinate'); legend({'Reference Path','Target Points'}); ``` 运行结果将会打印各指定点所对应的不同 \( s \) 和 \( d \) 参数组合[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值