@@ -63,6 +63,7 @@ CameraImages::CameraImages() :
6363 _syncImageRateWithStamps (true ),
6464 _odometryFormat (0 ),
6565 _groundTruthFormat (0 ),
66+ _groundTruthLocalTransform (Transform::getIdentity()),
6667 _maxPoseTimeDiff (0.02 ),
6768 _captureDelay (0.0 )
6869 {}
@@ -93,6 +94,7 @@ CameraImages::CameraImages(const std::string & path,
9394 _syncImageRateWithStamps (true ),
9495 _odometryFormat (0 ),
9596 _groundTruthFormat (0 ),
97+ _groundTruthLocalTransform (Transform::getIdentity()),
9698 _maxPoseTimeDiff (0.02 ),
9799 _captureDelay (0.0 )
98100{
@@ -478,27 +480,43 @@ bool CameraImages::init(const std::string & calibrationFolder, const std::string
478480 if (success && _odometryPath.size () && odometry_.empty ())
479481 {
480482 success = readPoses (odometry_, _stamps, _odometryPath, _odometryFormat, _maxPoseTimeDiff);
483+ if (!success)
484+ {
485+ UERROR (" Failed to read odometry poses." );
486+ }
487+
488+ if (success)
489+ {
490+ for (size_t i=0 ; i<odometry_.size (); ++i)
491+ {
492+ // linear cov = 0.0001
493+ cv::Mat covariance = cv::Mat::eye (6 ,6 ,CV_64FC1) * (i==0 ?9999.0 :0.0001 );
494+ if (i!=0 )
495+ {
496+ // angular cov = 0.000001
497+ covariance.at <double >(3 ,3 ) *= 0.01 ;
498+ covariance.at <double >(4 ,4 ) *= 0.01 ;
499+ covariance.at <double >(5 ,5 ) *= 0.01 ;
500+ }
501+ covariances_.push_back (covariance);
502+ }
503+ }
481504 }
482505
483506 if (success && _groundTruthPath.size ())
484507 {
485508 success = readPoses (groundTruth_, _stamps, _groundTruthPath, _groundTruthFormat, _maxPoseTimeDiff);
486- }
487-
488- if (!odometry_.empty ())
489- {
490- for (size_t i=0 ; i<odometry_.size (); ++i)
509+ if (!success)
491510 {
492- // linear cov = 0.0001
493- cv::Mat covariance = cv::Mat::eye (6 ,6 ,CV_64FC1) * (i==0 ?9999.0 :0.0001 );
494- if (i!=0 )
511+ UERROR (" Failed to read ground truth poses." );
512+ }
513+ else if (!_groundTruthLocalTransform.isIdentity ())
514+ {
515+ Transform gtInv = _groundTruthLocalTransform.inverse ();
516+ for (auto pose: groundTruth_)
495517 {
496- // angular cov = 0.000001
497- covariance.at <double >(3 ,3 ) *= 0.01 ;
498- covariance.at <double >(4 ,4 ) *= 0.01 ;
499- covariance.at <double >(5 ,5 ) *= 0.01 ;
518+ pose = pose*gtInv; // pose of base_link, assuming ground truth frame and base frame are rigidly fixed
500519 }
501- covariances_.push_back (covariance);
502520 }
503521 }
504522 }
@@ -607,7 +625,7 @@ bool CameraImages::readPoses(
607625 }
608626 if (validPoses != (int )inOutStamps.size ())
609627 {
610- UWARN (" %d valid poses of %d stamps" , validPoses, ( int ) inOutStamps.size ());
628+ UWARN (" %d/%ld valid poses of %ld stamps" , validPoses, outputPoses. size (), inOutStamps.size ());
611629 }
612630 }
613631 else
@@ -756,32 +774,19 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
756774
757775 if (_stamps.size ())
758776 {
759- stamp = _stamps.front ();
760- _stamps.pop_front ();
761- if (_stamps.size ())
762- {
763- _captureDelay = _stamps.front () - stamp;
764- }
777+ UERROR (" stamps cannot be used when startAt < 0" );
765778 }
766779 if (odometry_.size ())
767780 {
768- odometryPose = odometry_.front ();
769- odometry_.pop_front ();
770- if (covariances_.size ())
771- {
772- covariance = covariances_.front ();
773- covariances_.pop_front ();
774- }
781+ UERROR (" odometry cannot be used when startAt < 0" );
775782 }
776783 if (groundTruth_.size ())
777784 {
778- groundTruthPose = groundTruth_.front ();
779- groundTruth_.pop_front ();
785+ UERROR (" groundTruth cannot be used when startAt < 0" );
780786 }
781787 if (_models.size () && !model.isValidForProjection ())
782788 {
783- model = _models.front ();
784- _models.pop_front ();
789+ UERROR (" models cannot be used when startAt < 0" );
785790 }
786791 }
787792 else
@@ -792,6 +797,7 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
792797 {
793798 imageFilePath = _path + imageFileName;
794799 scanFilePath = _scanPath + scanFileName;
800+ size_t stampsSize = _stamps.size ();
795801 if (_stamps.size ())
796802 {
797803 stamp = _stamps.front ();
@@ -803,6 +809,8 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
803809 }
804810 if (odometry_.size ())
805811 {
812+ UASSERT_MSG (stampsSize==0 || stampsSize == odometry_.size (),
813+ uFormat (" Stamps=%ld odometry=%ld" , _stamps.size (), odometry_.size ()).c_str ());
806814 odometryPose = odometry_.front ();
807815 odometry_.pop_front ();
808816 if (covariances_.size ())
@@ -813,11 +821,15 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
813821 }
814822 if (groundTruth_.size ())
815823 {
824+ UASSERT_MSG (stampsSize==0 || stampsSize == groundTruth_.size (),
825+ uFormat (" Stamps=%ld groundTruth=%ld" , _stamps.size (), groundTruth_.size ()).c_str ());
816826 groundTruthPose = groundTruth_.front ();
817827 groundTruth_.pop_front ();
818828 }
819829 if (_models.size () && !model.isValidForProjection ())
820830 {
831+ UASSERT_MSG (stampsSize==0 || stampsSize == _models.size (),
832+ uFormat (" Stamps=%ld models=%ld" , _stamps.size (), _models.size ()).c_str ());
821833 model = _models.front ();
822834 _models.pop_front ();
823835 }
@@ -834,6 +846,7 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
834846
835847 imageFilePath = _path + imageFileName;
836848 scanFilePath = _scanPath + scanFileName;
849+ size_t stampsSize = _stamps.size ();
837850 if (_stamps.size ())
838851 {
839852 stamp = _stamps.front ();
@@ -845,6 +858,8 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
845858 }
846859 if (odometry_.size ())
847860 {
861+ UASSERT_MSG (stampsSize==0 || stampsSize == odometry_.size (),
862+ uFormat (" Stamps=%ld odometry=%ld" , stampsSize, odometry_.size ()).c_str ());
848863 odometryPose = odometry_.front ();
849864 odometry_.pop_front ();
850865 if (covariances_.size ())
@@ -855,11 +870,15 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info)
855870 }
856871 if (groundTruth_.size ())
857872 {
873+ UASSERT_MSG (stampsSize==0 || stampsSize == groundTruth_.size (),
874+ uFormat (" Stamps=%ld groundTruth=%ld" , _stamps.size (), groundTruth_.size ()).c_str ());
858875 groundTruthPose = groundTruth_.front ();
859876 groundTruth_.pop_front ();
860877 }
861878 if (_models.size () && !model.isValidForProjection ())
862879 {
880+ UASSERT_MSG (stampsSize==0 || stampsSize == _models.size (),
881+ uFormat (" Stamps=%ld models=%ld" , _stamps.size (), _models.size ()).c_str ());
863882 model = _models.front ();
864883 _models.pop_front ();
865884 }
0 commit comments