Skip to content

Commit ec69c1f

Browse files
committed
better visualization and violation checking
1 parent a22d465 commit ec69c1f

File tree

5 files changed

+43
-19
lines changed

5 files changed

+43
-19
lines changed

Diff for: graph_msf/include/graph_msf/interface/GraphMsf.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Please see the LICENSE file that has been included as part of this package.
1212
#include <mutex>
1313
#include <stdexcept>
1414
#include <thread>
15+
#include <unordered_set>
1516

1617
// Package
1718
#include "graph_msf/config/GraphConfig.h"
@@ -39,8 +40,8 @@ class GraphMsf {
3940
void setup(const std::shared_ptr<GraphConfig> graphConfigPtr, const std::shared_ptr<StaticTransforms> staticTransformsPtr);
4041

4142
// Initialization Interface
42-
bool initYawAndPositionInWorld(const double yaw_W_frame1, const Eigen::Vector3d& W_t_W_frame2,
43-
const std::string& frame1, const std::string& frame2);
43+
bool initYawAndPositionInWorld(const double yaw_W_frame1, const Eigen::Vector3d& W_t_W_frame2, const std::string& frame1,
44+
const std::string& frame2);
4445
bool initYawAndPosition(const UnaryMeasurementXD<Eigen::Isometry3d, 6>& unary6DMeasurement);
4546

4647
// Trigger offline smoother optimization
@@ -104,6 +105,9 @@ class GraphMsf {
104105
// Initialization
105106
void pretendFirstMeasurementReceived();
106107

108+
// Check whether measurement violated covariance, if yes, add to set and print once, if not, remove from set and print that returned
109+
bool checkAndPrintCovarianceViolation_(const std::string& measurementName, const bool violatedFlag);
110+
107111
// Members
108112
// Graph Config
109113
std::shared_ptr<GraphConfig> graphConfigPtr_ = nullptr;
@@ -131,6 +135,9 @@ class GraphMsf {
131135
// Counter
132136
long imuCallbackCounter_ = 0;
133137

138+
// Set of measurements that have violated the covariance
139+
std::unordered_set<std::string> measurementsWithViolatedCovariance_;
140+
134141
private:
135142
/// Worker functions
136143
//// Set Imu Attitude

Diff for: graph_msf/src/lib/GraphMsf.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -388,4 +388,22 @@ void GraphMsf::pretendFirstMeasurementReceived() {
388388
validFirstMeasurementReceivedFlag_ = true;
389389
}
390390

391+
// Check whether measurement violated covariance, if yes, add to set and print once, if not, remove from set and print that returned
392+
bool GraphMsf::checkAndPrintCovarianceViolation_(const std::string& measurementName, const bool violatedFlag) {
393+
if (violatedFlag) {
394+
if (measurementsWithViolatedCovariance_.find(measurementName) == measurementsWithViolatedCovariance_.end()) {
395+
measurementsWithViolatedCovariance_.insert(measurementName);
396+
REGULAR_COUT << RED_START << " " << measurementName << " covariance violated. Not adding factor until not violated anymore."
397+
<< COLOR_END << std::endl;
398+
}
399+
return true;
400+
} else {
401+
if (measurementsWithViolatedCovariance_.find(measurementName) != measurementsWithViolatedCovariance_.end()) {
402+
measurementsWithViolatedCovariance_.erase(measurementName);
403+
REGULAR_COUT << GREEN_START << " " << measurementName << " covariance not violated anymore." << COLOR_END << std::endl;
404+
}
405+
return false;
406+
}
407+
}
408+
391409
} // namespace graph_msf

Diff for: graph_msf/src/lib/GraphMsfHolistic.cpp

+4-9
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ void GraphMsfHolistic::addUnaryPose3AbsoluteMeasurement(const UnaryMeasurementXD
4848
} else { // Graph initialized
4949
// Check for covariance violation
5050
bool covarianceViolatedFlag = isCovarianceViolated_<6>(R_T_R_S.unaryMeasurementNoiseDensity(), R_T_R_S.covarianceViolationThreshold());
51-
if (covarianceViolatedFlag) {
52-
REGULAR_COUT << RED_START << " Pose covariance violated. Not adding factor." << COLOR_END << std::endl;
51+
if (checkAndPrintCovarianceViolation_(R_T_R_S.measurementName(), covarianceViolatedFlag)) {
5352
return;
5453
}
5554

@@ -86,9 +85,7 @@ void GraphMsfHolistic::addUnaryPosition3AbsoluteMeasurement(
8685
// Check for covariance violation
8786
bool covarianceViolatedFlag = isCovarianceViolated_<3>(fixedFrame_t_fixedFrame_sensorFrame.unaryMeasurementNoiseDensity(),
8887
fixedFrame_t_fixedFrame_sensorFrame.covarianceViolationThreshold());
89-
if (covarianceViolatedFlag) {
90-
REGULAR_COUT << RED_START << " " << fixedFrame_t_fixedFrame_sensorFrame.measurementName()
91-
<< " covariance violated. Not adding factor." << COLOR_END << std::endl;
88+
if (checkAndPrintCovarianceViolation_(fixedFrame_t_fixedFrame_sensorFrame.measurementName(), covarianceViolatedFlag)) {
9289
return;
9390
}
9491

@@ -141,8 +138,7 @@ void GraphMsfHolistic::addUnaryVelocity3LocalMeasurement(UnaryMeasurementXD<Eige
141138
} else { // Case 2: Graph Initialized
142139
// Check for covariance violation
143140
bool covarianceViolatedFlag = isCovarianceViolated_<3>(S_v_F_S.unaryMeasurementNoiseDensity(), S_v_F_S.covarianceViolationThreshold());
144-
if (covarianceViolatedFlag) {
145-
REGULAR_COUT << RED_START << " Velocity covariance violated. Not adding factor." << COLOR_END << std::endl;
141+
if (checkAndPrintCovarianceViolation_(S_v_F_S.measurementName(), covarianceViolatedFlag)) {
146142
return;
147143
}
148144

@@ -178,8 +174,7 @@ void GraphMsfHolistic::addUnaryPosition3LandmarkMeasurement(UnaryMeasurementXDLa
178174
} else { // Case 2: Graph Initialized
179175
// Check for covariance violation
180176
bool covarianceViolatedFlag = isCovarianceViolated_<3>(S_t_S_L.unaryMeasurementNoiseDensity(), S_t_S_L.covarianceViolationThreshold());
181-
if (covarianceViolatedFlag) {
182-
REGULAR_COUT << RED_START << " Position covariance violated. Not adding factor." << COLOR_END << std::endl;
177+
if (checkAndPrintCovarianceViolation_(S_t_S_L.measurementName(), covarianceViolatedFlag)) {
183178
return;
184179
}
185180

Diff for: ros/graph_msf_ros/include/graph_msf_ros/GraphMsfRos.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,18 @@ class GraphMsfRos : public GraphMsfClassic, public GraphMsfHolistic {
6969
const geometry_msgs::PoseWithCovarianceStampedPtr& msgPtr, const std::string& frameName, const ros::Time& stamp,
7070
const Eigen::Isometry3d& T, const Eigen::Matrix<double, 6, 6>& transformCovariance = Eigen::Matrix<double, 6, 6>::Zero());
7171
static void addToLandmarkMarkerArrayMsg(const visualization_msgs::MarkerArrayPtr& markerArrayPtr, const std::string& referenceFrameName,
72-
const ros::Time& stamp, const Eigen::Isometry3d& T_R_L, const std::string& transformName);
72+
const ros::Time& stamp, const Eigen::Isometry3d& T_R_L, const std::string& transformName);
7373

7474
// Extract from State
7575
static void extractCovariancesFromOptimizedState(
7676
Eigen::Matrix<double, 6, 6>& poseCovarianceRos, Eigen::Matrix<double, 6, 6>& twistCovarianceRos,
7777
const std::shared_ptr<graph_msf::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr);
7878
// Markers
7979
static void createVelocityMarker(const std::string& referenceFrameName, const ros::Time& stamp, const Eigen::Vector3d& velocity,
80-
visualization_msgs::Marker& marker);
80+
const Eigen::Vector3d& colorRgb, visualization_msgs::Marker& marker);
8181
static void createContactMarker(const std::string& referenceFrameName, const ros::Time& stamp, const Eigen::Vector3d& position,
82-
const std::string& nameSpace, const int id, const Eigen::Vector3d& colorRgb, visualization_msgs::Marker& marker);
82+
const std::string& nameSpace, const int id, const Eigen::Vector3d& colorRgb,
83+
visualization_msgs::Marker& marker);
8384

8485
// Callbacks
8586
virtual void imuCallback(const sensor_msgs::Imu::ConstPtr& imuPtr);

Diff for: ros/graph_msf_ros/src/lib/GraphMsfRos.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void GraphMsfRos::extractCovariancesFromOptimizedState(
248248

249249
// Markers
250250
void GraphMsfRos::createVelocityMarker(const std::string& referenceFrameName, const ros::Time& stamp, const Eigen::Vector3d& velocity,
251-
visualization_msgs::Marker& marker) {
251+
const Eigen::Vector3d& colorRgb, visualization_msgs::Marker& marker) {
252252
// Arrow
253253
marker.header.frame_id = referenceFrameName;
254254
marker.header.stamp = stamp;
@@ -261,9 +261,9 @@ void GraphMsfRos::createVelocityMarker(const std::string& referenceFrameName, co
261261
marker.scale.y = 0.2; // head diameter
262262
marker.scale.z = 0.2; // head length
263263
marker.color.a = 1.0;
264-
marker.color.r = 1.0;
265-
marker.color.g = 0.0;
266-
marker.color.b = 0.0;
264+
marker.color.r = colorRgb(0);
265+
marker.color.g = colorRgb(1);
266+
marker.color.b = colorRgb(2);
267267
// Define Arrow through start and end point
268268
geometry_msgs::Point startPoint, endPoint;
269269
startPoint = geometry_msgs::Point();
@@ -604,9 +604,12 @@ void GraphMsfRos::publishDiagVarianceVectors(const Eigen::Vector3d& posVarianceR
604604
}
605605

606606
void GraphMsfRos::publishVelocityMarkers(const std::shared_ptr<const graph_msf::SafeIntegratedNavState>& navStatePtr) const {
607+
// Color
608+
Eigen::Vector3d colorRgb(1.0, 0.0, 0.0); // Red
607609
// Velocity in Odom Frame Marker
608610
visualization_msgs::Marker velocityMarker;
609-
createVelocityMarker(staticTransformsPtr_->getImuFrame(), ros::Time(navStatePtr->getTimeK()), navStatePtr->getI_v_W_I(), velocityMarker);
611+
createVelocityMarker(staticTransformsPtr_->getImuFrame(), ros::Time(navStatePtr->getTimeK()), navStatePtr->getI_v_W_I(), colorRgb,
612+
velocityMarker);
610613
// Publish
611614
if (pubVelocityMarker_.getNumSubscribers() > 0) {
612615
pubVelocityMarker_.publish(velocityMarker);

0 commit comments

Comments
 (0)