2012-08-06 3 views
0

나는 AR Drone (쿼드 로터 UAV)에 대한 3 DOF 제어 응용 프로그램을 설계하고 있습니다. UAV를 제어하기 위해 다중 PID 컨트롤러를 사용하고 있습니다.이 컨트롤러는 디스패처 타이머 클래스를 사용하여 구현됩니다. 즉시 사용자가이 타이머가 해고 된 GUI의 버튼을 누르면로Dispatcher 타이머 WP37을 동결

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

: 프로그램의 시작 예를 들어 내가 좋아하는 디스패처 타이머를 초기화합니다. (.... 서로 다른 시간 간격으로 트리거되는이 타이머의 약 7 실행중인 내 응용 프로그램 지금 타이머 시간을

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 

     } 

:

timer_yaw_tick에서
 timer_yaw.Start(); 

내가 처리의 약간을 대부분 모든 타이머의 밀리 초 단위입니다.)

문제는 제가 직면하고있는 것은 제 코드가 때로는 잘 실행되지만 시간이 지나면 응용 프로그램이 완전히 멈 춥니 다. 즉 응답이 전혀 없기 때문입니다. 문제를 찾아 내면 ... 올바른 타이머 작업 ???

도움말 정말 감사하겠습니다 .. Thnx

+0

동결시 코드에서 디버거가 멈 춥니 다. (여러 번 시도하십시오) 데이터에 대한 동시 액세스 문제가있을 수 있습니까? * 표시하는 코드는 읽기 전용 데이터에 액세스하는 것으로 보이지만 일부 다른 부분에있을 수 있습니다. 프레임 워크에 스레드 세이프 인 꽤 많은 데이터 타입이 있습니다. 체크 아웃하십시오. (http://msdn.microsoft.com/en-us/library/dd997305.aspx) 또는 뮤텍스를 사용하여 당신 자신. 하지만 먼저 System.Threading.Timer와 같은 다른 타이머를 시도해보십시오. 쉽게 :-) – GameAlchemist

답변

0

당신이 Dispatcher를 기본값으로 연결되어있는 메인 UI 스레드와 DispatcherTimer 이후 관련 기본 Dispatcher를 사용하는 대부분의 경우 - 당신은 단순히으로 UI 스레드 디스패처 큐 오버로드 많은 직업.

한 유용한 테스트 - 단지 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()

+0

이 경우 타이머 클래스가 적합할까요? –

+0

업데이트 된 답변보기 – sll

+0

System.Threading.Timer 클래스에 관한 예제를 추천 할 수 있습니까? 전에 사용하지 않았습니다 –