34 std::runtime_error(
"Static transforms not set. Has to be set.");
56 startTime = std::chrono::high_resolution_clock::now();
90 ros::TransportHints().tcpNoDelay());
125 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res) {
127 const int maxIterations = req.max_optimization_iterations;
128 const bool saveCovarianceFlag = req.save_covariance;
133 res.message =
"Optimization successful.";
136 res.message =
"Optimization failed.";
145 res.message =
"Logging real-time states.";
148 res.message =
"Could not log real-time states. Did you enable the flag 'logRealTimeStateToMemory'?";
154 const Eigen::Vector3d& t,
const int maxBufferLength) {
155 geometry_msgs::PoseStamped pose;
156 pose.header.frame_id = fixedFrameName;
157 pose.header.stamp = stamp;
158 pose.pose.position.x = t(0);
159 pose.pose.position.y = t(1);
160 pose.pose.position.z = t(2);
161 pathPtr->header.frame_id = fixedFrameName;
162 pathPtr->header.stamp = stamp;
163 pathPtr->poses.push_back(pose);
164 if (pathPtr->poses.size() > maxBufferLength) {
165 pathPtr->poses.erase(pathPtr->poses.begin());
170 const ros::Time& stamp,
const Eigen::Isometry3d& T,
const Eigen::Vector3d& F_v_W_F,
171 const Eigen::Vector3d& F_w_W_F,
const Eigen::Matrix<double, 6, 6>& poseCovariance,
172 const Eigen::Matrix<double, 6, 6>& twistCovariance) {
173 msgPtr->header.frame_id = fixedFrame;
174 msgPtr->child_frame_id = movingFrame;
175 msgPtr->header.stamp = stamp;
177 msgPtr->twist.twist.linear.x = F_v_W_F(0);
178 msgPtr->twist.twist.linear.y = F_v_W_F(1);
179 msgPtr->twist.twist.linear.z = F_v_W_F(2);
180 msgPtr->twist.twist.angular.x = F_w_W_F(0);
181 msgPtr->twist.twist.angular.y = F_w_W_F(1);
182 msgPtr->twist.twist.angular.z = F_w_W_F(2);
184 for (
int i = 0; i < 6; i++) {
185 for (
int j = 0; j < 6; j++) {
186 msgPtr->pose.covariance[6 * i + j] = poseCovariance(i, j);
187 msgPtr->twist.covariance[6 * i + j] = twistCovariance(i, j);
193 const ros::Time& stamp,
const Eigen::Isometry3d& T,
194 const Eigen::Matrix<double, 6, 6>& transformCovariance) {
195 msgPtr->header.frame_id = frameName;
196 msgPtr->header.stamp = stamp;
198 for (
int i = 0; i < 6; i++) {
199 for (
int j = 0; j < 6; j++) {
200 msgPtr->pose.covariance[6 * i + j] = transformCovariance(i, j);
206 const std::string& referenceFrameName,
const ros::Time& stamp,
const Eigen::Isometry3d& T_R_L,
207 const std::string& transformName) {
209 static std::deque<std::string> lastMarkerNames;
210 static int landmarkIndex = 0;
212 if (std::find(lastMarkerNames.begin(), lastMarkerNames.end(), transformName) != lastMarkerNames.end()) {
217 lastMarkerNames.push_back(transformName);
219 lastMarkerNames.pop_front();
224 visualization_msgs::Marker landmarkMarker;
226 Eigen::Vector3d(1.0, 0.0, 0.0), landmarkMarker);
229 markerArrayPtr->markers.push_back(landmarkMarker);
232 markerArrayPtr->markers.erase(markerArrayPtr->markers.begin());
237 Eigen::Matrix<double, 6, 6>& poseCovarianceRos, Eigen::Matrix<double, 6, 6>& twistCovarianceRos,
238 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr) {
240 if (optimizedStateWithCovarianceAndBiasPtr !=
nullptr) {
243 twistCovarianceRos.block<3, 3>(0, 0) = optimizedStateWithCovarianceAndBiasPtr->getVelocityCovariance();
245 poseCovarianceRos.setZero();
246 twistCovarianceRos.setZero();
252 const Eigen::Vector3d& colorRgb, visualization_msgs::Marker& marker) {
254 marker.header.frame_id = referenceFrameName;
255 marker.header.stamp = stamp;
257 marker.type = visualization_msgs::Marker::ARROW;
258 marker.action = visualization_msgs::Marker::ADD;
260 const double scale = velocity.norm();
261 marker.scale.x = 0.1;
262 marker.scale.y = 0.2;
263 marker.scale.z = 0.2;
264 marker.color.a = 1.0;
265 marker.color.r = colorRgb(0);
266 marker.color.g = colorRgb(1);
267 marker.color.b = colorRgb(2);
269 geometry_msgs::Point startPoint, endPoint;
270 startPoint = geometry_msgs::Point();
274 endPoint = geometry_msgs::Point();
275 endPoint.x = startPoint.x + velocity(0);
276 endPoint.y = startPoint.y + velocity(1);
277 endPoint.z = startPoint.z + velocity(2);
278 marker.points.push_back(startPoint);
279 marker.points.push_back(endPoint);
281 tf::Quaternion q = tf::createQuaternionFromRPY(0, 0, 0);
282 tf::quaternionTFToMsg(q, marker.pose.orientation);
286 const std::string& nameSpace,
const int id,
const Eigen::Vector3d& colorRgb,
287 visualization_msgs::Marker& marker) {
289 marker.header.frame_id = referenceFrameName;
290 marker.header.stamp = stamp;
291 marker.ns = nameSpace;
293 marker.type = visualization_msgs::Marker::SPHERE;
294 marker.action = visualization_msgs::Marker::ADD;
296 marker.scale.x = 0.1;
297 marker.scale.y = 0.1;
298 marker.scale.z = 0.1;
299 marker.color.a = 1.0;
300 marker.color.r = colorRgb(0);
301 marker.color.g = colorRgb(1);
302 marker.color.b = colorRgb(2);
304 marker.pose.position.x = position(0);
305 marker.pose.position.y = position(1);
306 marker.pose.position.z = position(2);
308 marker.pose.orientation.x = 0.0;
309 marker.pose.orientation.y = 0.0;
310 marker.pose.orientation.z = 0.0;
311 marker.pose.orientation.w = 1.0;
315 currentTime = std::chrono::high_resolution_clock::now();
322 Eigen::Vector3d linearAcc(imuMsgPtr->linear_acceleration.x, imuMsgPtr->linear_acceleration.y, imuMsgPtr->linear_acceleration.z);
323 Eigen::Vector3d angularVel(imuMsgPtr->angular_velocity.x, imuMsgPtr->angular_velocity.y, imuMsgPtr->angular_velocity.z);
324 Eigen::Matrix<double, 6, 1> addedImuMeasurements;
327 std::shared_ptr<SafeIntegratedNavState> preIntegratedNavStatePtr =
nullptr;
328 std::shared_ptr<SafeNavStateWithCovarianceAndBias> optimizedStateWithCovarianceAndBiasPtr =
nullptr;
332 optimizedStateWithCovarianceAndBiasPtr, addedImuMeasurements)) {
334 if (ros::Time::now() - ros::Time(preIntegratedNavStatePtr->getTimeK()) > ros::Duration(0.5)) {
336 << (ros::Time::now() - ros::Time(preIntegratedNavStatePtr->getTimeK())).toSec() <<
" seconds." <<
COLOR_END << std::endl;
340 this->
publishState(preIntegratedNavStatePtr, optimizedStateWithCovarianceAndBiasPtr);
352 const std::shared_ptr<holistic_fusion::SafeIntegratedNavState>& integratedNavStatePtr,
353 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr) {
355 Eigen::Matrix<double, 6, 6> poseCovarianceRos, twistCovarianceRos;
359 Eigen::Vector3d positionVarianceRos = poseCovarianceRos.block<3, 3>(0, 0).diagonal();
360 Eigen::Vector3d orientationVarianceRos = poseCovarianceRos.block<3, 3>(3, 3).diagonal();
364 positionVarianceRos, orientationVarianceRos, integratedNavStatePtr,
365 optimizedStateWithCovarianceAndBiasPtr);
366 publishNonTimeCriticalDataThread.detach();
371 const Eigen::Matrix<double, 6, 6> poseCovarianceRos,
const Eigen::Matrix<double, 6, 6> twistCovarianceRos,
372 const Eigen::Vector3d positionVarianceRos,
const Eigen::Vector3d orientationVarianceRos,
373 const std::shared_ptr<const holistic_fusion::SafeIntegratedNavState> integratedNavStatePtr,
374 const std::shared_ptr<const holistic_fusion::SafeNavStateWithCovarianceAndBias> optimizedStateWithCovarianceAndBiasPtr) {
379 const double& timeK = integratedNavStatePtr->getTimeK();
382 publishImuOdoms(integratedNavStatePtr, poseCovarianceRos, twistCovarianceRos);
386 Eigen::Isometry3d T_B_Ok =
388 integratedNavStatePtr->getT_O_Ik_gravityAligned().inverse();
391 Eigen::Isometry3d T_O_W = integratedNavStatePtr->getT_W_O().inverse();
408 const std::shared_ptr<const holistic_fusion::SafeNavStateWithCovarianceAndBias> optimizedStateWithCovarianceAndBiasPtr,
409 const Eigen::Matrix<double, 6, 6>& poseCovarianceRos,
const Eigen::Matrix<double, 6, 6>& twistCovarianceRos) {
410 if (optimizedStateWithCovarianceAndBiasPtr !=
nullptr &&
419 ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK()), optimizedStateWithCovarianceAndBiasPtr->getT_W_Ik(),
420 optimizedStateWithCovarianceAndBiasPtr->getI_v_W_I(), optimizedStateWithCovarianceAndBiasPtr->getI_w_W_I(),
421 poseCovarianceRos, twistCovarianceRos);
428 optimizedStateWithCovarianceAndBiasPtr->getT_W_Ik().translation(),
graphConfigPtr_->imuBufferLength_ * 20);
436 Eigen::Vector3d accelBias = optimizedStateWithCovarianceAndBiasPtr->getAccelerometerBias();
437 accelBiasMsgPtr_->header.stamp = ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK());
446 Eigen::Vector3d gyroBias = optimizedStateWithCovarianceAndBiasPtr->getGyroscopeBias();
447 gyroBiasMsgPtr_->header.stamp = ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK());
456 for (
const auto& framePairTransformMapIterator :
457 optimizedStateWithCovarianceAndBiasPtr->getReferenceFrameTransforms().getTransformsMap()) {
462 Eigen::Isometry3d T_W_M;
463 std::string mapFrameName;
467 if (framePairTransformMapIterator.first.second == worldFrameName) {
468 T_W_M = framePairTransformMapIterator.second.inverse();
469 mapFrameName = framePairTransformMapIterator.first.first;
473 T_W_M = framePairTransformMapIterator.second;
474 mapFrameName = framePairTransformMapIterator.first.second;
478 geometry_msgs::PoseWithCovarianceStampedPtr poseWithCovarianceStampedMsgPtr =
479 boost::make_shared<geometry_msgs::PoseWithCovarianceStamped>();
482 ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK()), T_W_M,
483 optimizedStateWithCovarianceAndBiasPtr->getReferenceFrameTransformsCovariance().rv_T_frame1_frame2(
484 framePairTransformMapIterator.first.first, framePairTransformMapIterator.first.second));
499 std::cout <<
"Transformation from " << mapFrameName <<
" to " << worldFrameName << std::endl;
500 std::cout <<
"Uncertainty: " << std::endl
501 << optimizedStateWithCovarianceAndBiasPtr->getReferenceFrameTransformsCovariance().rv_T_frame1_frame2(
502 framePairTransformMapIterator.first.first, framePairTransformMapIterator.first.second)
508 optimizedStateWithCovarianceAndBiasPtr->getTimeK(), T_W_M);
512 const std::string& sensorFrameName = framePairTransformMapIterator.first.first;
513 const std::string& sensorFrameNameCorrected = framePairTransformMapIterator.first.second;
514 const Eigen::Isometry3d& T_sensor_sensorCorrected = framePairTransformMapIterator.second;
517 std::string transformTopic =
"/holistic_fusion/transform_" + sensorFrameName +
"_to_" + sensorFrameNameCorrected;
518 geometry_msgs::PoseWithCovarianceStampedPtr poseWithCovarianceStampedMsgPtr =
519 boost::make_shared<geometry_msgs::PoseWithCovarianceStamped>();
521 poseWithCovarianceStampedMsgPtr, sensorFrameName, ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK()),
522 T_sensor_sensorCorrected,
523 optimizedStateWithCovarianceAndBiasPtr->getReferenceFrameTransformsCovariance().rv_T_frame1_frame2(sensorFrameName,
524 sensorFrameNameCorrected));
535 publishTfTreeTransform(sensorFrameName, sensorFrameNameCorrected, optimizedStateWithCovarianceAndBiasPtr->getTimeK(),
536 T_sensor_sensorCorrected);
541 for (
const auto& landmarkTransformMapIterator : optimizedStateWithCovarianceAndBiasPtr->getLandmarkTransforms().getTransformsMap()) {
543 Eigen::Isometry3d T_W_L = landmarkTransformMapIterator.second;
544 std::string worldFrameName = landmarkTransformMapIterator.first.first;
545 std::string landmarkFrameName = landmarkTransformMapIterator.first.second;
548 std::string landmarkName =
"/holistic_fusion/landmark_" +
staticTransformsPtr_->getWorldFrame() +
"_to_" + landmarkFrameName;
550 ros::Time(optimizedStateWithCovarianceAndBiasPtr->getTimeK()), T_W_L, landmarkName);
561 const Eigen::Isometry3d& T_frame_childFrame) {
562 tf::Transform transform_frame_childFrame =
isometry3ToTf(T_frame_childFrame);
563 tfBroadcaster.sendTransform(tf::StampedTransform(transform_frame_childFrame, ros::Time(timeStamp), parentFrameName, childFrameName));
567 const Eigen::Matrix<double, 6, 6>& poseCovarianceRos,
568 const Eigen::Matrix<double, 6, 6>& twistCovarianceRos)
const {
572 ros::Time(preIntegratedNavStatePtr->getTimeK()), preIntegratedNavStatePtr->getT_O_Ik_gravityAligned(),
573 preIntegratedNavStatePtr->getI_v_W_I(), preIntegratedNavStatePtr->getI_w_W_I(), poseCovarianceRos, twistCovarianceRos);
579 ros::Time(preIntegratedNavStatePtr->getTimeK()), preIntegratedNavStatePtr->getT_W_Ik(),
580 preIntegratedNavStatePtr->getI_v_W_I(), preIntegratedNavStatePtr->getI_w_W_I(), poseCovarianceRos, twistCovarianceRos);
586 const double timeStamp)
const {
609 Eigen::Vector3d colorRgb(1.0, 0.0, 0.0);
611 visualization_msgs::Marker velocityMarker;
623 navStatePtr->getT_O_Ik_gravityAligned().translation(),
graphConfigPtr_->imuBufferLength_ * 20);
629 (navStatePtr->getT_W_Ik()).translation(),
graphConfigPtr_->imuBufferLength_ * 20);
638 sensor_msgs::Imu addedImuMeasMsg;
639 addedImuMeasMsg.header.stamp = stamp;
641 addedImuMeasMsg.linear_acceleration.x = addedImuMeas(0);
642 addedImuMeasMsg.linear_acceleration.y = addedImuMeas(1);
643 addedImuMeasMsg.linear_acceleration.z = addedImuMeas(2);
644 addedImuMeasMsg.angular_velocity.x = addedImuMeas(3);
645 addedImuMeasMsg.angular_velocity.y = addedImuMeas(4);
646 addedImuMeasMsg.angular_velocity.z = addedImuMeas(5);
#define NUM_MARKERS_IN_ARRAY
#define NUM_KEEP_MARKER_NAMES
static void addToLandmarkMarkerArrayMsg(const visualization_msgs::MarkerArrayPtr &markerArrayPtr, const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Isometry3d &T_R_L, const std::string &transformName)
virtual bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request &req, holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response &res)
nav_msgs::OdometryPtr optWorldImuMsgPtr_
ros::Publisher pubVelocityMarker_
std::chrono::time_point< std::chrono::high_resolution_clock > startTime
static void createVelocityMarker(const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Vector3d &velocity, const Eigen::Vector3d &colorRgb, visualization_msgs::Marker &marker)
ros::ServiceServer srvSmootherOptimize_
bool srvLogRealTimeNavStatesCallback(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res)
void setup(const std::shared_ptr< StaticTransforms > staticTransformsPtr)
virtual void initializeServices(ros::NodeHandle &privateNode)
std::chrono::time_point< std::chrono::high_resolution_clock > currentTime
ros::Publisher pubAddedImuMeas_
nav_msgs::PathPtr estWorldImuPathPtr_
ros::Publisher pubEstOdomImu_
nav_msgs::OdometryPtr estWorldImuMsgPtr_
nav_msgs::OdometryPtr estOdomImuMsgPtr_
static void addToPathMsg(const nav_msgs::PathPtr &pathPtr, const std::string &frameName, const ros::Time &stamp, const Eigen::Vector3d &t, int maxBufferLength)
visualization_msgs::MarkerArrayPtr landmarkMarkersMsgPtr_
void publishOptimizedStateAndBias(const std::shared_ptr< const holistic_fusion::SafeNavStateWithCovarianceAndBias > optimizedStateWithCovarianceAndBiasPtr, const Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > &twistCovarianceRos)
void publishImuOdoms(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &preIntegratedNavStatePtr, const Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > &twistCovarianceRos) const
geometry_msgs::Vector3StampedPtr estWorldPosVarianceMsgPtr_
std::map< std::string, ros::Publisher > pubPoseStampedByTopicMap_
static void addToOdometryMsg(const nav_msgs::OdometryPtr &msgPtr, const std::string &fixedFrame, const std::string &movingFrame, const ros::Time &stamp, const Eigen::Isometry3d &T, const Eigen::Vector3d &W_v_W_F, const Eigen::Vector3d &W_w_W_F, const Eigen::Matrix< double, 6, 6 > &poseCovariance=Eigen::Matrix< double, 6, 6 >::Zero(), const Eigen::Matrix< double, 6, 6 > &twistCovariance=Eigen::Matrix< double, 6, 6 >::Zero())
nav_msgs::PathPtr estOdomImuPathPtr_
ros::Publisher pubEstWorldRotVariance_
void publishVelocityMarkers(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &navStatePtr) const
virtual void initializeSubscribers(ros::NodeHandle &privateNode)
static void createContactMarker(const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Vector3d &position, const std::string &nameSpace, const int id, const Eigen::Vector3d &colorRgb, visualization_msgs::Marker &marker)
ros::Publisher pubOptWorldImu_
geometry_msgs::Vector3StampedPtr estWorldRotVarianceMsgPtr_
static void extractCovariancesFromOptimizedState(Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, Eigen::Matrix< double, 6, 6 > &twistCovarianceRos, const std::shared_ptr< holistic_fusion::SafeNavStateWithCovarianceAndBias > &optimizedStateWithCovarianceAndBiasPtr)
virtual void readParams(const ros::NodeHandle &privateNode)
std::string referenceFrameAlignedNameId
std::string optimizationResultLoggingPath
ros::Publisher pubOptWorldImuPath_
ros::Publisher pubEstWorldImuPath_
ros::Publisher pubLandmarks_
geometry_msgs::Vector3StampedPtr gyroBiasMsgPtr_
ros::NodeHandle privateNode
nav_msgs::PathPtr optWorldImuPathPtr_
virtual void initializePublishers(ros::NodeHandle &privateNode)
virtual void imuCallback(const sensor_msgs::Imu::ConstPtr &imuPtr)
ros::Publisher pubEstWorldPosVariance_
void publishNonTimeCriticalData(const Eigen::Matrix< double, 6, 6 > poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > twistCovarianceRos, const Eigen::Vector3d positionVarianceRos, const Eigen::Vector3d orientationVarianceRos, const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > integratedNavStatePtr, const std::shared_ptr< const holistic_fusion::SafeNavStateWithCovarianceAndBias > optimizedStateWithCovarianceAndBiasPtr)
ros::Publisher pubEstOdomImuPath_
ros::Publisher pubEstWorldImu_
virtual void initializeMessages(ros::NodeHandle &privateNode)
ros::ServiceServer srvLogRealTimeNavStates_
void publishTfTreeTransform(const std::string &frameName, const std::string &childFrameName, double timeStamp, const Eigen::Isometry3d &T_frame_childFrame)
void publishDiagVarianceVectors(const Eigen::Vector3d &posVarianceRos, const Eigen::Vector3d &rotVarianceRos, const double timeStamp) const
HolisticFusionRos(const std::shared_ptr< ros::NodeHandle > &privateNodePtr)
ros::Publisher pubGyroBias_
static void addToPoseWithCovarianceStampedMsg(const geometry_msgs::PoseWithCovarianceStampedPtr &msgPtr, const std::string &frameName, const ros::Time &stamp, const Eigen::Isometry3d &T, const Eigen::Matrix< double, 6, 6 > &transformCovariance=Eigen::Matrix< double, 6, 6 >::Zero())
void publishAddedImuMeas(const Eigen::Matrix< double, 6, 1 > &addedImuMeas, const ros::Time &stamp) const
virtual void publishState(const std::shared_ptr< holistic_fusion::SafeIntegratedNavState > &integratedNavStatePtr, const std::shared_ptr< holistic_fusion::SafeNavStateWithCovarianceAndBias > &optimizedStateWithCovarianceAndBiasPtr)
double lastOptimizedStateTimestamp_
ros::Publisher pubAccelBias_
std::mutex rosPublisherMutex_
void publishImuPaths(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &navStatePtr) const
geometry_msgs::Vector3StampedPtr accelBiasMsgPtr_
tf::TransformBroadcaster tfBroadcaster
void setup(const std::shared_ptr< GraphConfig > graphConfigPtr, const std::shared_ptr< StaticTransforms > staticTransformsPtr)
std::shared_ptr< GraphConfig > graphConfigPtr_
bool logRealTimeNavStates(const std::string &savePath)
bool addCoreImuMeasurementAndGetState(const Eigen::Vector3d &linearAcc, const Eigen::Vector3d &angularVel, const double imuTimeK, std::shared_ptr< SafeIntegratedNavState > &returnPreIntegratedNavStatePtr, std::shared_ptr< SafeNavStateWithCovarianceAndBias > &returnOptimizedStateWithCovarianceAndBiasPtr, Eigen::Matrix< double, 6, 1 > &returnAddedImuMeasurements)
Main: IMU --------------------—.
bool optimizeSlowBatchSmoother(int maxIterations, const std::string &savePath, const bool saveCovarianceFlag)
std::shared_ptr< StaticTransforms > staticTransformsPtr_
bool isGraphInited() const
@ kFunctioningAndStateMachine1
tf::Transform isometry3ToTf(const Eigen::Isometry3d &T)
Eigen::Matrix< double, 6, 6 > convertCovarianceGtsamConventionToRosConvention(const Eigen::Matrix< double, 6, 6 > &covGtsam)
Convert a 6x6 covariance matrix from ROS convention to GTSAM convention.