Hello. I have two occupancy grid. In one, I expect to generate a roadmap (PRM - probabilistic roadmap) with 100 nodes. Later, I want to reproduce the same nodes in the second map. 1: I'd like to handle the X Y variable of all nodes randomly generated in grid_1. How can I do that, please? Also, how to know the total number of paths generated? 2: Although I can't handle the random nodes, I'm able to replicate them using rng (random number generator), but in case the node in the second map is located in an occupated area, the algorithm generates another random number, which this is not what I want. For example, in grid_1, 100 nodes were generated. From those, only 90 is located in the free area on the grid_2, so I'd like to reproduce only those 90. So far, this is how my code is: image_1 = imread('image_1.pgm'); image_1 = image_1 < 250; % convert it to binary map_1 = binaryOccupancyMap(image_1, 0.05); % convert it to occupancy grid map rng(1) % save the random number generator prm_1 = mobileRobotPRM(map_1, 100); % PRM show(prm_1) % show paths, nodes and grid all together image_2 = imread('image_2.pgm'); % load a different but pretty similar grid map image image_2 = image_2 < 250; map_2 = binaryOccupancyMap(image_2, 0.05); rng(1) % use the saved random number generated prm_2 = mobileRobotPRM(map_2, 100); show(prm_2) And this is my images:
Kshitij Singh answered .
2025-11-20
Let's break down your requests step-by-step:
To handle the X, Y variables of all nodes randomly generated in grid_1 using a PRM (Probabilistic Roadmap), you can store the nodes in a matrix or array after they are generated. Here’s how you can do it:
% Define the grid (example size 10x10)
grid_1 = zeros(10, 10);
% Set the number of nodes
numNodes = 100;
% Generate random nodes
nodes = rand(numNodes, 2) .* size(grid_1);
% Store the nodes
x = nodes(:, 1);
y = nodes(:, 2);
% Display total number of paths (depends on PRM configuration)
prm = robotics.PRM;
prm.NumNodes = numNodes;
prm.ConnectionDistance = 2; % Example distance
% Generate roadmap
prm = robotics.PRM(grid_1, 'NumNodes', numNodes);
show(prm); % Visualize the PRM
% Get total number of paths
paths = prm.Connections;
numPaths = sum(sum(paths ~= 0)) / 2;
disp(['Total number of paths generated: ', num2str(numPaths)]);
To replicate nodes in grid_2 and filter out nodes that are in occupied areas, you can check the nodes against the occupancy grid and store only the valid ones:
% Define the second grid (example size 10x10 with some occupied areas)
grid_2 = zeros(10, 10);
grid_2(3:4, 3:4) = 1; % Example occupied area
% Initialize new node list
validNodes = [];
% Check each node
for i = 1:numNodes
if grid_2(round(nodes(i, 1)), round(nodes(i, 2))) == 0
validNodes = [validNodes; nodes(i, :)];
end
end
% Display number of valid nodes
disp(['Number of valid nodes in grid_2: ', num2str(size(validNodes, 1))]);
% Show valid nodes on grid_2
scatter(validNodes(:, 1), validNodes(:, 2), 'filled');
title('Valid Nodes in Grid 2');
Step 1: Store the X, Y coordinates of the generated nodes.
Step 2: Use robotics.PRM to generate the roadmap and display the total number of paths.
Step 3: Filter nodes based on their location in grid_2, and store only the valid nodes.