我正在为AR Drone(四旋翼无人机)设计一个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
答案 0 :(得分:0)
您很可能使用与主UI线程相关的默认Dispatcher
,并且DispatcherTimer
连接到Default Dispatcher - 您只是通过大量工作重载UI Thread Dispatcher队列。
一个有用的测试 - 只需测量开始时的ed timer_yaw_tick()
方法的执行时间以及以下内容:
// start
var watch = Stopwatch.StartNew();
// end
watch.Stop();
// see value of the watch.ElapsedMilliseconds property
我建议使用System.Threading.Timer
类进行定期作业调度,并将UI控件更新分派给UI线程使用Dispatcher.Invoke()
/ Dispatcher.BeginInvoke()