Witajcie!
Dzisiaj postanowilam wrocic do tematu LEGO na prośbę @imperfect-one i opisać jeden z ostatnich moich projektów.
Czego dotyczył projekt?
Celem zadania było zaprogramowanie robota w taki sposób, aby poruszał się zgodnie z ruchem osoby wykrytym przez Kinect.
Pozycja wyjściowa osoby to pozycja z wyprostowanymi rękoma w pozycji horyzontalnej. Ruch robota zależy od ruchów wykrytych przez Kinect:
- Uniesienie rąk w górę - jazda robota wprzód (działa silnik lewy i prawy, prędkość poruszania zależy od uniesienia rąk - im wyżej tym robot porusza się szybciej,
- Opuszczenie rąk w dół - jazda robota w tył (działa silnik lewy i prawy, prędkość poruszania zależy od uniesienia rąk - im niżej tym robot porusza się szybciej,
- Uniesienie prawej ręki w górę - jazda robota do przodu, w lewo (działa tylko prawy silnik, prędkość poruszania zależy od uniesienia ręki - im wyżej tym robot porusza się szybciej,
- Uniesienie lewej ręki w górę - jazda robota do przodu, w prawo(działa tylko lewy silnik, prędkość poruszania zależy od uniesienia ręki - im wyżej tym robot porusza się szybciej,
- Opuszczenie prawej ręki w dół - jazda robota w tył, w lewo (działa tylko prawy silnik, prędkość poruszania zależy od uniesienia rąk - im niżej tym robot porusza się szybciej,
- Opuszczenie lewej ręki w dół - jazda robota w tył, w prawo (działa tylko lewy silnik, prędkość poruszania zależy od uniesienia rąk - im niżej tym robot porusza się szybciej.
W celu rozpoznania ruchu ręki wzięłam pod uwagę parę stawów: ramię - nadgarstek.
Jeżeli pozycja ręki jest nam już znana, należy obliczyć kąt jaki jest między ramieniem a nadgarstkiem. W tym celu korzystamy z arctg(x), gdzie x to wartość bezwzględna dwóch wartości.
Wyliczone wartości kodu są podawane do asynchronicznej metody wraz z aktualnym położeniem ręki, dzięki czemu robot wie jak ma się poruszać.
Celem wspomnianej już metody jest wysłanie wartości do wybranego silnika naszego robota (trzeba pamiętać, aby dobrze skonfigurować porty - w przeciwnym razie robot nie bedzie dzialal po naszej myśli). W tym celu najpierw trzeba obliczyć wartość kąta w radianach.
Dodatkowo, zostało nałożone ograniczenie na uzyskaną wartość. Wyliczona wartość musi mieścić się w przedziale [-100, 100].
Dodatkowo, uwzględniono również położenie rąk - jeżeli są one skierowane ku dołowi nasz robot powinien poruszać się do tyłu, dlatego otrzymaną wartość mnożymy x -1.
Problemy
Problematyczne okazało się korzystanie z zewnętrznego bluetootha (komputer stacjonarny), ponieważ co jakiś czas połączenie zostało zrywane, dlatego też urzadzenie trzeba było parować, co nie było takie łatwe, gdyż bluetooth nie był widziany przez komputer. Prawdopodobnie używanie laptopa byłoby mniej problematyczne z powodu wbudowanego bluetootha już do komputera.
Dzięki udostępnionych na stronach producenckich API urządzeń zsynchronizalam działania obu urządzeń.
A ty to robisz tak hobbistycznie dla zabawy czy ktoś to sponsoruje?
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
hobbistycznie :) nie, nie mam sponsora :)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Super sprawa! Wyliczenia nie wydają sie nazbyt trudne, można to zrobic samemu. Jednak pewnie trudność jak zwykle w szczegołach. Skąd czerpiesz wiedze o tym jak to rozwalić albo poradzić sobie gdy przyjdzie zacięcie?
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit