Problemy z wątkami przy komunikacji z robotem i z kamerką kinect

0

Witam szanownych forumowiczów!!
Mam taki problem. Otóż mam sobie robota który ma w sobie arduino i sterowniki. Łączę się za pomocą portu COM i mogę mu wysyłać polecenia żeby np. jechał prost przez 2m. Na tym robocie mam zamontowany kinect jako kamerka i za pomocą niego sprawdzam aktualną głębokość czyli odległość od np. ściany. Moim problemem jest to że silniki mam krokowe i żeby przejechał te dwa 2m to muszę mu podać tą liczbę (w milimetrach :D ) albo jeśli podam mu np. wartość 20cm to muszę nacisnąć button 10razy żeby przejechał te 2m. Moje pytanie to jak zrobić w c# żebym mógł mu puścić pętle z tymi 20cm aż do tych 2m tak żeby mi nie zawieszał programu bo jak mu nacisnę jedź to po prostu zawiesza mi sie widok z kamerki kinect i nawet nie mogę wymusić mu żeby się robot zatrzymał. Kodzik funkcji jaką zrobiłem:

public string Connect()
{
    string Status;
    mySerialPort = new SerialPort("COM4", 115200);
            
    if (mySerialPort.IsOpen != true)
    {
        mySerialPort.Open();
    }
    IsOn = mySerialPort.IsOpen;

    if (IsOn == true)
    {
        Status = "Connect";
    }
    else
    {
        Status = "Disconnect";
    }

    return Status;
}
public void SendCommand(string _command)
{
    mySerialPort.WriteLine(_command.ToString());
}
i funkcja która to robi:

private void Gogo_Click(object sender, RoutedEventArgs e) //Watki()
{
    double distance = 0;
    int depth22 = 0, af = 0, _distans = 2000;
    bool check = true;

    //Thread watek;
    string nowy = "D+200";
    while (check)
    {
        distance = 260 + (200 * _kinect.DepthFrameSource.FrameDescription.Width);
        af = (int)distance;
        depth22 = _depthData[af];
        //watek = new Thread(new ParameterizedThreadStart(Commands.SendCommand1));
        if (depth22 >= _distans || depth22 > 700)
        {
            //watek.Start(nowy);
            //watek.Join();
            //watek.Abort();
            Commands.SendCommand(nowy);
        }
        else
        {
            //watek.Join();
            //watek.Abort();
            Commands.SendCommand("H");
            check = false;
            Thread.Sleep(5000);
        }
    }

}

Oczywiście pewne rzeczy mam utworzone w innych miejsca ale generalnie chodzi o tą ostatnią funkcję gdzie próbuje w pętli wysłać komendę do robota jedź(czyli ta ostania gdzie string=="D+200" gdzie D+ to jedź do przodu o 20cm i Commands.SendCommand(nowy);). Myślałem żeby to na wątkach zrobić ale nie bardzo umiem tych wątków bo próbowałem parę opcji ale efekt był taki że i tak się zawieszało wszystko.
Nie znalazłem tego problemu nigdzie indziej a jak coś było to u mnie nie działało... Proszę o jakieś pomysły jak to rozwiązać bo z racji mojej małej wiedzy na temat wątków ciężko mi coś wymyślić... (depth22 to jest aktualna odległość od przeszkody..)
Pozdrawiam

1

Zrób dwie metody. Jedna będzie sprawdzać czy dana trasa została przebyta, druga która będzie asynchroniczna i będzie odpalać same polecenie ruszenia.

Poczytaj o async i await

0

no właśnie czytałem już na temat tych wątków, na temat async itp i nie mogę tego zrozumieć... Nie wiem czy ja taki tępy czy po prostu jest to takie trudne... Nic dzięki za jakąś wskazówkę. Póki co zrobiłem osobną metodę w której mam tą pętle a pod buttonem tworze wątek i wywołuje tą metodę z pętlą a potem uruchamiam ten wątek dzięki czemu pętla mi nie zawiesza głównego wątku z ui gdzie na bieżąco jest przekazywany obraz z kamerki kinect :)
Temat proszę na razie nie zamykać bo być może będę jeszcze potrzebował jakiejś pomocy z tymi wątkami.
Tak trochę poza tematem bawił się ktoś z wykrywaniem obiektów w sensorze kinect 2.0?

0

Pytanko jeszcze w temacie!!!

            if (watek != null)
            {
                return;
            }            
            watek = new Thread(new ThreadStart(Watki));
            if (watek.ThreadState == ThreadState.Running)
            {
                return;
            }
            watek.Start();

mam coś takiego jak zrobić żebym po utworzeniu wątku i po pierwszym uruchomieniu żebym mógł go ponownie uruchomić? Da się jakoś zastopować ten wątek oprócz funkcji Abort()? Bo raz że to chyba nie działa i tak a dwa to podobno nie powinno się używać tej funkcji...
Ps. wiem że mam if'y i ze za drugim razem mi przerywa program ale bardziej mi chodzi o to uruchomienie ponowne tego wątku jak to zrobić?

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