Error: Index exceeds matrix dimensions

2 次查看(过去 30 天)
I'm getting the following error in my code. Could this be due to the fact that my filename is rft instead of txt?
>> RRTpathplan
Index exceeds matrix dimensions.
Error in RRTpathplan (line 8)
object_coord = rawdata(1:500,2);
My Code:
function prm = path_planner
% Import Obstacle Locations
filename ='Simple2Obst.rtf';
delimiterIn = ' ';
headerlinesIn = 0;
rawdata = importdata(filename,delimiterIn,headerlinesIn);
object_coord = rawdata(1:500,2);
% Draw Course
map = figure;
course_outx=[-2,-4,-6,-6, 6,6,4,2];
course_outy=[ 0, 0, 0,12,12,0,0,0];
hold on;
plot(course_outx,course_outy,'k','LineWidth',5);
axis([-7,7,-6,13]);
axis equal
set(gca,'XTick',-13:1:13)
set(gca,'YTick',-6:1:13)
grid ON
obst.ball = {};
% Tile the obstacles with balls
count = 1;
for i=1:2:500
if (object_coord(i,1)<999)
onew.p = [object_coord(i,1);object_coord(i+1,1)];
onew.r = 1/3;
onew.handle = [];
obst.ball{end+1} = onew;
circle(onew.p(1,1),onew.p(2,1),onew.r,'b');
end
end
% Set Start and Goal locations
p_start = [0;11];
p_goal = [0;-1];
rob.ballradius = 0.5;
rob.p = p_start;
% Parameters
param.res = 0.5;
param.thresh = 5;
param.maxiters = 1000;
param.smoothiters = 150;
circle(rob.p(1,1),rob.p(2,1),rob.ballradius,'g');
circle(p_goal(1,1),p_goal(2,1),rob.ballradius,'r');
% Plan the path
P = PlanPathRRT(rob,obst,param,p_start,p_goal);
% Plot the unsmoothed path
for i=2:length(P)
plot([P(1,i);P(1,i-1)],[P(2,i);P(2,i-1)],'r','LineWidth',3);
end
% Smooth the path
if (~isempty(P))
P = SmoothPath(rob,obst,param,P)
end
% Plot the smoothed path
for i=2:length(P)
plot([P(1,i);P(1,i-1)],[P(2,i);P(2,i-1)],'g','LineWidth',3);
end
function h = circle(x,y,r,color)
hold on
th = 0:pi/50:2*pi;
xunit = r * cos(th) + x;
yunit = r * sin(th) + y;
h = plot(xunit, yunit,color,'LineWidth',3);
%hold off
function rrt = AddNode(rrt,p,iPrev)
node.p = p;
node.iPrev = iPrev;
rrt{end+1} = node;
function P = PlanPathRRT(rob,obst,param,p_start,p_goal)
global iterations
P = [];
rrt = {};
rrt = AddNode(rrt,p_start,0);
iter = 1;
while iter <= param.maxiters
if mod(iter,50) == 0
blah=0;
end
p = rand(2,1); % random p
% p(1,1) = floor(p(1,1)*11-5);
% p(2,1) = floor(p(2,1)*16-4);
p(1,1) = p(1,1)*10-5;
p(2,1) = p(2,1)*15-4;
rob.p = p;
col = InCollision_Node(rob,obst);
if col == 1 % skip to next iteration
% circle(p(1,1),p(2,1),0.1,'r');
iter = iter + 1;
continue
end
% do something if valid coordinate
for i=1:length(rrt)
dist = norm(rrt{i}.p - p);
if (i==1) || (dist < mindist)
mindist = dist;
imin = i;
l = rrt{i}.p;
end
end
col = InCollision_Edge(rob,obst,p,l,param.res); %check for valid edge
if col == 1 % skip to next iteration if not valid edge
% circle(p(1,1),p(2,1),0.1,'r');
iter = iter + 1;
continue
end
rrt = AddNode(rrt,p,imin); % add p to T with parent l
dist = norm(p-p_goal);
%display(iter,dist,length(rrt))
fprintf('Nodes: %d, Distance: %.1f, Iterations: %d/1000\n',length(rrt),dist,iter)
% circle(p(1,1),p(2,1),rob.ballradius,'b');
% circle(p(1,1),p(2,1),0.1,'b');
plot([p(1,1);rrt{imin}.p(1,1)],[p(2,1);rrt{imin}.p(2,1)],'m','LineWidth',3);
if (dist < param.thresh)
col = InCollision_Edge(rob,obst,p,p_goal,param.res); %check for valid edge
if col == 1 % skip to next iteration if not valid edge
iter = iter + 1;
continue
end
iterations = iter
% add qgoal to T with parent q and exit with success
rrt = AddNode(rrt,p_goal,length(rrt));
% construct Q here:
i = length(rrt);
P(:,1) = rrt{i}.p;
while 1
i = rrt{i}.iPrev;
if i == 0
return
end
P = [rrt{i}.p P];
end
end
iter = iter + 1;
end
iterations = iter - 1
function col = InCollision_Node(rob,obst)
global checkcount;
checkcount = checkcount + 1;
col = 0;
numobst = length(obst.ball);
for j=1:numobst % check for robot-obstacle collision
% calculate distance between ith robot ball center and jth obstacle
% ball center
%dist = sqrt((rob.ball{i}.p(1)-obst.ball{j}.p(1))^2+(rob.ball{i}.p(2)-obst.ball{j}.p(2))^2+(rob.ball{i}.p(3)-obst.ball{j}.p(3))^2);
dist = norm(rob.p-obst.ball{j}.p);
if dist < (rob.ballradius + obst.ball{j}.r)
col = 1;
return;
end
end
%end
function col = InCollision_Edge(rob,obst,p1,p2,res)
col = 0;
d = norm(p1 - p2);
m = ceil(d/res);
t = linspace(0,1,m);
for i=2:(m-1)
p = (1-t(i))*p1 + t(i)*p2; %calculate configuration
rob.p = p;
col = InCollision_Node(rob,obst);
if col == 1
return;
end
end
function P = SmoothPath(rob,obst,param,P) %was SmoothPath(rob,obst,param,m,Q)
%
% INPUTS
%
% rob - says where the robot is
%
% NOTE: to make "rob" describe the robot at configuration
% "something" (a column vector of length rob.n), you must call:
%
% rob.q = something
% rob = ForwardKinematics(rob);
%
% obst - says where the obstacles are
%
% param - some parameters:
%
% param.res - resolution with which to sample straight-line paths
% param.maxiters - maximum number of RRT iterations
% param.thresh - distance below which a configuration is considered
% "close" to qgoal (called "d" in the homework)
% param.smoothiters - maximum number of smoothing iterations
%
% qstart, qgoal - start and goal configurations
%
% OUTPUTS
%
% Q - a path, same format as before:
%
% Q = [q1 q2 q3 ... qM]
%
% where q1=qstart and qM=qgoal; in other words, the sequence
% of straight-line paths from q1 to q2, q2 to q3, etc., takes
% the robot from start to goal without collision
%
% YOUR CODE HERE...
%
P = P;
[n,m] = size(P);
clearvars n;
l = zeros(m,1);
for k=2:m
l(k)=norm(P(:,k)-P(:,k-1)) + l(k-1); % find all of the straight-line distances
end
l_init = l(m);
iter = 1;
while iter <= param.smoothiters
s1 = rand(1,1)*l(m);
s2 = rand(1,1)*l(m);
if s2 < s1
temps = s1;
s1 = s2;
s2 = temps;
end
for k=2:m
if s1 < l(k)
i = k - 1;
break;
end
end
for k=(i+1):m
if s2 < l(k)
j = k - 1;
break;
end
end
if (j <= i)
iter = iter + 1;
continue;
end
t1 = (s1 - l(i))/(l(i+1)-l(i));
gamma1 = (1 - t1)*P(:,i) + t1*P(:,i+1);
t2 = (s2 - l(j))/(l(j+1)-l(j));
gamma2 = (1 - t2)*P(:,j) + t2*P(:,j+1);
col = InCollision_Edge(rob,obst,gamma1,gamma2,param.res); %check for valid edge
if col == 1
iter = iter + 1;
continue;
end
newP = [P(:,1:i) gamma1 gamma2 P(:,j+1:m)];
clearvars P;
P = newP;
[n,m] = size(P);
clearvars n;
l = zeros(m,1);
for k=2:m
l(k)=norm(P(:,k)-P(:,k-1)) + l(k-1);
end
iter = iter + 1;
end
  3 个评论
D Penny
D Penny 2016-5-6
Thanks for responding. Maybe this will provide some insight. The code I was attempting to run was from the website... http://coecsl.ece.illinois.edu/ge423/spring13/RickRekoskeAvoid/rrt.html
I simply downloaded both files (RRTpathplan.m and Simple2obst.txt) at the bottom of the page, added them to the same directory, and ran the RRTpathplan.m script. The only change that I made was I saved the txt file as a rtf (I have a Mac) and also changed that part of my code from...
filename ='Simple2Obst.txt';
to
filename ='Simple2Obst.rtf';
My question is, could that change be the reason why the code doesn't run?
dpb
dpb 2016-5-6
编辑:dpb 2016-5-6
Well, if you saved an input plain ASCII text file as RTF, then it's quite likely the attempt to read that file failed, yes.
But, the filename alone has no bearing on the content.
The question still is, what happens when try to actually read the file? Use the debugger and step through and see if it worked or not. Again, we can't see your system and do such simple sanity checks for you...

请先登录,再进行评论。

采纳的回答

Elias Gule
Elias Gule 2016-5-9
编辑:Elias Gule 2016-5-9
Ok I downloaded the code and the text file from the website you mentioned. When running the code the rawdata variables has a size of 1 x 1000 (1 rows and 1000 columns); that is why this line of code
object_coord = rawdata(1:500,2);
gives an error,which basically asks for the first 500 rows from a vector that contains only one row. Now we can solve this by changing the rawdata to a matrix of 500 rows and 2 columns by adding this:
rawdata = reshape(rawdata,[],2);
after the line that initializes the rawdata variable. i.e between the line
rawdata = importdata(filename,delimiterIn,headerlinesIn);
and the line
object_coord = rawdata(1:500,2);
The code should work now.
  1 个评论
Amit Kabra
Amit Kabra 2016-11-3
I have got the same errors, when i added that code of lines, code works fine except that the obstacles are gone It should actually appear as in the link http://coecsl.ece.illinois.edu/ge423/spring13/RickRekoskeAvoid/rrt.html but obstacles are missing. Please Help

请先登录,再进行评论。

更多回答(1 个)

cristian quiroga
cristian quiroga 2016-11-12
Hola. Use el mismo código y el problema se debe a que en el archivo de texto hay código HTML tanto en la cabecera como al final del .txt. Debes borrarlas y luego correr el código. Veras que funciona. Saludos.

类别

Help CenterFile Exchange 中查找有关 Multidimensional Arrays 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by