Path_Planning/calculate.m

101 lines
3.3 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% 所有路径数据定义
paths = {
[2,2; 5,5; 7,5; 11,9; 11,10; 10,11; 18,19; 19,19], 'A*';
[2,2; 9,2; 9,6; 11,6; 11,10; 10,10; 10,12; 13,12; 13,13; 17,13; 17,14; 18,14; 18,18; 18,19; 19,19], 'Dijkstra';
[2,2; 7,2; 10,6; 14,3; 18,7; 14,11; 10,13; 10,18; 15,17; 19,19], 'RTT_one';
[2,2; 7,2; 10,6; 5,7; 3,11; 7,14; 11,12; 16,14; 16,19; 19,19], 'RTT_two';
[2,2; 7,2; 10,6; 5,8; 2,12; 2,17; 7,17; 11,15; 16,16; 19,19], 'RTT_three';
[2,2; 7,2; 10,6; 15,5; 11,9; 9,14; 13,17; 18,19; 19,19], 'RTT_four';
};
% 模拟参数
v_normal = 10; % 直线速度 m/s
a_turn = -2; % 拐弯减速加速度 m/s^2
dt = 0.1; % 时间步长
% 遍历每一组路径
for k = 1:size(paths, 1)
points = paths{k,1};
group_name = paths{k,2};
time = 0;
time_series = [];
speed_series = [];
acc_series = [];
total_distance = 0;
total_time = 0;
for i = 1:size(points, 1) - 1
p1 = points(i, :);
p2 = points(i + 1, :);
segment_vector = p2 - p1;
segment_distance = norm(segment_vector);
total_distance = total_distance + segment_distance;
if i > 1
prev_vec = points(i, :) - points(i - 1, :);
angle = acos(dot(prev_vec, segment_vector) / (norm(prev_vec) * norm(segment_vector)));
delta_v = abs(v_normal * sin(angle / 2));
if delta_v > 0
t_decel = delta_v / abs(a_turn);
t_accel = t_decel;
% 减速段
t = 0:dt:t_decel;
v_decel = v_normal - abs(a_turn) * t;
a_decel = -abs(a_turn) * ones(size(t));
% 加速段
t2 = 0:dt:t_accel;
v_accel = v_normal - delta_v + abs(a_turn) * t2;
a_accel = abs(a_turn) * ones(size(t2));
% 拼接
time_series = [time_series, time + t];
speed_series = [speed_series, v_decel];
acc_series = [acc_series, a_decel];
time = time + t_decel;
time_series = [time_series, time + t2];
speed_series = [speed_series, v_accel];
acc_series = [acc_series, a_accel];
time = time + t_accel;
total_time = total_time + t_decel + t_accel;
end
end
% 匀速段
t_segment = segment_distance / v_normal;
t = 0:dt:t_segment;
v_const = v_normal * ones(size(t));
a_const = zeros(size(t));
time_series = [time_series, time + t];
speed_series = [speed_series, v_const];
acc_series = [acc_series, a_const];
time = time + t_segment;
total_time = total_time + t_segment;
end
% 输出总路程与用时
fprintf('%s总路程 = %.2f 米,总用时 = %.2f 秒\n', group_name, total_distance, total_time);
% 绘图
figure('Name', group_name, 'NumberTitle', 'off');
subplot(2,1,1);
plot(time_series, speed_series, 'b', 'LineWidth', 2);
xlabel('时间 (s)');
ylabel('速度 (m/s)');
title([group_name ' - 速度-时间图']);
grid on;
subplot(2,1,2);
plot(time_series, acc_series, 'r', 'LineWidth', 2);
xlabel('时间 (s)');
ylabel('加速度 (m/s²)');
title([group_name ' - 加速度-时间图']);
grid on;
end