# Difference between motion-only bundle adjustment and pose-graph optimization

I've been trying to figure out the difference between motion-only bundle adjustment and pose-graph optimization, when talking about systems that only use cameras to estimate motion between frames, but have so far had no luck finding a solid explanation explaining the differences between these two concepts.

Motion-only BA optimizes over camera poses, and treats triangulated landmark positions as being constant, where the error function is the reprojection error between triangulated 3D landmarks and their corresponding 2D feature points on the camera/image plane (e.g. a nice explanation of motion-only BA can be found on page 4 of the ORB-SLAM2 paper).

However, pose-graph optimization seems extremely similar, where again camera poses are optimized and triangulated landmark positions are treated as being constant during optimization. But, instead of having a reprojection-based error function, the error function for pose-graph optimization instead seems to be the difference between relative poses (e.g. a nice explanation of pose-graph optimization can be found on page 9 of the tutorial paper on visual odometry by Fraundorfer and Scaramuzza).

However, for vision-based systems it seems like the difference between relative poses has to be obtained using some type of reprojection-based error function (assuming the use of sparse features, and not dense tracking). As such, are motion-only BA and pose-graph optimization two names for the same thing, or are there more nuanced differences between the two?

## 3 Answers

From the Appendix section of the ORB SLAM paper:

... In pose optimization, or motion-only BA, (see section V) all points are fixed and only the camera pose is optimized.

So yes, they are the same, I assume it's only the context that makes the use of one term preferable over the other.

In my opinion, they are meaninglessly different. On the backside of all these names BA, motion only BA, pose-graph optimization, batch optimization, what they do is simply optimize the device trajectory (6dof x N).

The difference between BA and pose-graph optimization used to be whether they optimize the structure part. But these days, people marginalize the structure part in BA and introduce reprojection constraints to the pose graph which is more like batch optimization rather than graph optimization. I am not even sure if the option only BA has a structure part in the state.

I would put all of them into a pose optimization problem with different constraints.

After going over ORB-SLAM 1, 2 and 3 paper, I think there may be a slight difference between what motion-only BA and local BA and, pose graph optimization are meaning. I think, the consideration should be given between motion-BA and local-BA, both using keyframes in constructing a directed graph and then optimizing the values of the nodes by nudging the values of edges (thats how I understand graph optimization in general).

But what motion-only BA is doing is refining the current pose estimation from the VO module with last known keyframe pose (which should have been optimized by local-BA). On the other hand, the local-BA is taking a bunch of keyframes within a certain distance from the current camera pose and optimizing those on a separate thread. Buth both are computing reprojection error to minimize the objective fuction. Thus my two cent on the question is that motion-only BA and local-BA are pose graph optimization where the number of keyframes (and map points) considered differes in an attempt to balance accuracy with speed