diff --git a/include/publisher_map_grid_2d_gravity.h b/include/publisher_map_grid_2d_gravity.h new file mode 100644 index 0000000000000000000000000000000000000000..52547e35c90f88b45d7a2d2ba36a0b83d667c7a4 --- /dev/null +++ b/include/publisher_map_grid_2d_gravity.h @@ -0,0 +1,40 @@ +#ifndef PUBLISHER_MAP_GRID_2D_GRAVITY_H +#define PUBLISHER_MAP_GRID_2D_GRAVITY_H + +/************************** + * WOLF includes * + **************************/ +#include "core/problem/problem.h" +#include "imu/sensor/sensor_imu.h" + +#include "publisher.h" + + +namespace wolf +{ + +class PublisherMapGrid2dGravity: public Publisher +{ + std::string map_frame_id_; + ros::Publisher pub_accel_, pub_gyro_; + SensorImuPtr sensor_imu_; + + + public: + PublisherMapGrid2dGravity(const std::string& _unique_name, + const ParamsServer& _server, + const ProblemPtr _problem); + WOLF_PUBLISHER_CREATE(PublisherImuBias); + + virtual ~PublisherMapGrid2dGravity(){}; + + void initialize(ros::NodeHandle &nh, const std::string& topic) override; + + void publishDerived() override; + +}; + +WOLF_REGISTER_PUBLISHER(PublisherImuBias) +} + +#endif diff --git a/src/publisher_map_grid_2d_gravity.cpp b/src/publisher_map_grid_2d_gravity.cpp new file mode 100644 index 0000000000000000000000000000000000000000..12f969b1383148089dfe993c226e3b2ecca796fc --- /dev/null +++ b/src/publisher_map_grid_2d_gravity.cpp @@ -0,0 +1,44 @@ +#include "publisher_map_grid_2d_gravity.h" +#include <ros/ros.h> +#include "tf/transform_datatypes.h" +#include <geometry_msgs/Vector3.h> +#include <visualization_msgs/MarkerArray.h> + +namespace wolf +{ + +PublisherMapGrid2dGravity::PublisherMapGrid2dGravity(const std::string& _unique_name, + const ParamsServer& _server, + const ProblemPtr _problem) : + Publisher(_unique_name, _server, _problem) +{ + sensor_imu_ = std::static_pointer_cast<SensorImu>(_problem->getSensor(_server.getParam<std::string>(prefix_ + "/sensor_name"))); +} + +void PublisherMapGrid2dGravity::initialize(ros::NodeHandle& nh, const std::string& topic) +{ + pub_accel_ = nh.advertise<geometry_msgs::Vector3>(topic + "_bias_accel", 1); + pub_gyro_ = nh.advertise<geometry_msgs::Vector3>(topic + "_bias_gyro", 1); +} + +void PublisherMapGrid2dGravity::publishDerived() +{ + // Fill PoseStamped msg + geometry_msgs::Vector3 accel_bias_msg, gyro_bias_msg; + + Eigen::Vector3d accel_bias = sensor_imu_->getIntrinsic()->getState().head(3); + Eigen::Vector3d gyro_bias = sensor_imu_->getIntrinsic()->getState().tail(3); + + accel_bias_msg.x = accel_bias(0); + accel_bias_msg.y = accel_bias(1); + accel_bias_msg.z = accel_bias(2); + + gyro_bias_msg.x = gyro_bias(0); + gyro_bias_msg.y = gyro_bias(1); + gyro_bias_msg.z = gyro_bias(2); + + pub_accel_.publish(accel_bias_msg); + pub_gyro_.publish(gyro_bias_msg); +} + +} diff --git a/src/subscriber_imu_enableable.cpp b/src/subscriber_imu_enableable.cpp index 3b4e118facd9aace8e5eec3a04bf08ca91a41e45..2cfb082c511216d05ac210b3403a95050bb348fb 100644 --- a/src/subscriber_imu_enableable.cpp +++ b/src/subscriber_imu_enableable.cpp @@ -1,6 +1,7 @@ #include "../include/subscriber_imu_enableable.h" #include <core/factor/factor_relative_pose_3d.h> +#include <core/factor/factor_relative_pose_2d.h> #include "core/capture/capture_void.h" #include "core/processor/processor_motion.h" @@ -104,6 +105,9 @@ void SubscriberImuEnableable::callback(const sensor_msgs::Imu::ConstPtr& msg) // impose zero velocity last_frame_->getV()->setZero(); last_frame_->getV()->fix(); + + // impose zero odometry + processor_motion_->setOdometry(sensor_ptr_->getProblem()->stateZero(processor_motion_->getStateStructure())); } else { @@ -121,11 +125,16 @@ void SubscriberImuEnableable::callback(const sensor_msgs::Imu::ConstPtr& msg) // impose zero velocity last_frame_->getV()->setZero(); last_frame_->getV()->fix(); + + // impose zero odometry + processor_motion_->setOdometry(sensor_ptr_->getProblem()->stateZero(processor_motion_->getStateStructure())); // add zero displacement and rotation capture & feature & factor with all previous frames - Eigen::Vector7d zero_motion = Eigen::Vector7d::Zero(); - zero_motion.tail<4>() = Eigen::Quaterniond::Identity().coeffs(); assert(sensor_ptr_->getProblem()); + auto size = sensor_ptr_->getProblem()->getDim() == 3 ? 7:3; + Eigen::VectorXd zero_motion = Eigen::VectorXd::Zero(size); + if(sensor_ptr_->getProblem()->getDim() == 3) + zero_motion.tail<4>() = Eigen::Quaterniond::Identity().coeffs(); for (auto frm_pair = sensor_ptr_->getProblem()->getTrajectory()->begin(); frm_pair != sensor_ptr_->getProblem()->getTrajectory()->end(); frm_pair++) @@ -134,15 +143,24 @@ void SubscriberImuEnableable::callback(const sensor_msgs::Imu::ConstPtr& msg) break; auto capture_zero = CaptureBase::emplace<CaptureVoid>(last_frame_, last_frame_->getTimeStamp(), nullptr); auto feature_zero = FeatureBase::emplace<FeatureBase>(capture_zero, - "FeatureOdom3d", + "FeatureZeroOdom", zero_motion, - Eigen::Matrix6d::Identity() * 0.01); - FactorBase::emplace<FactorRelativePose3d>(feature_zero, - feature_zero, - frm_pair->second, - nullptr, - false, - TOP_MOTION); + Eigen::MatrixXd::Identity(size,size) * 0.01); + if(sensor_ptr_->getProblem()->getDim() == 3) + FactorBase::emplace<FactorRelativePose3d>(feature_zero, + feature_zero, + frm_pair->second, + nullptr, + false, + TOP_MOTION); + else + FactorBase::emplace<FactorRelativePose2d>(feature_zero, + feature_zero, + frm_pair->second, + nullptr, + false, + TOP_MOTION); + } } // static initialization ended