5. Алгоритм навигации робота
Автор
In [ ]:
cd( @__DIR__ );
include( "room_functions.jl" );
gr();
In [ ]:
function поворот( a::CartesianIndex, b::Number )
vecA = [ a[1], a[2] ];
rotM = [ cosd(b) sind(b)
-sind(b) cosd(b) ]
CartesianIndex( (Int.(round.(rotM * vecA )))...)
end;
In [ ]:
стена = true; проезд = false;
не_посещали = 1; посетили = 2;
не_знаю = 1; здесь_стена = 2; можно_ехать = 3;
In [ ]:
function шагаем( положение, направление, изученная_карта, пройденная_карта, вся_карта )
пройденная_карта[ положение ] = посетили
точка_впереди = положение + направление
if вся_карта[ точка_впереди ] == стена изученная_карта[ точка_впереди ] = здесь_стена;
else изученная_карта[ точка_впереди ] = можно_ехать; end;
# Пока что наш робот всегда двигается в заранее выбранном направлении
следующая_точка = точка_впереди;
# Если наши представления о карте говорят нам, что здесь стена или что мы здесь были...
if изученная_карта[ точка_впереди ] == здесь_стена # || пройденная_карта[ точка_впереди ] == посетили # Задание: раскомментировать!
# ...придется повернуть, так или иначе
направление = поворот( направление, -90 )
else
# ...иначе двигаемся, но учитываем реальность
if вся_карта[ точка_впереди ] == проезд положение = точка_впереди; end;
end
return положение, направление, изученная_карта, пройденная_карта
end;
In [ ]:
направление = CartesianIndex( 1, 0 );
карта, старт = gen_room( 30, 20, 6, 5);
положение = CartesianIndex( старт... );
путь = [ Tuple(положение) ];
пройденная_карта = не_посещали .* ones( size(карта)... );
изученная_карта = не_знаю .* ones( size(карта)... );
изученная_карта[ положение ] = можно_ехать;
for i = 1:400
положение, направление, изученная_карта, пройденная_карта =
шагаем( положение, направление, изученная_карта,
пройденная_карта, карта )
push!(путь, Tuple( положение ))
end
heatmap( карта', c=:grays, aspect_ratio=:equal, leg=:false )
plot!( first.(путь), last.(путь), lw=1 )
spy!( изученная_карта', c=:reds, markersize=3 )
scatter!( [старт[1]], [старт[2]], shape=:xcross, msw=5 )
scatter!( [положение[1]], [положение[2]], markersize=5 )
Out[0]: