5 #include <sparse_bundle_adjustment/Frame.h> 6 #include <visualization_msgs/Marker.h> 14 #include <ros/callback_queue.h> 37 void addFrame(
const sba::Frame::ConstPtr& msg);
38 void addNode(
const sba::CameraNode& msg);
39 void addPoint(
const sba::WorldPoint& msg);
40 void addProj(
const sba::Projection& msg);
50 ros::Time beginning = ros::Time::now();
53 for (i=0; i < msg->nodes.size(); i++)
55 addNode(msg->nodes[i]);
59 for (i=0; i < msg->points.size(); i++)
61 addPoint(msg->points[i]);
65 for (i=0; i < msg->projections.size(); i++)
67 addProj(msg->projections[i]);
73 if (
sba.nodes.size() % 5 == 0)
78 ros::Time end = ros::Time::now();
80 printf(
"[SBA] Added frame with %u nodes, %u points, and %u projections (%f s)\n",
81 (
unsigned int)msg->nodes.size(), (
unsigned int)msg->points.size(),
82 (
unsigned int)msg->projections.size(), (end-beginning).toSec());
87 Vector4d trans(msg.transform.translation.x, msg.transform.translation.y, msg.transform.translation.z, 1.0);
88 Quaterniond qrot(msg.transform.rotation.w, msg.transform.rotation.x, msg.transform.rotation.y, msg.transform.rotation.z);
91 cam_params.
fx = msg.fx;
92 cam_params.
fy = msg.fy;
93 cam_params.
cx = msg.cx;
94 cam_params.
cy = msg.cy;
95 cam_params.
tx = msg.baseline;
97 bool fixed = msg.fixed;
99 unsigned int newindex =
sba.addNode(trans, qrot, cam_params, fixed);
101 node_indices[msg.index] = newindex;
106 Vector4d point(msg.x, msg.y, msg.z, msg.w);
107 unsigned int newindex =
sba.addPoint(point);
109 point_indices[msg.index] = newindex;
114 int camindex = node_indices[msg.camindex];
115 int pointindex = point_indices[msg.pointindex];
116 Vector3d keypoint(msg.u, msg.v, msg.d);
117 bool stereo = msg.stereo;
118 bool usecovariance = msg.usecovariance;
119 Eigen::Matrix3d covariance;
120 covariance << msg.covariance[0], msg.covariance[1], msg.covariance[2],
121 msg.covariance[3], msg.covariance[4], msg.covariance[5],
122 msg.covariance[6], msg.covariance[7], msg.covariance[8];
125 if (pointindex < (
int)
sba.tracks.size() && camindex < (int)
sba.nodes.size())
127 sba.addProj(camindex, pointindex, keypoint, stereo);
129 sba.setProjCovariance(camindex, pointindex, covariance);
133 ROS_INFO(
"Failed to add projection: C: %d, P: %d, Csize: %d, Psize: %d",
134 camindex, pointindex,(
int)
sba.nodes.size(),(int)
sba.tracks.size());
140 unsigned int projs = 0;
142 for (
int i = 0; i < (int)
sba.tracks.size(); i++)
144 projs +=
sba.tracks[i].projections.size();
146 ROS_INFO(
"SBA Nodes: %d, Points: %d, Projections: %d", (
int)
sba.nodes.size(),
147 (int)
sba.tracks.size(), projs);
149 if (
sba.nodes.size() > 0)
154 double cost =
sba.calcRMSCost();
156 if (isnan(cost) || isinf(cost))
158 ROS_INFO(
"NaN cost!");
162 if (
sba.calcRMSCost() > 4.0)
164 if (
sba.calcRMSCost() > 4.0)
173 if (cam_marker_pub.getNumSubscribers() > 0 || point_marker_pub.getNumSubscribers() > 0)
182 cam_marker_pub = n.advertise<visualization_msgs::Marker>(
"/sba/cameras", 1);
183 point_marker_pub = n.advertise<visualization_msgs::Marker>(
"/sba/points", 1);
189 frame_sub = n.subscribe<sba::Frame>(
"/sba/frames", 5000, &
SBANode::addFrame,
this);
191 sba.useCholmod(
true);
193 printf(
"[SBA] Initialization complete.\n");
196 int main(
int argc,
char** argv)
198 ros::init(argc, argv,
"sba_node");
#define SBA_SPARSE_CHOLESKY
ros::Publisher cam_marker_pub
void addNode(const sba::CameraNode &msg)
int main(int argc, char **argv)
SysSBA holds a set of nodes and points for sparse bundle adjustment.
void addProj(const sba::Projection &msg)
std::map< unsigned int, unsigned int > node_indices
void drawGraph(const SysSBA &sba, const ros::Publisher &camera_pub, const ros::Publisher &point_pub, int decimation=1, int bicolor=0)
ros::Publisher point_marker_pub
void addPoint(const sba::WorldPoint &msg)
ros::Subscriber frame_sub
void addFrame(const sba::Frame::ConstPtr &msg)
std::map< unsigned int, unsigned int > point_indices