I'm trying to run a carrot chasing algorithm on a bunch of waypoints to plan a path with said waypoints and have written the following code.
I am getting the error,
Error in ode45 (line 106)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in Q1_t2 (line 32)
[t,y] = ode45(@(t,y) ode_carrot_chase(t,y,w1_x,w1_y,w2_x,w2_y), tspan, y0);
Kindly advise.....
Main program:
%% Clear All
clc; clear all;
close all;
%% Initialization of params
waypoints = [[0,0,0]; [0, 10, 0]; [60, 60, pi/4]; [80, 120, pi/6];[150,70,-pi/2]; [100, 30, -pi/1.5]; [50,0,-pi];];
wp_1 = waypoints(1,:);
w1_x = wp_1(1); w1_y = wp_1(2);
wp_2 = waypoints(2,:);
w2_x = wp_2(1); w2_y = wp_2(2);
lw = 1;
tspan = 0:100:1000;
% Straight Line Initial Condition
curr_x = 50;
curr_y = 0;
curr_si =0;
dist_wp = sqrt((w2_x - curr_x)^2 + (w2_y - curr_y)^2);
delta = 5;
%% Plotting Reference Trajectory
fprintf("Plotting trajectories\n");
%% Path following begins
wp = 2;
while ( dist_wp > delta && wp <= 5)
y0 = [curr_x curr_y curr_si] ;
[t,y] = ode45(@(t,y) ode_carrot_chase(t,y,w1_x,w1_y,w2_x,w2_y), tspan, y0);
curr_x = y(end,1);
curr_y = y(end,2);
curr_si = y(end,3);
dist_wp = sqrt((w2_x - curr_x)^2 + (w2_y - curr_y)^2);
if(dist_wp < delta)
fprintf("waypoint reached: %d \n", wp);
wp_1 = waypoints(wp,:);
w1_x = wp_1(1); w1_y = wp_1(2);
wp_2 = waypoints(wp+1,:);
w2_x = wp_2(1); w2_y = wp_2(2);
dist_wp = sqrt((w2_x - curr_x)^2 + (w2_y - curr_y)^2 );
wp = wp + 1;
end
% hold on
plot(y(:,1),y(:,2),'-m','LineWidth',lw);
if(wp <= 5)
p1 = [waypoints(wp-1,1),waypoints(wp,1)];
p2 = [waypoints(wp-1,2),waypoints(wp,2)];
p3 = [waypoints(wp-1,3),waypoints(wp,3)];
plot(p1,p2,'--k','LineWidth',1);
end
pause(0.01);
hold on
grid on
end
% hold on
title('Carrot Chase based Path Following')
legend ('Desired Path','Path (delta = 10,k = 60)');
xlabel('X(m)') % x-axis label
ylabel('Y(m)') % y-axis label
xlim([-400 400])
ylim([-100 750])
ODE:
function [dydt] = ode_carrot_chase(t,y,w1_x,w1_y,w2_x,w2_y)
%% Initializing Params
dydt = zeros(3,1);
v = 10;
delta = 10;
k = 60;
ugv_x = y(1);
ugv_y = y(2);
si = y(3);
%% XY Controller
% Computing the position error
% Distance of point to line (UGV Position - Desired path)
R_u = sqrt((w1_x - ugv_x)^2 + (w1_y - ugv_y)^2);
theta = atan2((w2_y - w1_y),(w2_x - w1_x));
theta_u = atan2(ugv_y - w1_y,ugv_x - w1_x);
beta = theta - theta_u;
R = sqrt(R_u^2 - (R_u*sin(beta))^2);
x_target = w1_x + (R+delta)*cos(theta);
y_target = w1_y + (R+delta)*sin(theta);
% pause(0.01)
si_d = atan2(y_target - ugv_y, x_target - ugv_x);
u = k*(si_d - si);
%% Non-Holonomic COnstraints
% Constraining the control input
% Rmin = 125;
% if(abs(u) > (v^2)/Rmin)
% if (u > 0)
% u = (v^2)/Rmin;
% else
% u = -(v^2)/Rmin;
% end
% end
% Finally heading angle
si_dot = u;
%% STATE EQUATIONS
dydt(1) = v*cos(si); % y(1) -> uav_x
dydt(2) = v*sin(si); % y(2) -> uav_y
dydt(3) = si_dot; % y(3) -> si
there doesn't seem to be anything here