Mechatronik/robotyk - ścieżka rozwoju kariery

Odpowiedz Nowy wątek
2015-08-17 19:54

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

1

Cześć,

Mam 21 lat, studiuję na Wydziale Mechatroniki PW (kierunek AiR, specjalność Robotyka), niedługo rozpoczynam 3 rok. Od marca tego roku pracuję w małym biurze konstrukcyjnym na pół etatu jako inżynier/programista systemów wbudowanych - zajmuję się projektem związanym z "visual servoing", wykorzystuję do tego C++, platformy sprzętowe to Raspberry Pi (OpenCV + Python) i Arduino, do pisania aplikacji na PC wykorzystuję Qt.
Od około 4 lat mam styczność z programowaniem (C++, SPOJ, systemy wbudowane w C, później Qt) - ogólnie rzecz ujmując moje zainteresowania obracają się wokół mechatroniki (zajmuję się też zagadnieniami "mechanicznymi" - modelarstwo RC, coptery, ostatni duży projekt to elektryczny mountainboard).

Z pracy jestem zadowolony, projekt jest dla mnie bardzo interesujący, ale jest pewien szkopuł - w firmie jedyną osobą, która zajmuje się tym projektem jestem ja. Szef nie jest związany z programowaniem/embedded i współpraca opiera się na pokazywaniu rezultatów i uzgadnianiu kolejnych kroków - gdy coś nie działa to sam muszę szukać rozwiązań. Czego się obawiam - że powstanie ze mnie programista "potworek" ze złymi praktykami.
Idealną sytuacją dla mnie byłoby gdyby w projekcie uczestniczył ktoś, kto skomentuje mój kod/rozwiązanie i powie np. "Tak tego się nie robi, zobacz tu...". Nie oczekuję na prowadzenie za rączkę, ale jednak fajnie byłoby jakby był ktoś z doświadczeniem od czasu do czasu nadzorujący co robię.

No i dochodzimy do mojego pytania: co robić w obecnej sytuacji? W przyszłości chciałbym się zajmować programowaniem.
Moje opcje to: zachować status quo i samodzielnie męczyć się z pojawiającymi problemami i po pracy uzupełniać "niedostatki" wynikające z jednoosobowego teamu książkami (jakość kodu?), tworzeniem własnych projektów. Druga opcja to poszukać innej pracy w większym projekcie- tylko pytanie jaka jest szansa znalezienia pracy z tak elastycznymi godzinami jak mam teraz...

Próbka mojego kodu z projektu (pisany około rok temu) do ewentualnej ewaluacji moich umiejętności: https://github.com/Lukaszm94/PomodoroII

Z góry dzięki za odpowiedzi/podpowiedzi i sugestie :)

Pozostało 580 znaków

2015-08-17 20:13
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

4

Patrzą po kodzie mogę powiedzieć tylko jedno:

Otwieram pierwszy plik z brzegu a tam:

inline void update() volatile { //called every 5ms
        if(counterState == debouncing) {
            if(pressLengthMs >= debounceDelay) {
                counterState = counting;
                pressLengthMs = 0;
                return;
            }
            pressLengthMs += updateIntervalMs;
            return;
        }
        if(isButtonPressed()) {
            if(counterState == notCounting) {
                counterState = debouncing;
                return;
            }
            if(counterState == counting) {
                pressLengthMs += updateIntervalMs;
                return;
            }
        }
        else { //when button is released
            if(counterState == counting) {
                if(pressLengthMs <= shortPressMaxTime) {
                    lastAction = shortPress;
                    counterState = notCounting;
                    pressLengthMs = 0;
                }
                else if(pressLengthMs > shortPressMaxTime) {
                    lastAction = longPress;
                    counterState = notCounting;
                    pressLengthMs = 0;
                }
            }
            else {
                pressLengthMs = 0;
                counterState = notCounting;
            }
        }
    }

Nie dało sie tych rozgałęzień popakować w jakieś sensownie nazwane metody? Inaczej czyta sie kod

if(buttonPresssed()){
  pressedActions();  
}else{
  releasedActions();
}

A inaczej takiego potworka którego tam zrobiłeś.

Otwieram inny losowy plik a tam:

void uart_puts(char *s)     // wysyła łańcuch z pamięci RAM na UART

Skoro musiałeś napisać ten komentarz to dlaczego nie nazwałeś tej funkcji sendStringFromRAMToUART? o_O
Albo

 while ((c = *s++)) uart_putc(c);           // dopóki nie napotkasz 0 wysyłaj znak

Ja wiem ze pr0 hackerski zapis, ale skoro musisz postawić taki komentarz to czemu nie napisać czytelnego kodu?

while(character!=0){
    sendCharacter(character);
}

A tego to w ogóle nie rozumiem:

// sprawdzamy czy indeksy są równe
    if ( UART_RxHead == UART_RxTail ) return 0;

Co ten komentarz wnosi? o_O Aż kusi mnie przeglądnąć kod żeby sprawdzić czy gdzie nie masz klasycznego int x; //zadeklarowanie zmiennej int :D


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-08-17 20:23

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

0

Bardzo dziękuję za kopniaka ;)
Pierwsza uwaga jak najbardziej celna. Niestety z pozostałymi to tak nie do końca moja wina- biblioteka wzięta bezpośrednio z książki o programowaniu AVR-ów w C. Dobry dowód na to, że trzeba się pilnować co się czyta.

Edit: Dodam jeszcze, że takiej sytuacji się obawiałem. Tworzę sobie jakimś tam "shitty code", działa i robi co trzeba, to jak mi nikt nie powie, że jest słaby i tak się tego nie robi, to pewnie następnym razem zrobię tak samo. A w "normalnym" ( > 1 osoba) teamie jest feedback (lepszy lub gorszy) i jakoś wiedza i umiejętności się rozwijają.

edytowany 1x, ostatnio: Lukaszmey, 2015-08-17 20:33

Pozostało 580 znaków

2015-08-17 21:24

Rejestracja: 6 lat temu

Ostatnio: 4 godziny temu

2

@Lukaszmey nawyki z Kardasia?

@Shalom głupio to zabrzmi, ale dla AVRa opakowanie tych ifów w metody to już może być ładne przepakowanie RAMu przy wywołaniu. Oczywiście to strzał na ślepo i jeżeli się mylę, to warto byłoby napisać to tak jak Ty podałeś. Ale mogę się nie mylić i wtedy komentarz, że stosu brakuje powinien wystarczyć. A uwierz, potrafi braknąć.
Zwłaszcza, że Autor pisze w CPP, mam nadzieję że chociaż kompiluje to z no-rtti i no-exceptions.

Natomiast czego ja się przypnę: sterowanie pinami w oparciu o template jest słabe, bo nagenerujesz od cholery prawie zduplikowanego kodu. Przekaż lepiej wskaźnik/referencję do peryferiala i załatw to w run-timie. Opakuj jakoś ładnie makra dostarczone przez twórców biblioteki.

EDIT:

no i dlaczego nie opakujesz timera w klasę, IO tak, a UART to w ogóle metoda św. Copy'ego Paste'a? ;) Nie mam nic przeciwko korzystaniu z gotowców, ale ujednoliciłbym konwencję.

edytowany 2x, ostatnio: alagner, 2015-08-17 21:27
Racja, z tymi szablonami do pinów przesada, przy jakiejś zmianie sprzętowej i tak byłaby ponowna kompilacja, więc można to zrobić inaczej. W kodzie rzeczywiście jest spory dysonans- timer do klasy to dobry pomysł, UART to jak pisałem pobrana biblioteka (od Kardasia. Książkę czytałem, ale raczej nawyków wzorowanych na tej pozycji staram się unikać ;) ). - Lukaszmey 2015-08-17 21:36

Pozostało 580 znaków

2015-08-17 21:27
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

Ja tam sie za bardzo na embedded nie znam ale 4 bajty na stosie to chyba nie jest aż tak dużo, szczególnie że nie mówimy tu o żadnej długotrwałej alokacji tylko o odłożeniu adresu powrotu na czas kilku operacji.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Z mojego doświadczenia: różnie to bywa, nie wiem dokładnie co to za AVR. Ale zdarzało się, że robiło mi to różnicę (64bajty ram ftw ;) ). Na pewno napisałbym to po Twojemu a dopiero przy problemach przesiadł się na postać brzydką (o ile faktycznie w stosie tkwiłby problem). - alagner 2015-08-17 21:34
To c++ nie umie TCO? W tych ifach większość gałęzi kończy się returnem, więc gdyby kompilator zrobił TCO, to nic by stosu nie zjadło. Choć niestety destruktory trochę mogą z TCO kolidować. - Krolik 2015-08-18 14:11

Pozostało 580 znaków

2015-08-17 21:49

Rejestracja: 6 lat temu

Ostatnio: 4 godziny temu

0

@Lukaszmey pozwoliłem sobie pochodzić po reszcie Twojego githuba i jeszcze jedna rzecz mnie natchnęła: przy pisaniu na AVR unikaj floatów, albo inaczej: wiedz co robisz korzystając z floatów. Bo jeżeli piszesz drobiażdżek, który ma tylko coś wyświetlić - ok. Ale w momencie gdy zechcesz coś dopisać, nagle może się okazać, że czasu/miejsca we flashu brak.

Cenna uwaga, dzięki. Wiem, że AVRy nie mają FPU i operacje robione są programowo. Nie zdarzyło mi się jeszcze, żeby brakowało pamięci, ale zawsze lepiej wiedzieć, gdzie można szukać ewentualnej przyczyny. - Lukaszmey 2015-08-17 22:07

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0