2018-07-23 08:17:51 +00:00
|
|
|
function traj = CartesianTrajectory(Xstart, Xend, Tf, N, method)
|
2018-07-23 21:47:50 +00:00
|
|
|
% *** CHAPTER 9: TRAJECTORY GENERATION ***
|
2018-07-23 08:17:51 +00:00
|
|
|
% Takes Xstart: The initial end-effector configuration,
|
|
|
|
|
% Xend: The final end-effector configuration,
|
|
|
|
|
% Tf: Total time of the motion in seconds from rest to rest,
|
|
|
|
|
% N: The number of points N > 1 (Start and stop) in the discrete
|
|
|
|
|
% representation of the trajectory,
|
|
|
|
|
% method: The time-scaling method, where 3 indicates cubic
|
|
|
|
|
% (third-order polynomial) time scaling and 5 indicates
|
|
|
|
|
% quintic (fifth-order polynomial) time scaling.
|
|
|
|
|
% Returns traj: The discretized trajectory as a list of N matrices in SE(3)
|
|
|
|
|
% separated in time by Tf/(N-1). The first in the list is
|
|
|
|
|
% Xstart and the Nth is Xend .
|
|
|
|
|
% This function is similar to ScrewTrajectory, except the origin of the
|
|
|
|
|
% end-effector frame follows a straight line, decoupled from the rotational
|
|
|
|
|
% motion.
|
|
|
|
|
% Example Input:
|
2018-07-23 21:47:50 +00:00
|
|
|
%
|
|
|
|
|
% clear; clc;
|
|
|
|
|
% Xstart = [[1, 0, 0, 1]; [0, 1, 0, 0]; [0, 0, 1, 1]; [0, 0, 0, 1]];
|
|
|
|
|
% Xend = [[0, 0, 1, 0.1]; [1, 0, 0, 0]; [0, 1, 0, 4.1]; [0, 0, 0, 1]];
|
|
|
|
|
% Tf = 5;
|
|
|
|
|
% N = 4;
|
|
|
|
|
% method = 5;
|
|
|
|
|
% traj = CartesianTrajectory(Xstart, Xend, Tf, N, method)
|
|
|
|
|
%
|
2018-07-23 08:17:51 +00:00
|
|
|
% Output:
|
|
|
|
|
% traj =
|
|
|
|
|
% 1.0000 0 0 1.0000
|
|
|
|
|
% 0 1.0000 0 0
|
|
|
|
|
% 0 0 1.0000 1.0000
|
|
|
|
|
% 0 0 0 1.0000
|
|
|
|
|
%
|
|
|
|
|
% 0.9366 -0.2140 0.2774 0.8111
|
|
|
|
|
% 0.2774 0.9366 -0.2140 0
|
|
|
|
|
% -0.2140 0.2774 0.9366 1.6506
|
|
|
|
|
% 0 0 0 1.0000
|
|
|
|
|
%
|
|
|
|
|
% 0.2774 -0.2140 0.9366 0.2889
|
|
|
|
|
% 0.9366 0.2774 -0.2140 0
|
|
|
|
|
% -0.2140 0.9366 0.2774 3.4494
|
|
|
|
|
% 0 0 0 1.0000
|
|
|
|
|
%
|
|
|
|
|
% -0.0000 0.0000 1.0000 0.1000
|
|
|
|
|
% 1.0000 -0.0000 0.0000 0
|
|
|
|
|
% 0.0000 1.0000 -0.0000 4.1000
|
|
|
|
|
% 0 0 0 1.0000
|
|
|
|
|
|
|
|
|
|
timegap = Tf / (N - 1);
|
|
|
|
|
traj = cell(1, N);
|
|
|
|
|
[Rstart, pstart] = TransToRp(Xstart);
|
|
|
|
|
[Rend, pend] = TransToRp(Xend);
|
|
|
|
|
for i = 1: N
|
|
|
|
|
if method == 3
|
|
|
|
|
s = CubicTimeScaling(Tf,timegap * (i - 1));
|
|
|
|
|
else
|
|
|
|
|
s = QuinticTimeScaling(Tf,timegap * (i - 1));
|
|
|
|
|
end
|
|
|
|
|
traj{i} ...
|
|
|
|
|
= [Rstart * MatrixExp3(MatrixLog3(Rstart' * Rend) * s), ...
|
|
|
|
|
pstart + s * (pend - pstart); 0, 0, 0, 1];
|
|
|
|
|
end
|
|
|
|
|
end
|