CRITICAL: Now publishing camera in world frame. before it was the opposite.

This commit is contained in:
Christian Forster
2014-04-28 14:23:39 +02:00
parent 3ad948a0f1
commit 5e48a22f4d
6 changed files with 33 additions and 31 deletions
-4
View File
@@ -63,9 +63,6 @@ public:
virtual ~FrameHandlerBase(); virtual ~FrameHandlerBase();
/// Set initial pose of the camera.
void setInitialPose(const SE3& T_frame_from_world) { T_f_w_init_ = T_frame_from_world; }
/// Get the current map. /// Get the current map.
const Map& map() const { return map_; } const Map& map() const { return map_; }
@@ -92,7 +89,6 @@ protected:
bool set_reset_; //!< Flag that the user can set. Will reset the system before the next iteration. bool set_reset_; //!< Flag that the user can set. Will reset the system before the next iteration.
bool set_start_; //!< Flag the user can set to start the system when the next image is received. bool set_start_; //!< Flag the user can set to start the system when the next image is received.
Map map_; //!< Map of keyframes created by the slam system. Map map_; //!< Map of keyframes created by the slam system.
SE3 T_f_w_init_; //!< Initial pose of the camera.
vk::Timer timer_; //!< Stopwatch to measure time to process frame. vk::Timer timer_; //!< Stopwatch to measure time to process frame.
vk::RingBuffer<double> acc_frame_timings_; //!< Total processing time of the last 10 frames, used to give some user feedback on the performance. vk::RingBuffer<double> acc_frame_timings_; //!< Total processing time of the last 10 frames, used to give some user feedback on the performance.
vk::RingBuffer<size_t> acc_num_obs_; //!< Number of observed features of the last 10 frames, used to give some user feedback on the tracking performance. vk::RingBuffer<size_t> acc_num_obs_; //!< Number of observed features of the last 10 frames, used to give some user feedback on the tracking performance.
+8 -8
View File
@@ -120,14 +120,14 @@ int FrameHandlerBase::finishFrameProcessingCommon(
num_obs_last_ = num_observations; num_obs_last_ = num_observations;
SVO_STOP_TIMER("tot_time"); SVO_STOP_TIMER("tot_time");
#ifdef SVO_TRACE #ifdef SVO_TRACE
g_permon->writeToFile(); g_permon->writeToFile();
{ {
boost::unique_lock<boost::mutex> lock(map_.point_candidates_.mut_); boost::unique_lock<boost::mutex> lock(map_.point_candidates_.mut_);
size_t n_candidates = map_.point_candidates_.candidates_.size(); size_t n_candidates = map_.point_candidates_.candidates_.size();
SVO_LOG(n_candidates); SVO_LOG(n_candidates);
} }
#endif #endif
// reset if failure or requested // reset if failure or requested
if(dropout == RESULT_FAILURE || set_reset_) if(dropout == RESULT_FAILURE || set_reset_)
+1 -1
View File
@@ -91,7 +91,7 @@ void FrameHandlerMono::setFirstFrame(const FramePtr& first_frame)
FrameHandlerMono::UpdateResult FrameHandlerMono::processFirstFrame() FrameHandlerMono::UpdateResult FrameHandlerMono::processFirstFrame()
{ {
new_frame_->T_f_w_ = T_f_w_init_; new_frame_->T_f_w_ = SE3(Matrix3d::Identity(), Vector3d::Zero());
if(klt_homography_init_.addFirstFrame(new_frame_) == initialization::FAILURE) if(klt_homography_init_.addFirstFrame(new_frame_) == initialization::FAILURE)
return RESULT_NO_KEYFRAME; return RESULT_NO_KEYFRAME;
new_frame_->setKeyframe(); new_frame_->setKeyframe();
+1
View File
@@ -59,6 +59,7 @@ public:
ros::Publisher pub_dense_; ros::Publisher pub_dense_;
image_transport::Publisher pub_images_; image_transport::Publisher pub_images_;
tf::TransformBroadcaster br_; tf::TransformBroadcaster br_;
SE3 T_world_from_vision_;
Visualizer(); Visualizer();
~Visualizer() {}; ~Visualizer() {};
+18 -12
View File
@@ -43,7 +43,8 @@ Visualizer() :
trace_id_(0), trace_id_(0),
img_pub_level_(vk::getParam<int>("svo/image_publishing_level", 0)), img_pub_level_(vk::getParam<int>("svo/image_publishing_level", 0)),
img_pub_nth_(vk::getParam<int>("svo/publish_every_nth_img", 1)), img_pub_nth_(vk::getParam<int>("svo/publish_every_nth_img", 1)),
dense_pub_nth_(vk::getParam<int>("svo/publish_every_nth_dense_input", 1)) dense_pub_nth_(vk::getParam<int>("svo/publish_every_nth_dense_input", 1)),
T_world_from_vision_(Matrix3d::Identity(), Vector3d::Zero())
{ {
// Init ROS Marker Publishers // Init ROS Marker Publishers
pub_frames_ = pnh_.advertise<visualization_msgs::Marker>("keyframes", 10); pub_frames_ = pnh_.advertise<visualization_msgs::Marker>("keyframes", 10);
@@ -159,22 +160,27 @@ publishMinimal(const cv::Mat& img, const FramePtr& frame, const FrameHandlerMono
pub_images_.publish(img_msg.toImageMsg()); pub_images_.publish(img_msg.toImageMsg());
} }
// publish pose (world in camera frame) // publish pose (camera in world frame)
if(pub_pose_.getNumSubscribers() > 0 && frame != NULL) if(pub_pose_.getNumSubscribers() > 0 && frame != NULL)
{ {
// transform from vision-frame to world-frame
SE3 T_world_from_cam(T_world_from_vision_*frame->T_f_w_.inverse());
Quaterniond q_world_from_cam(T_world_from_cam.rotation_matrix()*T_world_from_vision_.rotation_matrix().transpose());
const Vector3d& p_cam_in_world(T_world_from_cam.translation());
Matrix<double,6,6> Cov_in_world = T_world_from_cam.Adj()*frame->Cov_*T_world_from_cam.inverse().Adj();
// publish message
geometry_msgs::PoseWithCovarianceStampedPtr msg_pose(new geometry_msgs::PoseWithCovarianceStamped); geometry_msgs::PoseWithCovarianceStampedPtr msg_pose(new geometry_msgs::PoseWithCovarianceStamped);
Quaterniond q(frame->T_f_w_.rotation_matrix());
Vector3d p(frame->T_f_w_.translation());
msg_pose->header = header_msg; msg_pose->header = header_msg;
msg_pose->pose.pose.position.x = p[0]; msg_pose->pose.pose.position.x = p_cam_in_world[0];
msg_pose->pose.pose.position.y = p[1]; msg_pose->pose.pose.position.y = p_cam_in_world[1];
msg_pose->pose.pose.position.z = p[2]; msg_pose->pose.pose.position.z = p_cam_in_world[2];
msg_pose->pose.pose.orientation.x = q.x(); msg_pose->pose.pose.orientation.x = q_world_from_cam.x();
msg_pose->pose.pose.orientation.y = q.y(); msg_pose->pose.pose.orientation.y = q_world_from_cam.y();
msg_pose->pose.pose.orientation.z = q.z(); msg_pose->pose.pose.orientation.z = q_world_from_cam.z();
msg_pose->pose.pose.orientation.w = q.w(); msg_pose->pose.pose.orientation.w = q_world_from_cam.w();
for(size_t i=0; i<36; ++i) for(size_t i=0; i<36; ++i)
msg_pose->pose.covariance[i] = frame->Cov_(i%6, i/6); msg_pose->pose.covariance[i] = Cov_in_world(i%6, i/6);
pub_pose_.publish(msg_pose); pub_pose_.publish(msg_pose);
} }
} }
+5 -6
View File
@@ -74,18 +74,17 @@ VoNode() :
if(!vk::camera_loader::loadFromRosNs("svo", cam_)) if(!vk::camera_loader::loadFromRosNs("svo", cam_))
throw std::runtime_error("Camera model not correctly specified."); throw std::runtime_error("Camera model not correctly specified.");
// Init camera // Get initial position and orientation
vo_ = new svo::FrameHandlerMono(cam_); visualizer_.T_world_from_vision_ = Sophus::SE3(
// Set initial position and orientation
Sophus::SE3 T_cam_from_world(
vk::rpy2dcm(Vector3d(vk::getParam<double>("svo/init_rx", 0.0), vk::rpy2dcm(Vector3d(vk::getParam<double>("svo/init_rx", 0.0),
vk::getParam<double>("svo/init_ry", 0.0), vk::getParam<double>("svo/init_ry", 0.0),
vk::getParam<double>("svo/init_rz", 0.0))), vk::getParam<double>("svo/init_rz", 0.0))),
Eigen::Vector3d(vk::getParam<double>("svo/init_tx", 0.0), Eigen::Vector3d(vk::getParam<double>("svo/init_tx", 0.0),
vk::getParam<double>("svo/init_ty", 0.0), vk::getParam<double>("svo/init_ty", 0.0),
vk::getParam<double>("svo/init_tz", 0.0))); vk::getParam<double>("svo/init_tz", 0.0)));
vo_->setInitialPose(T_cam_from_world);
// Init VO and start
vo_ = new svo::FrameHandlerMono(cam_);
vo_->start(); vo_->start();
} }