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.- 然后在球周围添加一个额外的安全区域,而不是你的机器人所在的点。
是的,您可能实际上希望机器人撞击某个表面,但如果您不控制机器人何时不撞击物体,您将无法知道在何处/何时/如何让它撞击任何表面很快就会选择。