iCub-main
Loading...
Searching...
No Matches
stereoCalibThread.h
Go to the documentation of this file.
1#include <iostream>
2#include <fstream>
3#include <string>
4#include <mutex>
5#include <atomic>
6#include <cstddef>
7#include <deque>
8
9#include <opencv2/calib3d/calib3d_c.h>
10#include <opencv2/calib3d.hpp>
11#include <opencv2/core/core_c.h>
12#include <opencv2/core/types_c.h>
13#include <opencv2/imgcodecs.hpp>
14
15
16
17#include <yarp/os/all.h>
18#include <yarp/dev/all.h>
19#include <yarp/sig/all.h>
20#include <yarp/math/Math.h>
21
22#include <iCub/iKin/iKinFwd.h>
23#include "CalibrationTypes.h"
24#include "CalibrationWriter.h"
27
28using namespace std;
29using namespace cv;
30using namespace yarp::os;
31using namespace yarp::dev;
32using namespace yarp::sig;
33using namespace yarp::math;
34using namespace iCub::iKin;
35
36
37#define LEFT 0
38#define RIGHT 1
39
41{
42 ImageOf<PixelRgb> image;
43 Stamp stamp;
44};
45
47{
48 ImageOf<PixelRgb> left;
49 ImageOf<PixelRgb> right;
50
51 Stamp leftStamp;
53
54 double timeStampDelta{0.0};
55};
56
58{
59 std::size_t pairedFrames{0};
60 std::size_t droppedLeftFrames{0};
61 std::size_t droppedRightFrames{0};
62
64 double maxTimeStampDelta{0.0};
65};
66
68{
69 std::string state;
70
71 std::size_t pairedFrames{0};
72 std::size_t droppedLeftFrames{0};
73 std::size_t droppedRightFrames{0};
74
77
78 // These fields are available only after a successful engine calibration.
80 std::string calibrationMode;
81 double leftMonocularRms{-1.0};
82 double rightMonocularRms{-1.0};
83 double stereoRms{-1.0};
84 double baselineNorm{-1.0};
86};
87
89{
90private:
91 std::deque<StampedFrame> leftQueue;
92 std::deque<StampedFrame> rightQueue;
93
94 double toleranceSeconds{0.020}; // 20 milliseconds
95 std::size_t maxQueueSize{5};
96
97 mutable std::mutex _mutex;
99 void trimLeftQueue();
100 void trimRightQueue();
101
102public:
103
104 void configure(double tolerance, std::size_t maxQueueSize);
105 void reset();
106 void pushLeft(const ImageOf<PixelRgb>& leftFrame, const Stamp& timestamp);
107 void pushRight(const ImageOf<PixelRgb>& rightFrame, const Stamp& timestamp);
108 bool tryPopPair(SynchronizedPair& pair);
109 SynchronizerStatistics getStatistics() const { std::lock_guard<std::mutex> lock(_mutex); return stats; }
110};
111
112class stereoCalibThread : public Thread
113{
114private:
115
116 // States for stereoCalibrationThead
117 // defined inside the class since they are totally referred to this class
118 enum class CalibrationState
119 {
120 Idle = 0,
121 Collecting,
122 Calibrating,
123 Completed,
124 Error = 255
125 };
126
127 std::atomic<CalibrationState> calibrationState{CalibrationState::Idle};
128 std::atomic<bool> collectionResetRequested{false};
129
130 StereoPairSynchronizer synchronizer;
131
132 double _syncToleranceSeconds{0.020};
133 std::size_t _syncQueueSize{5};
134
135 double minCaptureIntervalSeconds{2.0};
136 double lastProcessedCandidateTime{-1.0};
137 double minimumBoardSpanRatio{0.15};
138
139 Size _expectedImageSize{};
140
141 Mat LeftRgb;
142 Mat RightRgb;
143
144 string moduleName;
145 string robotName;
146 yarp::sig::Vector qL;
147 yarp::sig::Vector qR;
148
149 mutable std::mutex mtx;
150
151 int numOfPairs;
152
153 bool standalone;
154 yarp::dev::PolyDriver polyHead;
155 yarp::dev::IEncoders *posHead;
156
157 yarp::dev::PolyDriver polyTorso;
158 yarp::dev::IEncoders *posTorso;
159
160 string inputLeftPortName;
161 string inputRightPortName;
162 string outNameRight;
163 string outNameLeft;
164 string camCalibFile;
165
166 stereo_calib::ChessboardConfiguration _chessboardConfiguration;
167 std::vector<stereo_calib::StereoObservation> _observations;
168 std::size_t _rejectedDetections{0};
169
172
173 stereo_calib::FisheyeCalibrationEngine _fisheyeCalibrationEngine;
174 stereo_calib::FisheyeCalibrationOptions _fisheyeCalibrationOptions;
175
176 stereo_calib::PinholeCalibrationEngine _pinholeCalibrationEngine;
177 stereo_calib::PinholeCalibrationOptions _pinholeCalibrationOptions;
178
179 stereo_calib::CalibrationResult _calibrationResults;
180 stereo_calib::CalibrationWriter _calibrationWriter;
181
182 std::string _calibrationError;
183
184 bool _saveImages{false};
185 bool _drawDiagnosticCorners{true};
186 std::string _observationsFile;
187
188
189 BufferedPort<ImageOf<PixelRgb> > imagePortInLeft;
190 BufferedPort<ImageOf<PixelRgb> > imagePortInRight;
191 BufferedPort<ImageOf<PixelRgb> > outPortRight;
192 BufferedPort<ImageOf<PixelRgb> > outPortLeft;
193
194 Port *commandPort;
195 string imageDir;
196 int boardWidth;
197 int boardHeight;
198 float squareSize;
199 string boardType;
200 void stereoCalibRun();
201 bool shouldQueueFrameForCollection(const Stamp& timestamp) const;
202 void processSynchronizedPair(SynchronizedPair& pair, Size boardSize);
203
204public:
205
206 stereoCalibThread(ResourceFinder &rf, Port* commPort, const char *imageDir);
208 void startCalib();
209 void stopCalib();
210 bool threadInit();
211 void threadRelease();
212 void run();
213 void onStop();
214
215};
constexpr double tolerance
SynchronizerStatistics getStatistics() const
void configure(double tolerance, std::size_t maxQueueSize)
void pushRight(const ImageOf< PixelRgb > &rightFrame, const Stamp &timestamp)
bool tryPopPair(SynchronizedPair &pair)
void pushLeft(const ImageOf< PixelRgb > &leftFrame, const Stamp &timestamp)
StereoCalibStatus getStatus() const
ImageOf< PixelRgb > image
std::string lastCalibrationError
std::size_t droppedLeftFrames
std::string calibrationMode
std::size_t droppedRightFrames
ImageOf< PixelRgb > left
ImageOf< PixelRgb > right