- The nested loops over the grid cells (i and j) are not necessary for the random walk. The focus should be on the robot's current position and check for obstacles around it.
- You need to check the occupancy of the grid at the robot's current position, and not at all positions in the grid.
Obstacle avoidance using Occupancy grid
7 views (last 30 days)
Show older comments
Hi,
I was trying to write a simple obsatcle avoidance code using an occupancy grid. My robot (a point) was suppose to do a random walk and take a 90-degree turn when it came close to a an obstacle. I do manage to create a random walk and an occupancy grid, although the obstacle avoidance loop doesn't work.
map = robotics.BinaryOccupancyGrid(20,20);
xy = [5 5; 3 2; 8 6; 10 15; 15 20; 9 8; 15 15];
setOccupancy(map,xy,1);
show(map);
hold on
grid on
maxSteps=20;
x = zeros(maxSteps);
y = zeros(maxSteps);
for i=1:20
for j=1:20
occval(i,j)= getOccupancy(map,[i j]);
for stepNumber = 2: maxSteps
if occval(i,j)==1
x(stepNumber) = x(stepNumber-1);
y(stepNumber) = y(stepNumber-1);
else
angle = 360 * rand;
radius = 10*rand;
x(stepNumber) = x(stepNumber-1)+radius * cosd(angle);
y(stepNumber) = y(stepNumber-1)+radius * cosd(angle);
end
end
end
end
plot(x,y)
0 Comments
Answers (1)
ag
on 5 Nov 2024 at 10:32
Hi Tanya,
I understand that you're trying to simulate a random walk with obstacle avoidance using an occupancy grid in MATLAB. However, your current approach has a few issues that need to be addressed to make the obstacle avoidance work correctly:
Below is the modified code snippet:
map = robotics.BinaryOccupancyGrid(20, 20);
xy = [5 5; 3 2; 8 6; 10 15; 15 20; 9 8; 15 15];
setOccupancy(map, xy, 1);
show(map);
hold on;
grid on;
maxSteps = 200;
x = zeros(1, maxSteps);
y = zeros(1, maxSteps);
% Initial position of the robot
x(1) = 1;
y(1) = 1;
for stepNumber = 2:maxSteps
% Move in the chosen direction
radius = 1; % Step size
angle = 360 * rand; % Randomly choose any direction
x(stepNumber) = x(stepNumber-1) + radius * cosd(angle);
y(stepNumber) = y(stepNumber-1) + radius * sind(angle);
currDir = 0;
% Check occupancy at the current position
while getOccupancy(map, [x(stepNumber), y(stepNumber)]) == 1 && currDir < 5
% If occupied, take a turn
angle = 90 * currDir;
x(stepNumber) = x(stepNumber-1) + radius * cosd(angle);
y(stepNumber) = y(stepNumber-1) + radius * sind(angle);
currDir = currDir + 1;
end
% If can't find an obstacle free next step, exit
if currDir == 5
x(stepNumber) = 0;
y(stepNumber) = 0;
break;
end
% Ensure the robot stays within the grid boundaries
x(stepNumber) = max(1, min(x(stepNumber), 20));
y(stepNumber) = max(1, min(y(stepNumber), 20));
end
plot(x, y, '-o');
Hope this helps!
0 Comments
See Also
Categories
Find more on Robotics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!