summaryrefslogtreecommitdiffhomepage
path: root/tracker-easy/tracker-easy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-easy/tracker-easy.cpp')
-rw-r--r--tracker-easy/tracker-easy.cpp121
1 files changed, 73 insertions, 48 deletions
diff --git a/tracker-easy/tracker-easy.cpp b/tracker-easy/tracker-easy.cpp
index e432b5da..e0ab5f7c 100644
--- a/tracker-easy/tracker-easy.cpp
+++ b/tracker-easy/tracker-easy.cpp
@@ -45,25 +45,18 @@ namespace EasyTracker
connect(&iSettings.fov, value_::value_changed<int>(), this, &Tracker::set_fov, Qt::DirectConnection);
set_fov(iSettings.fov);
+ // We could not get this working, nevermind
+ //connect(&iSettings.cam_fps, value_::value_changed<int>(), this, &Tracker::SetFps, Qt::DirectConnection);
CreateModelFromSettings();
-
-
- //int nStates = 18; // the number of states
- //int nMeasurements = 6; // the number of measured states
- //int nInputs = 0; // the number of control actions
- //double dt = 0.125; // time between measurements (1/FPS)
-
- iKf.Init(18,6,0,0033);
}
Tracker::~Tracker()
{
- //
cv::destroyWindow("Preview");
- requestInterruption();
- wait();
+ iThread.exit();
+ iThread.wait();
QMutexLocker l(&camera_mtx);
camera->stop();
@@ -315,51 +308,43 @@ namespace EasyTracker
///
///
///
- void Tracker::run()
+ void Tracker::Tick()
{
maybe_reopen_camera();
+
+ iTimer.start();
- iFpsTimer.start();
-
- while (!isInterruptionRequested())
+ bool new_frame = false;
{
- iTimer.start();
-
- bool new_frame = false;
- {
- QMutexLocker l(&camera_mtx);
-
- if (camera)
- {
- std::tie(iFrame, new_frame) = camera->get_frame();
- }
-
- }
+ QMutexLocker l(&camera_mtx);
- if (new_frame)
- {
- ProcessFrame();
- }
- else
+ if (camera)
{
- iSkippedFrameCount++;
+ std::tie(iFrame, new_frame) = camera->get_frame();
}
+
+ }
- // Pace ourselves, drastically reduce CPU usage
- // TODO: Consider using QTimer instead of QThread
- msleep(1000 / 55);
+ if (new_frame)
+ {
+ ProcessFrame();
+ }
+ else
+ {
+ iSkippedFrameCount++;
+ }
- // Compute FPS
- double elapsed = iFpsTimer.elapsed_seconds();
- if (elapsed >= 1.0)
- {
- iFps = iFrameCount / elapsed;
- iSkippedFps = iSkippedFrameCount / elapsed;
- iFrameCount = 0;
- iSkippedFrameCount = 0;
- iFpsTimer.start();
- }
+ // Compute FPS
+ double elapsed = iFpsTimer.elapsed_seconds();
+ if (elapsed >= 1.0)
+ {
+ iFps = iFrameCount / elapsed;
+ iSkippedFps = iSkippedFrameCount / elapsed;
+ iFrameCount = 0;
+ iSkippedFrameCount = 0;
+ iFpsTimer.start();
}
+
}
bool Tracker::maybe_reopen_camera()
@@ -378,6 +363,10 @@ namespace EasyTracker
bool res = camera->start(iCameraInfo);
// We got new our camera intrinsics, create corresponding matrices
CreateCameraIntrinsicsMatrices();
+
+ // If ever the camera implementation provided an FPS now is the time to apply it
+ DoSetFps(iCameraInfo.fps);
+
return res;
}
@@ -387,6 +376,28 @@ namespace EasyTracker
}
+ // Calling this from another thread than the one it belongs too after it's started somehow breaks our timer
+ void Tracker::SetFps(int aFps)
+ {
+ QMutexLocker l(&camera_mtx);
+ DoSetFps(aFps);
+ }
+
+ void Tracker::DoSetFps(int aFps)
+ {
+ // Aplly FPS to timer
+ iTicker.setInterval(1000 / aFps + 1);
+
+ // Reset Kalman filter
+ //int nStates = 18; // the number of states
+ //int nMeasurements = 6; // the number of measured states
+ //int nInputs = 0; // the number of control actions
+ //double dt = 0.125; // time between measurements (1/FPS)
+ double dt = 1000.0 / aFps;
+ iKf.Init(18, 6, 0, dt);
+ }
+
+
module_status Tracker::start_tracker(QFrame* video_frame)
{
//video_frame->setAttribute(Qt::WA_NativeWindow);
@@ -401,12 +412,26 @@ namespace EasyTracker
// Create our camera
camera = video::make_camera(iSettings.camera_name);
-
- start(QThread::HighPriority);
+ // Precise timer is needed otherwise the interval is not really respected
+ iTicker.setTimerType(Qt::PreciseTimer);
+ SetFps(iSettings.cam_fps);
+ iTicker.moveToThread(&iThread);
+ // Connect timer timeout signal to our tick slot
+ connect(&iTicker, SIGNAL(timeout()), SLOT(Tick()), Qt::DirectConnection);
+ // Start our timer once our thread is started
+ iTicker.connect(&iThread, SIGNAL(started()), SLOT(start()));
+ iFpsTimer.start(); // Kick off our FPS counter
+ iThread.setObjectName("EasyTrackerThread");
+ iThread.setPriority(QThread::HighPriority); // Do we really want that?
+ iThread.start();
return {};
}
+ //
+ // That's called around 250 times per second.
+ // Therefore we better not do anything here other than provide current data.
+ //
void Tracker::data(double *data)
{
if (ever_success.load(std::memory_order_relaxed))