correct frame name in functions
This commit is contained in:
@@ -80,19 +80,20 @@ namespace vio
|
|||||||
-sin(pitch),cos(pitch);
|
-sin(pitch),cos(pitch);
|
||||||
T2_=SE2(R,Vector2d(se3.translation().x(),se3.translation().z()));
|
T2_=SE2(R,Vector2d(se3.translation().x(),se3.translation().z()));
|
||||||
}
|
}
|
||||||
SE2_5(double x,double z,double pitch){
|
SE2_5(double y,double z,double roll){
|
||||||
Eigen::Matrix<double, 2,2> R;
|
Eigen::Matrix<double, 2,2> R;
|
||||||
R<<cos(pitch),sin(pitch),
|
R<<cos(roll),sin(roll),
|
||||||
-sin(pitch),cos(pitch);
|
-sin(roll),cos(roll);
|
||||||
T2_=SE2(R,Vector2d(x,z));
|
T2_=SE2(R,Vector2d(y,z));
|
||||||
};
|
};
|
||||||
SE2 se2() const{
|
SE2 se2() const{
|
||||||
return T2_;
|
return T2_;
|
||||||
}
|
}
|
||||||
SE2 inverse() const{
|
SE2 inverse() const{
|
||||||
double yaw=atan2(T2_.so2().unit_complex().imag(),T2_.so2().unit_complex().real());
|
double roll=atan2(T2_.so2().unit_complex().imag(),T2_.so2().unit_complex().real());
|
||||||
return SE2(yaw+M_PI,-1.0*T2_.translation());
|
return SE2(roll+M_PI,-1.0*T2_.translation());
|
||||||
}
|
}
|
||||||
|
// Rotation around x
|
||||||
double pitch()const{
|
double pitch()const{
|
||||||
return atan2(T2_.rotation_matrix()(0,1),T2_.rotation_matrix()(0,0));
|
return atan2(T2_.rotation_matrix()(0,1),T2_.rotation_matrix()(0,0));
|
||||||
}
|
}
|
||||||
@@ -102,7 +103,7 @@ namespace vio
|
|||||||
R<<T2_.rotation_matrix()(0,0),0.0,T2_.rotation_matrix()(0,1),
|
R<<T2_.rotation_matrix()(0,0),0.0,T2_.rotation_matrix()(0,1),
|
||||||
0.0,1.0,0.0,
|
0.0,1.0,0.0,
|
||||||
T2_.rotation_matrix()(1,0),0.0,T2_.rotation_matrix()(1,1);
|
T2_.rotation_matrix()(1,0),0.0,T2_.rotation_matrix()(1,1);
|
||||||
return SE3(R,Vector3d(T2_.translation()(0),1e-19,T2_.translation()(1)));
|
return SE3(R,Vector3d(T2_.translation()(0),1e-19,T2_.translation()(1)));
|
||||||
}
|
}
|
||||||
~SE2_5(){}
|
~SE2_5(){}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
};
|
};
|
||||||
virtual ~Base(){
|
virtual ~Base(){
|
||||||
};
|
};
|
||||||
void predict(double dx,double dz,double dpitch,double time){
|
void predict(double dx,double dy,double dpitch,double time){
|
||||||
double dt=time-t_cmd;
|
double dt=time-t_cmd;
|
||||||
if(t_cmd==0.0){
|
if(t_cmd==0.0){
|
||||||
t_cmd=time;
|
t_cmd=time;
|
||||||
@@ -25,20 +25,20 @@ public:
|
|||||||
}
|
}
|
||||||
t_cmd=time;
|
t_cmd=time;
|
||||||
state_h_(2)=state_(2)+dt*dpitch;
|
state_h_(2)=state_(2)+dt*dpitch;
|
||||||
state_h_(1)=state_(1)+dt*(dz*cos(state_(2))-dx*sin(state_(2)));
|
state_h_(1)=state_(1)+dt*(dy*cos(state_(2))-dx*sin(state_(2)));
|
||||||
state_h_(0)=state_(0)+dt*(dx*cos(state_(2))+dz*sin(state_(2)));
|
state_h_(0)=state_(0)+dt*(dx*cos(state_(2))+dy*sin(state_(2)));
|
||||||
Eigen::Matrix<double,3,3> R;
|
Eigen::Matrix<double,3,3> R;
|
||||||
R<<vio::Config::Cmd_Cov(),0,0,
|
R<<vio::Config::Cmd_Cov(),0,0,
|
||||||
0,vio::Config::Cmd_Cov(),0,
|
0,vio::Config::Cmd_Cov(),0,
|
||||||
0,0,vio::Config::Cmd_Cov();
|
0,0,vio::Config::Cmd_Cov();
|
||||||
Eigen::Matrix<double,3,3> G;
|
Eigen::Matrix<double,3,3> G;
|
||||||
G<<1.0,0,dt*(-dx*sin(state_(2))+dz*cos(state_(2))),
|
G<<1.0,0,dt*(-dx*sin(state_(2))+dy*cos(state_(2))),
|
||||||
0,1.0,dt*(-dz*sin(state_(2))-dx*cos(state_(2))),
|
0,1.0,dt*(-dy*sin(state_(2))-dx*cos(state_(2))),
|
||||||
0,0,1.0;
|
0,0,1.0;
|
||||||
cov_h_=G*cov_*G.transpose()+R;
|
cov_h_=G*cov_*G.transpose()+R;
|
||||||
predict_up=true;
|
predict_up=true;
|
||||||
}
|
}
|
||||||
void correct(double ddx, double ddz, double dpitch, double time){
|
void correct(double ddx, double ddy, double dpitch, double time){
|
||||||
double dt=time-t_imu;
|
double dt=time-t_imu;
|
||||||
if(t_imu==0.0){
|
if(t_imu==0.0){
|
||||||
t_imu=time;
|
t_imu=time;
|
||||||
@@ -49,28 +49,28 @@ public:
|
|||||||
Eigen::Matrix<double,3,3> Q;
|
Eigen::Matrix<double,3,3> Q;
|
||||||
Eigen::Matrix<double,3,1> E;
|
Eigen::Matrix<double,3,1> E;
|
||||||
Eigen::Matrix<double,3,3> k;
|
Eigen::Matrix<double,3,3> k;
|
||||||
H<<1.0,0,pow(dt,2)*(ddz*cos(state_(2))-ddx*sin(state_(2))),
|
H<<1.0,0,pow(dt,2)*(ddy*cos(state_(2))-ddx*sin(state_(2))),
|
||||||
0,1.0,-pow(dt,2)*(ddx*cos(state_(2))+ddz*sin(state_(2))),
|
0,1.0,-pow(dt,2)*(ddx*cos(state_(2))+ddy*sin(state_(2))),
|
||||||
0,0,1.0;
|
0,0,1.0;
|
||||||
Q<<vio::Config::ACC_Noise(),0,0,
|
Q<<vio::Config::ACC_Noise(),0,0,
|
||||||
0,vio::Config::ACC_Noise(),0,
|
0,vio::Config::ACC_Noise(),0,
|
||||||
0,0,vio::Config::GYO_Noise();
|
0,0,vio::Config::GYO_Noise();
|
||||||
E(0)=state_(0)+pow(dt,2)*(ddx*cos(state_(2))+ddz*sin(state_(2)))-state_h_(0);
|
E(0)=state_(0)+pow(dt,2)*(ddx*cos(state_(2))+ddy*sin(state_(2)))-state_h_(0);
|
||||||
E(1)=state_(1)+pow(dt,2)*(ddz*cos(state_(2))-ddx*sin(state_(2)))-state_h_(1);
|
E(1)=state_(1)+pow(dt,2)*(ddy*cos(state_(2))-ddx*sin(state_(2)))-state_h_(1);
|
||||||
E(2)=state_(2)+dt*dpitch-state_h_(2);
|
E(2)=state_(2)+dt*dpitch-state_h_(2);
|
||||||
k=cov_h_*H.transpose()*(H*cov_h_*H.transpose()+Q).inverse();
|
k=cov_h_*H.transpose()*(H*cov_h_*H.transpose()+Q).inverse();
|
||||||
state_=state_h_+k*E;
|
state_=state_h_+k*E;
|
||||||
cov_=(Eigen::MatrixXd::Identity(3,3)-k*H)*cov_h_;
|
cov_=(Eigen::MatrixXd::Identity(3,3)-k*H)*cov_h_;
|
||||||
state_h_(2)=state_(2)+dt*dpitch;
|
state_h_(2)=state_(2)+dt*dpitch;
|
||||||
state_h_(1)=state_(1)+pow(dt,2)*(ddz*cos(state_(2))-ddx*sin(state_(2)));
|
state_h_(1)=state_(1)+pow(dt,2)*(ddy*cos(state_(2))-ddx*sin(state_(2)));
|
||||||
state_h_(0)=state_(0)+pow(dt,2)*(ddx*cos(state_(2))+ddz*sin(state_(2)));
|
state_h_(0)=state_(0)+pow(dt,2)*(ddx*cos(state_(2))+ddy*sin(state_(2)));
|
||||||
Eigen::Matrix<double,3,3> R;
|
Eigen::Matrix<double,3,3> R;
|
||||||
R<<vio::Config::ACC_Noise(),0,0,
|
R<<vio::Config::ACC_Noise(),0,0,
|
||||||
0,vio::Config::ACC_Noise(),0,
|
0,vio::Config::ACC_Noise(),0,
|
||||||
0,0,vio::Config::GYO_Noise();
|
0,0,vio::Config::GYO_Noise();
|
||||||
Eigen::Matrix<double,3,3> G;
|
Eigen::Matrix<double,3,3> G;
|
||||||
G<<1.0,0,pow(dt,2)*(ddz*cos(state_(2))-ddx*sin(state_(2))),
|
G<<1.0,0,pow(dt,2)*(ddy*cos(state_(2))-ddx*sin(state_(2))),
|
||||||
0,1.0,-pow(dt,2)*(ddx*cos(state_(2))+ddz*sin(state_(2))),
|
0,1.0,-pow(dt,2)*(ddx*cos(state_(2))+ddy*sin(state_(2))),
|
||||||
0,0,1.0;
|
0,0,1.0;
|
||||||
cov_h_=G*cov_*G.transpose()+R;
|
cov_h_=G*cov_*G.transpose()+R;
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
double t_cmd=0.0;
|
double t_cmd=0.0;
|
||||||
Eigen::Matrix<double,3,3> cov_h_;
|
Eigen::Matrix<double,3,3> cov_h_;
|
||||||
Eigen::Matrix<double, 3, 1> state_h_;//state{x,z,pitch}
|
Eigen::Matrix<double, 3, 1> state_h_;//state{x,y,pitch( rotation aound z)} in world frame
|
||||||
double t_imu=0.0;
|
double t_imu=0.0;
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -111,29 +111,29 @@ public:
|
|||||||
virtual ~UKF() {
|
virtual ~UKF() {
|
||||||
delete filter_;
|
delete filter_;
|
||||||
};
|
};
|
||||||
void UpdateIMU(double x,double z,double pitch,const ros::Time& time) {
|
void UpdateIMU(double x/*in imu frame*/,double y/*in imu frame*/,double pitch/*in imu frame*/,const ros::Time& time) {
|
||||||
while(lock)usleep(5);
|
while(lock)usleep(5);
|
||||||
lock=true;
|
lock=true;
|
||||||
if(abs(x)<1.0)x=pow(x,3);//picked up from your code
|
if(abs(x)<1.0)x=pow(x,3);//picked up from your code
|
||||||
if(abs(z)<1.0)z=pow(z,3);//picked up from your code
|
if(abs(y)<1.0)y=pow(y,3);//picked up from your code
|
||||||
if(filter_->predict_up)filter_->correct(x,z,pitch,1e-9*time.toNSec());
|
if(filter_->predict_up)filter_->correct(x,y,pitch,1e-9*time.toNSec());
|
||||||
lock=false;
|
lock=false;
|
||||||
};
|
};
|
||||||
void UpdateCmd(double x,double z,double pitch,const ros::Time& time) {
|
void UpdateCmd(double x/*in imu frame*/,double y/*in imu frame*/,double pitch/*in imu frame*/,const ros::Time& time) {
|
||||||
while(lock)usleep(5);
|
while(lock)usleep(5);
|
||||||
lock=true;
|
lock=true;
|
||||||
filter_->predict(x,z,pitch,1e-9*time.toNSec());
|
filter_->predict(x,y,pitch,1e-9*time.toNSec());
|
||||||
lock=false;
|
lock=false;
|
||||||
};
|
};
|
||||||
std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5> UpdateSvo(double x,double z,double pitch,size_t match,ros::Time& time) {
|
std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5> UpdateSvo(double y/*in camera frame*/,double z/*in camera frame*/,double roll/*in camera frame*/,size_t match,ros::Time& time) {
|
||||||
while(lock)usleep(5);
|
while(lock)usleep(5);
|
||||||
lock=true;
|
lock=true;
|
||||||
pitch=pitch+M_PI;
|
roll=roll+M_PI;
|
||||||
if(filter_->predict_up)filter_->correct(-z,-x,pitch,match,1e-9*time.toNSec());
|
if(filter_->predict_up)filter_->correct(-z,-y,roll,match,1e-9*time.toNSec());
|
||||||
lock=false;
|
lock=false;
|
||||||
double pitch_f;
|
double roll_f;
|
||||||
pitch_f=filter_->state_(2)+M_PI;
|
roll_f=filter_->state_(2)+M_PI;
|
||||||
return std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5>(filter_->cov_,vio::SE2_5(-filter_->state_(1),-filter_->state_(0),pitch_f));
|
return std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5>(filter_->cov_,vio::SE2_5(-filter_->state_(1),-filter_->state_(0),roll_f));
|
||||||
};
|
};
|
||||||
std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5> get_location(){
|
std::pair<Eigen::Matrix<double,3,3>,vio::SE2_5> get_location(){
|
||||||
double pitch_f;
|
double pitch_f;
|
||||||
|
|||||||
@@ -15,25 +15,15 @@ float2 world2cam(float3 feature)
|
|||||||
|
|
||||||
float3 xyz_cur(float3 cur, float3 ref, float3 ref_feature)
|
float3 xyz_cur(float3 cur, float3 ref, float3 ref_feature)
|
||||||
{
|
{
|
||||||
ref.x*=-1.0;
|
if(ref.z < 0.0)
|
||||||
ref.y*=-1.0;
|
ref.z = 3.141592653589793238462643383279502884197169399375 - ref.z;
|
||||||
ref.z = 3.141592653589793238462643383279502884197169399375 +ref.z;
|
else
|
||||||
float3 error=ref+cur;
|
ref.z = ref.z - 3.1415926535897932384626433832795028841971693993;
|
||||||
float yaw=0.0;
|
float cc_ss = cos(cur.z) * cos(ref.z) - sin(cur.z) * sin(ref.z);
|
||||||
float pitch=error.z;
|
float sc_cs = cos(cur.z) * sin(ref.z) + cos(ref.z) * sin(cur.z);
|
||||||
float roll=15.0;
|
return (float3)(cc_ss * ref_feature.x + sc_cs * ref_feature.z + cur.x - ref.x * cos(cur.z) - ref.z * sin(cur.z),
|
||||||
float R00=cos(yaw)*cos(pitch);//cos(pitch)
|
ref_feature.y,
|
||||||
float R01=cos(yaw)*sin(pitch)*sin(roll)-sin(yaw)*cos(roll);//0
|
-1.0 * sc_cs * ref_feature.x + cc_ss * ref_feature.z + cur.z + ref.x * sin(cur.z) - ref.z * cos(cur.z));
|
||||||
float R02=cos(yaw)*sin(pitch)*cos(roll)+sin(yaw)*sin(roll);//sin(pitch)
|
|
||||||
float R10=sin(yaw)*cos(pitch);//0
|
|
||||||
float R11=sin(yaw)*sin(pitch)*sin(roll)+cos(yaw)*cos(roll);//1
|
|
||||||
float R12=sin(yaw)*sin(pitch)*cos(roll)-cos(yaw)*sin(roll);//0
|
|
||||||
float R20=-sin(pitch);//-sin(pitch)
|
|
||||||
float R21=cos(pitch)*sin(roll);//0
|
|
||||||
float R22=cos(pitch)*cos(roll);//cos(pitch)
|
|
||||||
return (float3)(R00*ref_feature.x+R01*ref_feature.y+R02*ref_feature.z+error.x,
|
|
||||||
R10*ref_feature.x+R11*ref_feature.y+R12*ref_feature.z,
|
|
||||||
R20*ref_feature.x+R21*ref_feature.y+R22*ref_feature.z+error.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void jacobian_xyz2uv(float3 xyz_in_f, float* J)
|
void jacobian_xyz2uv(float3 xyz_in_f, float* J)
|
||||||
|
|||||||
Reference in New Issue
Block a user