Path_Planning/calculate.m

101 lines
3.3 KiB
Mathematica
Raw Permalink Normal View History

%
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