diff --git a/include/vision/factor/factor_pixel_hp.h b/include/vision/factor/factor_pixel_hp.h
index 832602ec2d568abbd21f4f2ea17d34181834712a..db475d2c6b1b458b40bcc8301fbb15077d447166 100644
--- a/include/vision/factor/factor_pixel_hp.h
+++ b/include/vision/factor/factor_pixel_hp.h
@@ -130,37 +130,21 @@ inline void FactorPixelHp::expectation(const T* const _frame_p,
 {
     using namespace Eigen;
 
-    // All involved transforms typedef
-    typedef Eigen::Transform<T, 3, Eigen::Isometry> TransformType;
-
-    // world to current robot transform
-    Map<const Matrix<T, 3, 1> > p_w_r(_frame_p);
-    Translation<T, 3>           t_w_r(p_w_r);
-    Map<const Quaternion<T> >   q_w_r(_frame_o);
-    TransformType               T_w_r = t_w_r * q_w_r;
-
-    // current robot to current camera transform
-    Map<const Matrix<T, 3, 1> > p_r_c(_sensor_p);
-    Translation<T, 3>           t_r_c(p_r_c);
-    Map<const Quaternion<T> >  	q_r_c(_sensor_o);
-    TransformType       		T_r_c = t_r_c * q_r_c;
-
-    // hmg point in current camera frame C
-    Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg(_lmk_hmg);
-    Eigen::Matrix<T, 4, 1> landmark_hmg_c = (T_w_r * T_r_c).inverse(Eigen::Isometry)
-                                           * landmark_hmg;
-
-    //std::cout << "p_w_r = \n\t" << _frame_p[0] << "\n\t" << _frame_p[1] << "\n\t" << _frame_p[2] << "\n";
-//    std::cout << "q_w_r = \n\t" << _frame_o[0] << "\n\t" << _frame_o[1] << "\n\t" << _frame_o[2] << "\n\t" << _frame_o[3] << "\n";
-//    std::cout << "p_r_c = \n\t" << _sensor_p[0] << "\n\t" << _sensor_p[1] << "\n\t" << _sensor_p[2] << "\n";
-//    std::cout << "q_r_c = \n\t" << _sensor_o[0] << "\n\t" << _sensor_o[1] << "\n\t" << _sensor_o[2] << "\n\t" << _sensor_o[3] << "\n";
-//    std::cout << "landmark_hmg_c = \n\t" << landmark_hmg_c(0) << "\n\t" << landmark_hmg_c(1) << "\n\t" << landmark_hmg_c(2) << "\n\t" << landmark_hmg_c(3) << "\n";
-
-    // lmk direction vector
-    Eigen::Matrix<T, 3, 1> v_dir = landmark_hmg_c.head(3);
-
-    // lmk inverse distance
-    T rho = landmark_hmg_c(3);
+    // frames
+    Matrix<T, 3, 1> p_wr(_frame_p);
+    Quaternion<T>   q_wr(_frame_o);
+    Matrix<T, 3, 1> p_rc(_sensor_p);
+    Quaternion<T>   q_rc(_sensor_o);
+    Matrix<T, 3, 1> p_wc = p_wr + q_wr * p_rc;
+    Quaternion<T>   q_wc = q_wr*q_rc;
+    Quaternion<T>   q_cw = q_wc.conjugate();
+    Matrix<T, 3, 1> p_cw = - (q_cw * p_wc);
+
+    // landmark hmg
+    Matrix<T, 4, 1> lh_w(_lmk_hmg);
+
+    // landmark dir vector in C frame
+    Matrix<T, 3, 1> v_dir = q_cw*lh_w.template head<3>() + p_cw * lh_w(3);
 
     // camera parameters
     Matrix<T, 4, 1> intrinsic = intrinsic_.cast<T>();
@@ -168,7 +152,7 @@ inline void FactorPixelHp::expectation(const T* const _frame_p,
 
     // project point and exit
     Eigen::Map<Eigen::Matrix<T, 2, 1> > expectation(_expectation);
-    expectation = pinhole::projectPoint(intrinsic, distortion, v_dir/rho);
+    expectation = pinhole::projectPoint(intrinsic, distortion, v_dir);
 
 }