Skocz do zawartości

BuxBleed

Użytkownicy
  • Zawartość

    71
  • Rejestracja

  • Ostatnio

Wszystko napisane przez BuxBleed

  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.
  16. Planuję zakup Raspbbery Pi 3 wraz z podstawowymi akcesoriami i kamerką. Głównym powodem jest nauka linuksa, programowania, potrzebuję też jakiejś platformy żeby odpalić na niej system wizyjny do robota mobilnego. Martwią mnie ciężkie obliczenia numeryczne których wymaga cyfrowe przetwarzanie obrazów, korzystam z biblioteki OpenCV. Pomyślałem, że dobrym pomysłem był by zakup kamery z własnym procesorem który już wstępnie by konwertował obraz do jakiegoś jpeg i wysyłał go przez jakąś magistralę ( I2C, SPI, UART) do maliny w celu dalszego przetworzenia. Pozwoliło by to po części odciążyć główny procesor maliny od obliczeń numerycznych ( przynajmniej w teorii). Mój skromny budżet wynosi 250zł. Mam na oku 2 kamerki: Kamerka1 - Duża ilość FPS. Tutaj martwi mnie niska rozdzielczość VGA i programowanie w Pythonie, nie znam tego języka. Wydaje mi się że C++ byłby dużo lepszy jeśli głównym celem jest optymalizacja działania programu. Kamerka2 - Duża rozdzielczość i sporo FPS, niestety małe pole widzenia. Jeśli macie jakieś propozycje, tudzież rady co do zakupu kamerki bądź inne wskazówki to bedę bardzo wdzięczny. Pozdrawiam
  17. No kupowałem ze sklepu Botland, ale to było rok temu. Nie mam już nawet oryginalnego opakowania. To było hurtowe zamówienie robione przez kolegę z koła studenckiego który zamówił płytki dla kilkudziesięciu osób. Chyba nic się nie da zrobić :/
  18. Jak to reklamacji ? W sensie mogę ją odesłać producentowi Arduino we Włoszech i mi ją za darmo naprawi? Poza tym jakby nie patrzeć to ona popsuła się z mojej winy. Choć nie wiem jak i kiedy :/
  19. Napięcie 7,7V zmierzyłem miernikiem na wyjściu 5V z adruino (gdzie powinno być 5V ale było ponad 7,7V), oraz na każdym innym pinie GPIO, który powinien pracować na logice 5V. Płytkę zasilałem zasilaczem impulsowym 12V z sieci, przez gniazdo DC, potem spróbowałem również przez Vin z tym samym napięciem i problem się powtórzył. Generalnie procek się bardzo nagrzewa, i najprawdopodobniej przy dłuższej pracy by się spalił. Jak wszystko jest zasilane przez USB to działa tak jak powinno.
  20. Mam problem ze swoją płytką. Z niewiadomego powodu wszystko działa na napięciu 7,7V co sprawia że układ nie działa zgodnie z oczekiwaniem. Gdy podłączone płytka jest podłączona do USB napięcie wynosi tyle ile powinno czyli 4,7-5V gdzieś w tych granicach. Czy to oznacza że spaliłem stabilizator ? Da się to jakoś naprawić. Bo potrzebował bym zasilać to z sieci/akumulatorka. A programy i cała reszta działają poprawnie ( dają się wgrywać, i poprawnie się wykonują) jak arduino jest podłczone do tylko do USB.
  21. No wszystko działa poprawnie, za wyjątkiem tego modułu, diody świecą się, silniki się kręcą w jedną stronę. A znak podany z terminala miał zmieniać ich kierunek. No najzwyczajniejszy Akumulator litowo-polimerowy dający napięcie 11,7V z którego zasilane jest arduino i cały układ.
  22. Witam, mam problem ze sterowaniem silnikami krokowymi przez terminal Bluetooth w telefonie. Używam płytki Arduino Mega2560 w wersji oryginanej, nie żaden klon. Otóż, jeśli arduino jest zasilane z kompa przez USB to wszystko działa super. Łącze się poprzez terminal w telefonie i komunikacja przebiega prawidłowo. Problemy zaczynają się kiedy arduino i silniki krokowe są zasilane z jednego źródła, w tym przypadku ogniwo Li-Pol. Znowuż łączę się przez terminal w telefonie, stosowna dioda na module XM-15B zaczyna ciągle się świecić sygnalizując nawiązanie połączenia. No i w ogóle program nie odpowiada, zero jakichkolwiek reakcji ze strony programu. Nie wiem co może być nie tak, w końcu różni się to tylko sposobem zasilania układu. Oto kod programu: #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 setup() { Serial3.begin(9600); pinMode(L_STEP, OUTPUT); pinMode(R_STEP, OUTPUT); for(int i=0;i<6;i++) { pinMode(22+i,OUTPUT); // Ustawiam wszystkie piny do regulacji wielkosci krokow MO,M1,M2 na obu driverach jako wyjscie } for(int i=0;i<6;i++) { digitalWrite(22+i,HIGH); // Ustawiam stan wysoki na wszystkich pinach MO,M1,M2 na obu driverach } digitalWrite(L_STEP,LOW); digitalWrite(R_STEP,LOW); digitalWrite(L_DIR,LOW); digitalWrite(R_DIR,HIGH); delay(2000); } void dir() { if (Serial3.available()>0) { char data=(char)Serial3.read(); if(data=='k') { delay(1); Serial3.println("ZMIANA KIERUNKU"); digitalWrite(L_DIR,HIGH); digitalWrite(R_DIR,LOW); } else { delay(1); Serial3.println("NIC SIE NIE DZIEJE"); } } } void loop() { dir(); delayMicroseconds(500); digitalWrite(L_STEP,LOW); // sterowanie obydwoma silnikami poprzez podanie im impulsu co 500us digitalWrite(R_STEP,LOW); delayMicroseconds(500); digitalWrite(L_STEP,HIGH); digitalWrite(R_STEP,HIGH); }
  23. Cóż, na ten moment potrzebowałbym jedynie jakiejś kamerki podłączonej do laptopa i przesyłania obrazu z kamery ( w trybie rzeczywistym) wraz z jakimś dłuższym kablem 2-3m o rozdzielczości powiedzmy kilka mpx, cena do 100zł. No i żeby mi współpracowała z OpenCV i Visual Studio Może coś polecicie ?
  24. A może byc jakiś tańszy chiński zamiennik tego cudeńka ? Edit: Na przykład coś takiego :LINK
×
×
  • Utwórz nowe...