1

我正在为 AR Drone(四旋翼无人机)设计一个 3 DOF 控制应用程序。我正在使用多个 PID 控制器来控制无人机 ..这些控制器是通过使用调度程序计时器类实现的 .. 例如在程序开始时我像这样初始化调度程序计时器:

        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连接到 Default Dispatcher - 您只是通过大量作业重载了 UI Thread Dispatcher 队列。

timer_yaw_tick()一个有用的测试 - 只需通过在开头和 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 回答