如何测量机器人中心到障碍物的距离?

问题描述 投票:0回答:2

我想根据与障碍物的距离来确定机器人的方向,但我不知道如何测量机器人中心到周围障碍物的距离。

matlab orientation robotics
2个回答
0
投票

1.- 获取/构建准确的地图

让我们开始对提供的可能进行二值化,并将点机器人放置在排除所有障碍点的随机位置。

close all;clear all;clc

% get the map
A1=imread('001.jpg');  % this is your map in question
% figure;imshow(A1)
A2=~imbinarize(A1(:,:,1));
figure(1);
ax1=gca;imshow(A2)

[ny,nx]=size(A2);
[X,Y]=meshgrid(1:nx,1:ny);

% obstacles
P1=[140 311; 153 311; 153 7; 140 7; 140 311];          % 140 311 153 7    
P2=[374 491; 386 491; 386 186; 374 186; 374 491];      %  374 491 386 186
P3=[1 497; 496 497; 496 492; 1 492; 1 497];   %  1 497 496 492
P4=[1 6; 496 6; 496 1; 1 1; 1 6];   % 6 1 496 1
P5=[1 491; 3 491; 3 7; 1 7; 1 491];  % left frame 1 491  3 7
P6=[492 491; 496 491; 496 7; 492 7; 492 491];  % right frame  %  492 491 
Pobst=[P1(:);P2(:);P3(:);P4(:);P5(:);P6(:)];
Nobst=6;
Po

bst=reshape(Pobst,[size(P1,1),size(P1,2),Nobst]);

% map points where bot cannot be 
[in1,on1]=inpolygon(X(:),Y(:),P1(:,1),P1(:,2));
[in2,on2]=inpolygon(X(:),Y(:),P2(:,1),P2(:,2));
[in3,on3]=inpolygon(X(:),Y(:),P3(:,1),P3(:,2));
Xout=X(~in1 & ~in2 & ~in3);Yout=Y(~in1 & ~in2 & ~in3);

% dropping bot on random location, excluding obstacle points
nP2=randi([1 numel(Xout)],1,1);
Pnet=[Xout(nP2) Yout(nP2)];
% Pnet=[47 365];  % static test point

hold(ax1,'on')
plot(ax1,Pnet(1),Pnet(2),'or','LineStyle','none');

2.- 360° 扫描

现在让我们进行 360° 光线扫描。

不使用角度,而是直接覆盖所有外周点,无论机器人位于何处。

Ns=2*size(A2,1)+2*size(A2,2)-4;  % amount outer perimeter points 

% outer perimeter defined starting top left corner and then CW
P0=[ones(1,size(A2,1))  2:1:size(A2,2)-1                       size(A2,2)*ones(1,size(A2,1))    size(A2,2)-1:-1:2;          % x
       1:1:size(A2,1)        size(A2,1)*ones(1,size(A2,2)-2) size(A2,1):-1:1                         ones(1,size(A2,2)-2)]';    % y

PR=[0 0];
for k1=1:10:Ns
    L2=floor(linspace(Pnet(2),P0(k1,1),max([Pnet(1) Pnet(2) abs(P0(k1,2)-Pnet(2)) abs(P0(k1,1)-Pnet(1)) ]) ));   % x
    L1=floor(linspace(Pnet(1),P0(k1,2),max([Pnet(1) Pnet(2) abs(P0(k1,2)-Pnet(2)) abs(P0(k1,1)-Pnet(1)) ]) ));   % y
   
    p1=1;
    while A2(L2(p1),L1(p1))==0
        p1=p1+1;
    end
    PR=[PR;L1(p1) L2(p1)];   % logging perimeter point [x y]
           
end
PR(1,:)=[];

变量

PR
包含您要求的特定机器人位置的积分
Pnet

快速检查所有光线和最近的障碍点是否正常

for k2=1:10:Ns
    plot(ax1,PR(k2,1),PR(k2,2),'r*')
    plot(ax1,[Pnet(1) PR(k2,1)],[Pnet(2) PR(k2,2)],'g-') 
end

3.- 对获得的周长进行评论

此时,对于特定的机器人位置

Pnet
,可变周长
PR
包含所有最近的障碍点。

如此处所示,

PR
中的周边障碍点是/属于靴子应避开的硬障碍物的第一个点。

因此,机器人不应该考虑这一点,而是考虑第一个可用的点,即沿着每条射线距离机器人更近 1 个像素,这不是任何障碍物的一部分。

4.-不要使用机器人中心点来知道何时/何地/如何避开障碍物

在进行避障工作时,机器人的中心几乎没有任何用处。是的,您可以使用它进行一些计算 但只要将机器人视为一个点,您的机器人就有可能击中目标。

我的建议是:

4.1.-找到机器人的最远点,而不是机器人的中心

4.2.- 假设机器人是一个半径为最远点的球

4.3.- 然后在球周围添加一个额外的安全区域,而不是你的机器人所在的点。

是的,您可能实际上希望机器人撞击某个表面,但如果您不控制机器人何时不撞击物体,您将无法知道在何处/何时/如何让它撞击任何表面很快就会选择。


-1
投票

我认为这可能取决于你的机器人如何移动。例如,如果您的机器人导航算法引导机器人一次向一个方向移动(沿 XoY 空间中的轴先 x 然后 y,或 y 然后 x),则曼哈顿距离 会更合适,如图所示下图。 黄色蓝色距离是相同的,而绿色距离是欧几里得距离,稍后将介绍。

然而,大多数现代机器人可能朝任何方向移动,而不是一次移动一个方向。但从 A 点到 B 点,直线显然是节省大量精力的最佳解决方案。然后,应选择欧氏距离,如下所示。

© www.soinside.com 2019 - 2024. All rights reserved.