Skip to content

Commit 5f7d1ea

Browse files
committed
imuTcam (cam extrinsic acquired successfully)
1 parent 8bf7000 commit 5f7d1ea

3 files changed

Lines changed: 96 additions & 60 deletions

File tree

src/NodeDataManager.cpp

Lines changed: 67 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void NodeDataManager::camera_pose_callback( const nav_msgs::Odometry::ConstPtr&
4343
w_T_cam(2,3) = msg->pose.pose.position.z;
4444
w_T_cam(3,3) = 1.0;
4545
__NODEDATAMANAGER_CALLBACKS(
46-
cout << "camera_pose_callback: node_pose.size()=" << node_pose.size() << " curr_pose=" << PoseManipUtils::prettyprintMatrix4d( w_T_cam ) << endl;
46+
cout << "[NodeDataManager::camera_pose_callback] t=" << msg->header.stamp << ": node_pose.size()=" << node_pose.size() << " curr_pose=" << PoseManipUtils::prettyprintMatrix4d( w_T_cam ) << endl;
4747
)
4848

4949

@@ -75,56 +75,6 @@ void NodeDataManager::camera_pose_callback( const nav_msgs::Odometry::ConstPtr&
7575
}
7676

7777

78-
// void NodeDataManager::loopclosure_pose_callback( const nap::NapMsg::ConstPtr& msg )
79-
// {
80-
// // ROS_INFO( "NodeDataManager::loopclosure_pose_callback");
81-
// // Add a new edge ( 2 node*)
82-
//
83-
//
84-
// ros::Time t_c = msg->c_timestamp;
85-
// ros::Time t_p = msg->prev_timestamp;
86-
// int op_mode = msg->op_mode;
87-
// double goodness = (double)msg->goodness;
88-
// assert( op_mode == 30 );
89-
//
90-
// // retrive rel-pose p_T_c
91-
// Matrix4d p_T_c = Matrix4d::Zero();
92-
// Quaterniond quat( msg->p_T_c.orientation.w, msg->p_T_c.orientation.x, msg->p_T_c.orientation.y, msg->p_T_c.orientation.z );
93-
// p_T_c.topLeftCorner<3,3>() = quat.toRotationMatrix();
94-
// p_T_c(0,3) = msg->p_T_c.position.x;
95-
// p_T_c(1,3) = msg->p_T_c.position.y;
96-
// p_T_c(2,3) = msg->p_T_c.position.z;
97-
// p_T_c(3,3) = 1.0;
98-
//
99-
//
100-
// // Lock
101-
// node_mutex.lock() ;
102-
//
103-
// // loop up t_c in node_timestamps[]
104-
// int index_t_c = find_indexof_node(node_timestamps, t_c );
105-
//
106-
// // loop up t_p in node_timestamps
107-
// int index_t_p = find_indexof_node(node_timestamps, t_p );
108-
//
109-
// // Unlock
110-
// node_mutex.unlock();
111-
//
112-
// cout << "[NodeDataManager] Rcvd NapMsg " << index_t_c << "<--->" << index_t_p << endl;
113-
// assert( t_c > t_p );
114-
//
115-
// std::pair<int,int> closure_edge;
116-
// closure_edge.first = index_t_p;
117-
// closure_edge.second = index_t_c;
118-
//
119-
// edge_mutex.lock();
120-
// loopclosure_edges.push_back( closure_edge );
121-
// loopclosure_edges_goodness.push_back( goodness );
122-
// loopclosure_p_T_c.push_back( p_T_c );
123-
// edge_mutex.unlock();
124-
//
125-
//
126-
//
127-
// }
12878
#ifdef __USE_SELF_LOOPEDGE_MSG
12979
void NodeDataManager::loopclosure_pose_callback( const solve_keyframe_pose_graph::LoopEdge::ConstPtr& msg )
13080
#else
@@ -208,6 +158,71 @@ void NodeDataManager::loopclosure_pose_callback( const cerebro::LoopEdge::Const
208158

209159
}
210160

161+
162+
void NodeDataManager::extrinsic_cam_imu_callback( const nav_msgs::Odometry::ConstPtr msg )
163+
{
164+
// __NODEDATAMANAGER_CALLBACKS( cout << TermColor::GREEN() << "[NodeDataManager::extrinsic_cam_imu_callback]" << msg->header.stamp << TermColor::RESET() << endl; )
165+
166+
// Acquire lock
167+
// update imu_T_cam,
168+
// update last got timestamp
169+
// set is_imu_cam_extrinsic_available to true
170+
{
171+
std::lock_guard<std::mutex> lk(imu_cam_mx);
172+
PoseManipUtils::geometry_msgs_Pose_to_eigenmat( msg->pose.pose, this->imu_T_cam );
173+
this->imu_T_cam_stamp = msg->header.stamp;
174+
this->imu_T_cam_available = true;
175+
176+
}
177+
178+
179+
__NODEDATAMANAGER_CALLBACKS(
180+
cout << TermColor::GREEN() << "[NodeDataManager::extrinsic_cam_imu_callback]" << msg->header.stamp << TermColor::RESET();
181+
cout << " imu_T_cam = " << PoseManipUtils::prettyprintMatrix4d(this->imu_T_cam);
182+
cout << endl;
183+
)
184+
185+
}
186+
187+
188+
Matrix4d NodeDataManager::get_imu_T_cam() const
189+
{
190+
std::lock_guard<std::mutex> lk(imu_cam_mx);
191+
// Remove this if, once i am confident everythinbg is ok!
192+
if( imu_T_cam_available == false )
193+
{
194+
ROS_ERROR( "[NodeDataManager::get_imu_T_cam] posegraph solver, you requested imu_T_cam aka imu-cam extrinsic calib, but currently it is not available. FATAL ERROR.\n");
195+
exit(1);
196+
}
197+
assert( imu_T_cam_available );
198+
return imu_T_cam;
199+
}
200+
201+
202+
void NodeDataManager::get_imu_T_cam( Matrix4d& res, ros::Time& _t ) const
203+
{
204+
std::lock_guard<std::mutex> lk(imu_cam_mx);
205+
// Remove this if, once i am confident everythinbg is ok!
206+
if( imu_T_cam_available == false )
207+
{
208+
ROS_ERROR( "[NodeDataManager::get_imu_T_cam] posegraph solver, you requested imu_T_cam aka imu-cam extrinsic calib, but currently it is not available. FATAL ERROR.\n");
209+
exit(1);
210+
}
211+
212+
assert( imu_T_cam_available );
213+
res = imu_T_cam;
214+
_t = imu_T_cam_stamp;
215+
return;
216+
}
217+
218+
bool NodeDataManager::is_imu_T_cam_available() const
219+
{
220+
std::lock_guard<std::mutex> lk(imu_cam_mx);
221+
return imu_T_cam_available;
222+
}
223+
224+
225+
211226
// internal node queue length info
212227
void NodeDataManager::print_nodes_lengths() const
213228
{
@@ -1005,7 +1020,7 @@ int NodeDataManager::n_worlds() const
10051020

10061021

10071022

1008-
void NodeDataManager::print_worlds_info( int verbosity ) const
1023+
void NodeDataManager::print_worlds_info( int verbosity ) const
10091024
{
10101025

10111026
bool start_ends_u_of_worlds=false, rel_pose_between_worlds=false, kidnap_info=false, which_world_each_node_belong_to=false ;

src/NodeDataManager.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,5 +193,17 @@ class NodeDataManager
193193
Worlds * worlds_handle_raw_ptr=NULL;
194194

195195

196+
//////// cam imu extrinsic (this is published by vins estimator node)
197+
public:
198+
void extrinsic_cam_imu_callback( const nav_msgs::Odometry::ConstPtr msg );
199+
Matrix4d get_imu_T_cam() const;
200+
void get_imu_T_cam( Matrix4d& res, ros::Time& _t ) const;
201+
bool is_imu_T_cam_available() const;
202+
203+
private:
204+
mutable mutex imu_cam_mx;
205+
bool imu_T_cam_available = false;
206+
Matrix4d imu_T_cam;
207+
ros::Time imu_T_cam_stamp;
196208

197209
};

src/keyframe_pose_graph_slam_node.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,17 @@ int main( int argc, char ** argv)
269269
ros::Subscriber sub_gt_ = nh.subscribe( ground_truth_topic, 100, ground_truth_callback );
270270
#endif
271271

272+
//-- subscribe to imu_T_cam : imu camera extrinsic calib. Will store this just in case there is a need
273+
// this is published by vins_estimator node.
274+
string extrinsic_cam_imu_topic = string("/vins_estimator/extrinsic");
275+
ROS_INFO( "Subscribe to extrinsic_cam_imu_topic: %s", extrinsic_cam_imu_topic.c_str() );
276+
ros::Subscriber sub_cam_imu_extrinsic = nh.subscribe( extrinsic_cam_imu_topic, 1000, &NodeDataManager::extrinsic_cam_imu_callback, manager );
272277

273278

279+
// TODO
280+
// subscribes to w_T_imu @100hz and publish the pose in my world frame at 100hz
281+
// implement this in composer class.
282+
274283
// Setup publishers
275284
//--- Marker ---//
276285
string marker_topic = string( "viz/visualization_marker");
@@ -303,7 +312,7 @@ int main( int argc, char ** argv)
303312
// std::thread th_slam( &PoseGraphSLAM::new_optimize6DOF, slam );
304313

305314
slam->reinit_ceres_problem_onnewloopedge_optimize6DOF_enable();
306-
// slam->reinit_ceres_problem_onnewloopedge_optimize6DOF_disable();
315+
slam->reinit_ceres_problem_onnewloopedge_optimize6DOF_disable();
307316
std::thread th_slam( &PoseGraphSLAM::reinit_ceres_problem_onnewloopedge_optimize6DOF, slam );
308317

309318

@@ -320,33 +329,33 @@ int main( int argc, char ** argv)
320329
// ++ start the pose assember thread - This is needed for the following publish threads
321330
// It queries data from manager, slam and assembles the upto date data. This is threadsafe.
322331
cmpr->pose_assember_enable();
323-
// cmpr->pose_assember_disable();
332+
cmpr->pose_assember_disable();
324333
std::thread assember_th( &Composer::pose_assember_thread, cmpr, 30 );
325334

326335
// ++ start bf_traj_publish_thread
327336
cmpr->bf_traj_publish_enable();
328-
// cmpr->bf_traj_publish_disable();
337+
cmpr->bf_traj_publish_disable();
329338
std::thread bf_pub_th( &Composer::bf_traj_publish_thread, cmpr, 15 );
330339

331340
// ++ start camera visual publisher thread
332341
cmpr->cam_visual_publish_enable();
333-
// cmpr->cam_visual_publish_disable();
342+
cmpr->cam_visual_publish_disable();
334343
std::thread cam_visual_pub_th( &Composer::cam_visual_publish_thread, cmpr, 30 );
335344

336345
// ++ loop edge publish thread
337346
cmpr->loopedge_publish_enable();
338-
// cmpr->loopedge_publish_disable();
347+
cmpr->loopedge_publish_disable();
339348
std::thread loopedge_pub_th( &Composer::loopedge_publish_thread, cmpr, 10 );
340349

341350
// ++ disjointset status image
342351
cmpr->disjointset_statusimage_publish_enable();
343-
// cmpr->disjointset_statusimage_publish_disable();
352+
cmpr->disjointset_statusimage_publish_disable();
344353
std::thread disjointset_monitor_pub_th( &Composer::disjointset_statusimage_publish_thread, cmpr, 1 );
345354

346355

347356
//----END Pose Composer---//
348357
//--- setup manager publishers threads - adhoc ---//
349-
std::thread th4( periodic_publish_odoms, manager, viz, 30.0, 0.0, 0.0 ); //if you enable this, dont forget to join(), after spin() returns.
358+
// std::thread th4( periodic_publish_odoms, manager, viz, 30.0, 0.0, 0.0 ); //if you enable this, dont forget to join(), after spin() returns.
350359

351360

352361

@@ -373,7 +382,7 @@ int main( int argc, char ** argv)
373382
cmpr->disjointset_statusimage_publish_disable();
374383

375384

376-
th4.join();
385+
// th4.join();
377386

378387
th_slam.join();
379388
assember_th.join();

0 commit comments

Comments
 (0)