Jak zaprogramowac robota LEGO Mindstorms, aby poruszał się zgodnie z ruchem osoby wykrytym przez Kinect?

in #polish7 years ago (edited)

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.

l.png

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.

k.png

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 jak maja sie Wasze projekty w oparciu o LEGO? Co ostatnio ciekawego zrobiliscie?

Sort:  

A ty to robisz tak hobbistycznie dla zabawy czy ktoś to sponsoruje?

hobbistycznie :) nie, nie mam sponsora :)

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?

Coin Marketplace

STEEM 0.19
TRX 0.12
JST 0.030
BTC 60756.34
ETH 3373.61
USDT 1.00
SBD 2.51