plot_results.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/python
  2. #
  3. # Plots the results from the 3D pose graph optimization. It will draw a line
  4. # between consecutive vertices. The commandline expects two optional filenames:
  5. #
  6. # ./plot_results.py --initial_poses filename --optimized_poses filename
  7. #
  8. # The files have the following format:
  9. # ID x y z q_x q_y q_z q_w
  10. from mpl_toolkits.mplot3d import Axes3D
  11. import matplotlib.pyplot as plot
  12. import numpy
  13. import sys
  14. from optparse import OptionParser
  15. def set_axes_equal(axes):
  16. ''' Sets the axes of a 3D plot to have equal scale. '''
  17. x_limits = axes.get_xlim3d()
  18. y_limits = axes.get_ylim3d()
  19. z_limits = axes.get_zlim3d()
  20. x_range = abs(x_limits[1] - x_limits[0])
  21. x_middle = numpy.mean(x_limits)
  22. y_range = abs(y_limits[1] - y_limits[0])
  23. y_middle = numpy.mean(y_limits)
  24. z_range = abs(z_limits[1] - z_limits[0])
  25. z_middle = numpy.mean(z_limits)
  26. length = 0.5 * max([x_range, y_range, z_range])
  27. axes.set_xlim3d([x_middle - length, x_middle + length])
  28. axes.set_ylim3d([y_middle - length, y_middle + length])
  29. axes.set_zlim3d([z_middle - length, z_middle + length])
  30. parser = OptionParser()
  31. parser.add_option("--initial_poses", dest="initial_poses",
  32. default="", help="The filename that contains the original poses.")
  33. parser.add_option("--optimized_poses", dest="optimized_poses",
  34. default="", help="The filename that contains the optimized poses.")
  35. parser.add_option("-e", "--axes_equal", action="store_true", dest="axes_equal",
  36. default="", help="Make the plot axes equal.")
  37. (options, args) = parser.parse_args()
  38. # Read the original and optimized poses files.
  39. poses_original = None
  40. if options.initial_poses != '':
  41. poses_original = numpy.genfromtxt(options.initial_poses,
  42. usecols = (1, 2, 3))
  43. poses_optimized = None
  44. if options.optimized_poses != '':
  45. poses_optimized = numpy.genfromtxt(options.optimized_poses,
  46. usecols = (1, 2, 3))
  47. # Plots the results for the specified poses.
  48. figure = plot.figure()
  49. if poses_original is not None:
  50. axes = plot.subplot(1, 2, 1, projection='3d')
  51. plot.plot(poses_original[:, 0], poses_original[:, 1], poses_original[:, 2],
  52. '-', alpha=0.5, color="green")
  53. plot.title('Original')
  54. if options.axes_equal:
  55. axes.set_aspect('equal')
  56. set_axes_equal(axes)
  57. if poses_optimized is not None:
  58. axes = plot.subplot(1, 2, 2, projection='3d')
  59. plot.plot(poses_optimized[:, 0], poses_optimized[:, 1], poses_optimized[:, 2],
  60. '-', alpha=0.5, color="blue")
  61. plot.title('Optimized')
  62. if options.axes_equal:
  63. axes.set_aspect('equal')
  64. set_axes_equal(plot.gca())
  65. # Show the plot and wait for the user to close.
  66. plot.show()