====== Poruszanie się wzdłuż linii ====== Poniżej znajdują się algorytm sterowania wykorzystujący **sensor natężenia światła**. ===== Algorytm 1 ===== Aby sprawdzić działanie algorytmu należy przygotować makietę z narysowaną czarną linią (najlepiej na białym tle). W algorytmie założono, że robot znajduje się na czarnej linii w chwili startu. Zadaniem robota jest poruszanie się wzdłuż linii. ==== Zapis słowny ==== - jedź do przodu jeżeli widzisz czarną linię, inaczej idź do pkt (2) - obracaj się w prawo o N0 póki obrót < 450. Jeżeli linia czarna idź do (1). Jeżeli obrót > 450 idź do (3). - obróć się w lewo o 450. Obracaj się o -N0 w lewo póki obrót > -450. Jeżeli linia czarna idź do (1). Jeżeli obrót < -450 to STOP ==== Zapis regułowy ==== Poniżej został zastosowany zupełny zapis reguł. W zapisie w Prologu zapis ten ulegnie zmianie. Rule: 1 if light_value == 'black' then go = 1 and trun_mem = 0 Rule: 2 if light_value != 'black' and turn_mem in [0,45) then turn = 1 and turn_mem += turn Rule: 3 if light_value != 'black' and turn_mem in (-45,0) then turn = 1 and turn_mem += turn Rule: 4 if light_value != 'black' and turn_mem >= 45 then turn = -turn_mem and turn_mem = -1 Rule: 5 if light_value != 'black' and turn_mem not in (-45,0) and not in [0,90) then STOP ==== Implementacja w Prologu ==== start :- nxt_light_sensor(Port,Value), Value = RGB_black, assert(turn_mem(0)), nxt_go(1). start :- turn_mem(Value), Value >= 0, Value < 45, nxt_turn(Speed,1) retractall(turn_mem(_)), increment(Value,X), assert(turn_mem(X)). start :- turn_mem(Value), Value >= 45, nxt_turn(Speed,-Value), retractall(turn_mem(_)), assert(turn_mem(-1)). start :- turn_mem(Value), Value < 0, Value > -45, nxt_turn(Speed,-1), retractall(turn_mem(_)), decrement(Value,X), assert(turn_mem(X)). start :- nxt_go(0). ==== XTT ==== {{:pl:miw:miw08_mindstormsdesign:alg5.png|XTT}} {{:pl:miw:miw08_mindstormsdesign:alg6.png|XTT2}} UWAGI!!! FIXME * Problem z wpisaniem wartości z ujemną wartością