1

ARドローン(クワッドローターUAV)用の3 DOF制御アプリケーションを設計しています..複数のPIDコントローラーを使用してUAVを制御しています..これらのコントローラーは、ディスパッチャータイマークラスを使用して実装されています..たとえば、プログラムの開始時に私はディスパッチャータイマーを次のように初期化します:

        timer_yaw = new DispatcherTimer();
        timer_yaw.Interval = new TimeSpan(0, 0, 0, 0, 45);
        timer_yaw.Tick += new EventHandler(timer_yaw_tick);

ユーザーがGUIのボタンを押すとすぐに、このタイマーが起動します。

        timer_yaw.Start();

timer_yaw_tickで私は少し処理をします:

    private void timer_yaw_tick(object sender, EventArgs e)
      {
            // drone commands and stuff ... basically a PD controller
            DroneData data = droneControl.NavigationData;
            PV_yaw = data.Psi;

            SP_yaw = angle;

            Error_yaw = SP_yaw - PV_yaw;

            if (Error_yaw >= 0)
                yaw_pd = 0.5f;
            else if (Error_yaw < 0)
                yaw_pd = -0.5f;


            Derivative_yaw = (Error_yaw - PreError_yaw) / Dt_yaw;

            Output_yaw = (Kp_yaw * Error_yaw) + (Kd_yaw * Derivative_yaw);

            PreError_yaw = Error_yaw;

            Output_yaw = Math.Round(Output_yaw, 1, MidpointRounding.AwayFromZero);

            Output_yaw = Output_yaw * 1000;

            t_PD_yaw = Convert.ToInt32(Output_yaw);

            // this t_PD_yaw is then sent to the drone via WiFi to make required adjustment

        }

現在、私のアプリケーションでは、これらのタイマーのうち約7つが実行されており、さまざまな時間間隔でトリガーされます。...(タイマーの継続時間は、ほとんどすべてのタイマーのミリ秒単位です)

私が直面している問題は、コードが正常に実行されることもありますが、アプリケーションが完全にフリーズすることもあります。つまり、まったく応答がありません。仕事のためのタイマー???

助けていただければ幸いです。Thnx

4

1 に答える 1

1

ほとんどの場合Dispatcher、メイン UI スレッドに関連するデフォルトを使用しDispatcherTimerており、デフォルト ディスパッチャに接続されているため、多くのジョブによって UI スレッド ディスパッチャ キューが過負荷になっているだけです。

timer_yaw_tick()便利なテストの 1 つ -最初に次の edn を配置して、平均してメソッドが実行される時間を測定するだけです。

// start
var watch = Stopwatch.StartNew();

// end
watch.Stop();

// see value of the watch.ElapsedMilliseconds property

System.Threading.Timer定期的なジョブのスケジューリングにクラスを使用し、UI コントロールの更新を UI スレッドにディスパッチするには、Dispatcher.Invoke()/を使用することをお勧めします。Dispatcher.BeginInvoke()

于 2012-08-06T10:55:08.553 に答える