Skocz do zawartości

BuxBleed

Użytkownicy
  • Zawartość

    71
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O BuxBleed

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Gliwice
  1. 1. Mam model matematyczny kamery, w sensie kalibruje kamerę za pomocą odpowiedniej funkcji w OpenCV używając do tego szachownicy.( współczynniki zniekształcenia, ogniskową, oraz centra optyczne(?) zapisane w postaci macierzy i wektorów) Może to jakoś wykorzystać ? 2. Ok 3. Na razie to pomińmy
  2. Potrzebuję wsparcia informacyjnego odnośnie projektu robota sterowanego wizyjnie. Na ten moment, mam robota który jeździ, nie ma osi skrętnej, skręcanie odbywa się różnicowo, czyli zmiana kierunków obrotu w silnikach. To sprawia że jest w stanie chociażby obrócić się o 180 stopni w miejscu, w praktyce wchodzi bezwładność i tak nie jest. Jest do niego dobrze zrobione sterowanie za pomocą akcelerometru w telefonie, dane wysyłane przez BlueTooth, kręcimy telefonem, robot jeździ skręca opuszcza pisak gdy wciśniemy przycisk jest ok. Wersja finalna ma umożliwić rysowanie jakichś prostych figur. Można to już zaimplementować w tym momencie, w sensie wgrać program który będzie rysował na przykład prostokąt i zobaczyć co z tego wyjdzie ( nie próbowałem ). Wówczas mamy otwarty układ regulacji, nie mamy informacji zwrotnej na temat sygnału wyjściowego ( czy już trzeba skręcić, podnieść pisak, zatrzymać się itp). No więc jeśli zamkniemy układ, to informacja wizyjna z obrazu będzie pełnić rolę ujemnego sprzężenia zwrotnego co przełoży się na lepszą dokładność sterowania i rysowania. Mam kamerkę dedykowaną do Raspbbery Pi, zawieszoną na suficie nad przestrzenią roboczą robota, dwa znaczniki wygenerowane za pomocą funkcji biblioteki OpenCV. Jeden na robocie drugi gdzieś w rogu przestrzeni roboczej. Znam wymiary jednego i drugiego. Położenie ich środków i wierzchołków. 1.Jestem w stanie policzyć odległość w linii prostej od środka jednego znacznika do drugiego znacznika, w pikselach na obrazie. Jak obliczyć ją w jednostkach odległości ? Znam wysokość na jakiej zawieszona jest kamera. 2. Jak obliczyć rotację układu współrzędnych związanych z robotem a układem który jest związany ze znacznikiem odniesienia? Mamy płaszczyznę 2D a więc, tylko współrzędną x i y no i potrzebowałbym jakoś obliczyć kąt o jaki obrócił się jeden układ względem drugiego dookoła osi z . 3. No i potrzebowałbym to jakoś połączyć w programie tak aby zadając punkt na obrazie z kamery robot poruszał się w linii prostej do niego, tyle by na początek wystarczyło. Nie pytam o implementację tylko o funkcjonalności jakie powinien posiadać program. Będę wdzięczny za wszelkie pomysły
  3. Tak, masz rację powinno to wyglądać z>= 1 && z <= 9. Po tej poprawce robot zdaje się poruszać mniej chaotycznie, jednak jest to wciąż dalekie od perfekcji. No mógłbym w zasadzie wypisywać to co wysyłam poniżej w jakimś TextBoxie i go aktualizować co jakiś czas używając Timera, albo też robot mógłby przesyłać informację zwrotną wysyłając natychmiast to co otrzymał.
  4. Po wielu dniach ciężkiej walki ogarnąłem mniej więcej ten problem. Steruje robotem za pomocą akcelerometru w telefonie, napisałem do tego aplikację w App Inventorze. Robot działa na silnikach krokowych sterowanych układem DRV8825 Mam jednak problem w odpowiednim odczytywaniu danych z akcelerometru. Pokręciłem sobie swoim telefonem w w każdy możliwy sposób i rozpisałem przedziały wartości jakie przyjmują odpowiednio współrzędne xyz po poszczególnych rotacjach. No i nie działa Robot reaguje na odczyt z akcelerometru no ale, świruje, zachowuje się nieprzewidywalnie i czasami w ogóle nie reaguje :/ Kod robota: #define L_DIR 2 #define R_DIR 3 #define L_STEP 9 #define R_STEP 8 //definicje pinów STEP i DIR na sterowniku DRV8825 void forward(); void backwards(); void right(); void left(); void setup() { Serial.begin(9600); pinMode(L_STEP, OUTPUT); pinMode(R_STEP, OUTPUT); digitalWrite(L_STEP,LOW); digitalWrite(R_STEP,LOW); digitalWrite(L_DIR,LOW); digitalWrite(R_DIR,HIGH); delay(1); } void forward() { digitalWrite(L_DIR,LOW); digitalWrite(R_DIR,HIGH); for(int i = 0 ; i<500; i++) { delayMicroseconds(50); digitalWrite(L_STEP,LOW); // sterowanie obydwoma silnikami poprzez podanie im impulsu co 500us digitalWrite(R_STEP,LOW); delayMicroseconds(50); digitalWrite(L_STEP,HIGH); digitalWrite(R_STEP,HIGH); } return; } void backwards() { digitalWrite(L_DIR,HIGH); digitalWrite(R_DIR,LOW); for(int i = 0 ; i<500; i++) { delayMicroseconds(50); digitalWrite(L_STEP,LOW); // sterowanie obydwoma silnikami poprzez podanie im impulsu co 500us digitalWrite(R_STEP,LOW); delayMicroseconds(50); digitalWrite(L_STEP,HIGH); digitalWrite(R_STEP,HIGH); } return; } void left() { digitalWrite(L_DIR,HIGH); digitalWrite(R_DIR,HIGH); for(int i = 0 ; i<500; i++) { delayMicroseconds(50); digitalWrite(L_STEP,LOW); digitalWrite(R_STEP,LOW); delayMicroseconds(50); digitalWrite(L_STEP,HIGH); digitalWrite(R_STEP,HIGH); } return; } void right() { digitalWrite(L_DIR,LOW); digitalWrite(R_DIR,LOW); for(int i = 0 ; i<500; i++) { delayMicroseconds(50); digitalWrite(L_STEP,LOW); digitalWrite(R_STEP,LOW); delayMicroseconds(50); digitalWrite(L_STEP,HIGH); digitalWrite(R_STEP,HIGH); } return; } void loop() { if (Serial.available()>0) { char data; data = (char)Serial.read(); switch(data) { case 'w': forward(); break; case 's': backwards(); break; case 'l': left(); break; case 'r': right(); break; } } } Schemat programu:
  5. Cześć, niedawno otrzymałem swoją malinkę. Zakupiłem ją do celów komputerowego przetwarzania obrazów. Postanowiłem skorzystać z biblioteki OpenCV i samemu skompilować ją wraz ze wszystkimi potrzebnymi dodatkami. Lecz przed właściwą kompilacją biblioteki natknąłem się na pewien problem z pewnymi plikami urządzeń znakowych jak sądzę. Nie posiadam jakiejś szczegółowej wiedzy na temat systemu Linux to też polegałem na tym co znalazłem w internecie no ale mimo tego nie udało mi się rozwiązać problemu... Wykonywałem wszystkie kroki po kolei tak jak przedstawia poniższy tutorial, aż w pewnym momencie otrzymałem jakiś konflikt plików którego nie udało mi się rozwiązać. Chodzi o te dwa pliki libpng-dev oraz libpng12-dev to są chyba jakieś pliki urządzeń znakowych ? Próbowałem je odinstalować i zainstalować jeszcze raz z tym samym skutkiem.
  6. Ja akurat operowałem na impulsach, policzyłem sobie że 1 impuls to 0.03925 mm drogi pokonanej przez robota i obrót o ok 0.02 stopnia względem drugiego koła. I teraz sobie operuje na tych wartościach. Zbocze narastające podaje na silnik co 0.1ms i to jest stałą wartością.
  7. No okej opanowałem trochę popisałem i policzyłem. Udało mi się sterować robotem za pomocą pewnego rodzaju komend: Znak 'f' lub 'F' Forward - robot jedzie do przodu o ileś tam centymetrów Znak 'b' lub 'B' Backwards - robot jedzie do tyłu o ileś tam centymetrów Znak 'r' lub 'R' Right - robot obraca się w prawo, w miejscu o 90 stopni Znak 'l' lub 'L' Left- robot obraca się w lewo, w miejscu o 90 stopni Znak 'o' lub 'O' obrót, literka r od rotate była zajęta - robot obraca się o 180 stopni No i podając przez terminal ciąg znaków dajmy na to "fbflro" robot wykonuje zadaną sekwencję ruchów. Dalej nie wiem co zrobić żeby to sterowanie nie było takie "sztywne" i umożliwiało bardziej swobodną kontrole nad robotem.
  8. No nie do końca, tak to wygląda. Po pierwsze bardzo bym chciał żeby środek ciężkości pokrywał się ze środkiem geometrycznym robota ale z przyczyn konstrukcyjnych jest to nie możliwe. Powiedziałbym że jest najbardziej jak tylko się da, można oczywiście obciążyć go dodatkowymi obciążnikami aby tak było. Czyli rozumiem że jak steruje sobie silnikami krokowymi o rozdzielczości 200 kroków, na driverze jest ustawiona rozdzielczoścć 1/32 kroku czyli najmniejszy kąt o jaki może obrócić się koło wynosi 360/(200*32) = 0,05625 stopnia. Promień koła wynosi 40mm czyli ze wzoru na długość łuku koła liczę sobie że przy zadanym kroku podanie jednego impulsu przesuwa robota o 0,03925mm. Czas podawania impulsu mogę sobie obrać dowolny podając go w funkcji delay() i z niego sobie jakoś wyliczam tą prędkość. Wszystkie obliczenia zakładają, że silnik nie gubi kroków. I potem staram się jakoś to przełożyć na sam kod tak żeby robot robił to co chce tak ?
  9. Cześć, mam problem z obmyśleniem algorytmu sterowania różnicowego do silników krokowych opartych na sterowniku DRV8825. Chodzi o to żeby korzystając z aplikacji, na androida wykorzystującej żyroskop i akcelerometr w telefonie sterować robotem. Apkę napiszę w android studio w języku Java, bo tak chyba jest najłatwiej. Jak w ogóle zabrać się za coś takiego ? Póki co to wiem jak ruszać robotem do przodu i do tyłu :/
  10. Nie mam jeszcze gotowego programu do tego projektu. Pisałem program wykrywający i namierzający wybrany kolor z przestrzeni HSV korzystając z kamerki internetowej 0.3mpx. No super namierzało pozycję kartki o wymiarach 6 cm x 6 cm nawet z kilku metrów. Działający program zajmował cały jeden rdzeń procesora i7 7700HQ. Ze znacznikami aruco nic jeszcze nie robiłem.
  11. No to chyba zdecyduje się na zakup Raspberry Pi Camera HD v2 8MPx, myślę chyba będzie najlepszą opcją.
  12. Jeden znacznik odniesienia może być nawet A4, openCV ma bibliotekę do generowania i przetwarzania takich znaczników, więc kod jest już jak sądzę dobrze zoptymalizowany. Z drugim będzie już gorzej, bo będzie miał wymiary maksymalnie 5cm x 5cm do tego kamerka na wysokości około metra, zawieszona na suficie czy jakimś gimbalu. BTW: Za rok mam kończę inżynierkę, może malina pozwoliłaby mi zrobić jakiś ciekawy projekt na pracę dyplomową ?
  13. Na pewno potrzebowałbym właśnie wykrywania tych znaczników bo właśnie realizuje taki projekt, więc między innymi potrzebowałbym czegoś co by wykrywało położenie jednego znacznika względem drugiego będącym odniesieniem. Możliwie najszybciej jak się da
  14. No jak nietrudno się domyślić zależy mi na zredukowaniu opóźnień do minimum. Może nieprecyzyjnie się wyraziłem, określenie "w czasie rzeczywistym" miało określać natychmiastową reakcje układu, z punktu widzenia człowieka, dla procesora to cała wieczność . Chodzi mi o takie zastosowania w robotyce mobilnej na przykład: roboty śledzące, sterowane wizyjnie manipulatory, wykrywanie kodów QR, wykrywanie obiektów (twarze, gesty, tablice rejestracyjne etc.) Mam wątpliwości szczególnie co do tego ostatniego. Spotkałem się z opiniami na zagranicznych forach jakoby Raspberry Pi jest za słabe do takich celów. Nigdy wcześniej nie miałem do czynienia z minikomputerami. Jedynie z arduino i uC, wybór padł na malinę bo ma najlepsze wsparcie, najłatwiej będzie znaleźć pomoc. Jednak jeśli były by jakieś równie ciekawe platformy których kwota zamknęła by się w powiedzmy 700zł wliczając w to minikomputer, kamere, zasilacz i całe te akcesoria to zamieniam się w słuch
  15. Więc po prostu dedykowana kamerka ? Chodzi mi o zastosowania w robotyce mobilnej, żadne robienie zdjęć i kręcenie filmów. Tylko odbieranie obrazu i przetwarzanie go w czasie rzeczywistym.
×
×
  • Utwórz nowe...