| Pose Graph 3D | 
 | ---------------- | 
 |  | 
 | The Simultaneous Localization and Mapping (SLAM) problem consists of building a | 
 | map of an unknown environment while simultaneously localizing against this | 
 | map. The main difficulty of this problem stems from not having any additional | 
 | external aiding information such as GPS. SLAM has been considered one of the | 
 | fundamental challenges of robotics. A pose graph optimization problem is one | 
 | example of a SLAM problem. | 
 |  | 
 | The example also illustrates how to use Eigen's geometry module with Ceres' | 
 | automatic differentiation functionality. To represent the orientation, we will | 
 | use Eigen's quaternion which uses the Hamiltonian convention but has different | 
 | element ordering as compared with Ceres's rotation representation. Specifically | 
 | they differ by whether the scalar component q_w is first or last; the element | 
 | order for Ceres's quaternion is [q_w, q_x, q_y, q_z] where as Eigen's quaternion | 
 | is [q_x, q_y, q_z, q_w]. | 
 |  | 
 | This package defines the necessary Ceres cost functions needed to model the | 
 | 3-dimensional pose graph optimization problem as well as a binary to build and | 
 | solve the problem. The cost functions are shown for instruction purposes and can | 
 | be speed up by using analytical derivatives which take longer to implement. | 
 |  | 
 |  | 
 | Running | 
 | ----------- | 
 | This package includes an executable `pose_graph_3d` that will read a problem | 
 | definition file. This executable can work with any 3D problem definition that | 
 | uses the g2o format with quaternions used for the orientation representation. It | 
 | would be relatively straightforward to implement a new reader for a different | 
 | format such as TORO or others. `pose_graph_3d` will print the Ceres solver full | 
 | summary and then output to disk the original and optimized poses | 
 | (`poses_original.txt` and `poses_optimized.txt`, respectively) of the robot in | 
 | the following format: | 
 | ``` | 
 | pose_id x y z q_x q_y q_z q_w | 
 | pose_id x y z q_x q_y q_z q_w | 
 | pose_id x y z q_x q_y q_z q_w | 
 | ... | 
 | ``` | 
 | where `pose_id` is the corresponding integer ID from the file definition. Note, | 
 | the file will be sorted in ascending order for the `pose_id`. | 
 |  | 
 | The executable `pose_graph_3d` has one flag `--input` which is the path to the | 
 | problem definition. To run the executable, | 
 | ``` | 
 | /path/to/bin/pose_graph_3d --input /path/to/dataset/dataset.g2o | 
 | ``` | 
 |  | 
 | A script is provided to visualize the resulting output files. There is also an | 
 | option to enable equal axes using ```--axes_equal```. | 
 | ``` | 
 | /path/to/repo/examples/slam/pose_graph_3d/plot_results.py --optimized_poses ./poses_optimized.txt --initial_poses ./poses_original.txt | 
 | ``` |