9 std::vector<std::pair<SENSTimePt, T>>&& data,
12 _startSimCB(startSimCB),
13 _sensorSimStoppedCB(sensorSimStoppedCB),
34 std::unique_lock<std::mutex> lock(_mutex);
37 _condVar.notify_one();
39 if (_thread.joinable())
49 std::lock_guard<std::mutex> lock(_msgMutex);
50 if (_errorMsg.empty())
62 _threadIsRunning =
true;
68 while (counter < _data.size() && _data[counter].first < simTime)
71 if (counter >= _data.size())
74 _threadIsRunning =
false;
75 _sensorSimStoppedCB();
85 int oldCounter = counter;
86 if (counter < _data.size() && _data[counter].first <= simTime)
89 SENS_DEBUG(
"feed %s sensor index %d with latency: %d us", _name.c_str(), counter, std::chrono::duration_cast<SENSMicroseconds>(_data[counter].first - simTime).count());
90 feedSensorData(counter);
95 simTime = _clock.now();
96 while (counter < _data.size() && _data[counter].first < simTime)
100 if (counter - oldCounter > 1)
104 onLatencyProblem(counter);
106 int numberOfSkippedData = counter - oldCounter;
108 std::stringstream ss;
109 ss <<
"Data feeding is too slow. Skipped " << numberOfSkippedData <<
" data sets!";
110 SENS_WARN(
"SENSSimulated feedSensor: %s", ss.str().c_str());
112 std::lock_guard<std::mutex> lock(_msgMutex);
113 _errorMsg = ss.str();
118 if (counter >= _data.size())
122 prepareSensorData(counter);
126 simTime = _clock.now();
128 SENSMicroseconds waitTimeUs = std::chrono::duration_cast<SENSMicroseconds>(_data[counter].first - simTime);
130 SENSMicroseconds reducedWaitTimeUs((
long)(0.01 * (
double)waitTimeUs.count()));
133 std::unique_lock<std::mutex> lock(_mutex);
134 _condVar.wait_for(lock, reducedWaitTimeUs, [&]
135 {
return _stop ==
true; });
143 _threadIsRunning =
false;
144 _sensorSimStoppedCB();
181 SensorSimStoppedCB sensorSimStoppedCB,
182 std::vector<std::pair<SENSTimePt, SENSGps::Location>>&& data,
184 :
SENSSimulated(
"gps", startSimCB, sensorSimStoppedCB, std::move(data), clock)
221 SensorSimStoppedCB sensorSimStoppedCB,
222 std::vector<std::pair<SENSTimePt, SENSOrientation::Quat>>&& data,
224 :
SENSSimulated(
"orientation", startSimCB, sensorSimStoppedCB, std::move(data), clock)
241 bool provideIntrinsics)
245 Utils::warnMsg(
"SENSWebCamera",
"Call to start was ignored. Camera is currently running!", __LINE__, __FILE__);
249 if (!
_cap.isOpened())
293 SensorSimStoppedCB sensorSimStoppedCB,
294 std::vector<std::pair<SENSTimePt, int>>&& data,
295 std::string videoFileName,
298 :
SENSSimulated(
"camera", startSimCB, sensorSimStoppedCB, std::move(data), clock),
299 _videoFileName(videoFileName)
322 if (counter >=
_data.size())
325 int frameIndex =
_data[counter].second;
331 int nextFramePos =
_cap.get(cv::CAP_PROP_POS_FRAMES);
332 if (nextFramePos != frameIndex)
335 _cap.set(cv::CAP_PROP_POS_FRAMES, frameIndex);
360 SENSMicroseconds neededTime = std::chrono::duration_cast<SENSMicroseconds>(t1 - t0);
365 while (counter <
_data.size() - 1 &&
_data[counter].first < now)
369 SENSMicroseconds availableTime = std::chrono::duration_cast<SENSMicroseconds>(
_data[counter + 1].first -
_data[counter].first);
370 auto factor = neededTime.count() / availableTime.count();
372 SENS_DEBUG(
"factor %lld neededTime %lld available time %lld", factor, neededTime.count(), availableTime.count());
375 if (counter <
_data.size())
377 t0 = SENSClock::now();
379 t1 = SENSClock::now();
380 neededTime = std::chrono::duration_cast<SENSMicroseconds>(t1 - t0);
std::chrono::microseconds SENSMicroseconds
std::chrono::high_resolution_clock::time_point SENSTimePt
High Resolution Timer class using C++11.
int64_t elapsedTimeInMicroSec()
SENSCameraConfig _config
indicates what is currently running
std::atomic< bool > _permissionGranted
SENSCaptureProps _captureProperties
std::atomic< bool > _started
flags if camera was started
void updateFrame(cv::Mat bgrImg, cv::Mat intrinsics, int width, int height, bool intrinsicsChanged)
void processStart()
call from start function to do startup preprocessing
void add(int widthPix, int heightPix, float focalLengthPix)
void setLocation(SENSGps::Location location)
std::atomic_bool _permissionGranted
void setOrientation(Quat orientation)
SENSTimePt now() const
get current simulation time (const function which should be thread save)
void onLatencyProblem(int &counter) override
when feeding camera frames from cv::videocapture updating the frame pos may take ages....
std::string _videoFileName
const SENSCaptureProps & captureProperties() override
Get SENSCaptureProps which contains necessary information about all available camera devices and thei...
void prepareSensorData(const int counter) override
const SENSCameraConfig & start(std::string deviceId, const SENSCameraStreamConfig &streamConfig, bool provideIntrinsics=true) override
SENSSimulatedCamera(StartSimCB startSimCB, SensorSimStoppedCB sensorSimStoppedCB, std::vector< std::pair< SENSTimePt, int >> &&data, std::string videoFileName, SENSCameraConfig cameraConfig, const SENSSimClock &clock)
void stop() override
Stop a started camera device.
void feedSensorData(const int counter) override
feed new sensor data to sensor
void feedSensorData(const int counter) override
feed new sensor data to sensor
SENSSimulatedGps(StartSimCB startSimCB, SensorSimStoppedCB sensorSimStoppedCB, std::vector< std::pair< SENSTimePt, SENSGps::Location >> &&data, const SENSSimClock &clock)
SENSSimulated(const std::string name, StartSimCB startSimCB, SensorSimStoppedCB sensorSimStoppedCB, std::vector< std::pair< SENSTimePt, T >> &&data, const SENSSimClock &clock)
void stopSim()
stop the sensor simulation thread
bool getErrorMsg(std::string &msg) override
get error msg (valid if function returns true)
std::function< void(void)> SensorSimStoppedCB
std::vector< std::pair< SENSTimePt, SENSGps::Location > > _data
void feedSensor()
thread run routine to feed sensor with data.
void startSim()
start the sensor simulation thread
const SENSSimClock & _clock
std::function< void(void)> StartSimCB
void feedSensorData(const int counter) override
feed new sensor data to sensor
SENSSimulatedOrientation(StartSimCB startSimCB, SensorSimStoppedCB sensorSimStoppedCB, std::vector< std::pair< SENSTimePt, SENSOrientation::Quat >> &&data, const SENSSimClock &clock)
~SENSSimulatedOrientation()
void warnMsg(const char *tag, const char *msg, const int line, const char *file)
Platform independent warn message output.
SENSCameraFacing facing
camera facing
SENSCameraStreamConfig streamConfig
currently selected stream config index (use it to look up original capture size)