Addressing Duy's comments about argparse and PEP8. Adding plot flag to the examples

release/4.3a0
Vikrant Shah 2019-01-21 00:46:57 -05:00
parent 223020ec82
commit b3b69bfd21
2 changed files with 78 additions and 58 deletions

View File

@ -6,66 +6,61 @@ Authors: Frank Dellaert, et al. (see THANKS for the full author list)
See LICENSE for the license information See LICENSE for the license information
A 2D Pose SLAM example that reads input from g2o, converts it to a factor graph and does the optimization. Output is written on a file, in g2o format A 2D Pose SLAM example that reads input from g2o, converts it to a factor graph
and does the optimization. Output is written on a file, in g2o format
Syntax for the script is "python ./Pose2SLAMExample_g2o.py input.g2o output.g2o"
""" """
# pylint: disable=invalid-name, E1101 # pylint: disable=invalid-name, E1101
from __future__ import print_function from __future__ import print_function
import argparse
import math import math
import numpy as np import numpy as np
import matplotlib.pyplot as plt
import gtsam import gtsam
import sys from utils import plot
def vector3(x, y, z): def vector3(x, y, z):
"""Create 3d double numpy array.""" """Create 3d double numpy array."""
return np.array([x, y, z], dtype=np.float) return np.array([x, y, z], dtype=np.float)
kernelType = "none"
maxIterations = 100 # default
g2oFile = gtsam.findExampleDataFile("noisyToyGraph.txt") # default
if len(sys.argv) > 1: parser = argparse.ArgumentParser(
g2ofile = str(sys.argv[1]) description="A 2D Pose SLAM example that reads input from g2o, "
print ("Input file: ",g2ofile) "converts it to a factor graph and does the optimization. "
if len(sys.argv) > 3: "Output is written on a file, in g2o format")
maxIterations = int(sys.argv[3]) parser.add_argument('-i', '--input', help='input file g2o format')
print("Sepficied max iterations: ", maxIterations) parser.add_argument('-o', '--output',
if len(sys.argv) > 4: help="the path to the output file with optimized graph")
kernelType = sys.argv[4] parser.add_argument('-m', '--maxiter', type=int,
help="maximum number of iterations for optimizer")
parser.add_argument('-k', '--kernel', choices=['none', 'huber', 'tukey'],
default="none", help="Type of kernel used")
parser.add_argument("-p", "--plot", action="store_true",
help="Flag to plot results")
args = parser.parse_args()
is3D = False # readG2o 3d parameter not available at time of this writing g2oFile = gtsam.findExampleDataFile("noisyToyGraph.txt") if args.input is None\
else args.input
if kernelType is "none": maxIterations = 100 if args.maxiter is None else args.maxiter
graph, initial = gtsam.readG2o(g2oFile)
if kernelType is "huber": is3D = False
print("Using robust kernel: huber - NOT CURRENTLY IMPLEMENTED IN PYTHON")
#graph, initial = gtsam.readG2o(g2oFile,is3D, KernelFunctionTypeHUBER) graph, initial = gtsam.readG2o(g2oFile, is3D)
if kernelType is "tukey":
print("Using robust kernel: tukey - NOT CURRENTLY IMPLEMENTED IN PYTHON") assert args.kernel == "none", "Supplied kernel type is not yet implemented"
#graph, initial = gtsam.readG2o(g2oFile,is3D, KernelFunctionTypeTUKEY)
# Add prior on the pose having index (key) = 0 # Add prior on the pose having index (key) = 0
graphWithPrior = graph graphWithPrior = graph
priorModel = gtsam.noiseModel_Diagonal.Variances(vector3(1e-6, 1e-6, 1e-8)) priorModel = gtsam.noiseModel_Diagonal.Variances(vector3(1e-6, 1e-6, 1e-8))
graphWithPrior.add(gtsam.PriorFactorPose2(0, gtsam.Pose2(), priorModel)) graphWithPrior.add(gtsam.PriorFactorPose2(0, gtsam.Pose2(), priorModel))
print("Adding prior on pose 0 ")
print("\nFactor Graph:\n{}".format(graph))
print("\nInitial Estimate:\n{}".format(initial))
params = gtsam.GaussNewtonParams() params = gtsam.GaussNewtonParams()
params.setVerbosity("Termination") params.setVerbosity("Termination")
params.setMaxIterations(maxIterations)
if (sys.argv > 3): # parameters.setRelativeErrorTol(1e-5)
params.setMaxIterations(maxIterations)
print("User setting: required to perform maximum ", maxIterations," iterations ")
#parameters.setRelativeErrorTol(1e-5)
# Create the optimizer ... # Create the optimizer ...
optimizer = gtsam.GaussNewtonOptimizer(graphWithPrior, initial, params) optimizer = gtsam.GaussNewtonOptimizer(graphWithPrior, initial, params)
# ... and optimize # ... and optimize
@ -75,11 +70,20 @@ print("Optimization complete")
print("initial error = ", graph.error(initial)) print("initial error = ", graph.error(initial))
print("final error = ", graph.error(result)) print("final error = ", graph.error(result))
if len(sys.argv) < 3:
if args.output is None:
print("\nFactor Graph:\n{}".format(graph))
print("\nInitial Estimate:\n{}".format(initial))
print("Final Result:\n{}".format(result)) print("Final Result:\n{}".format(result))
else: else:
outputFile = sys.argv[2] outputFile = args.output
print("Writing results to file: ", outputFile) print("Writing results to file: ", outputFile)
graphNoKernel, initial2 = gtsam.readG2o(g2oFile) graphNoKernel, _ = gtsam.readG2o(g2oFile, is3D)
gtsam.writeG2o(graphNoKernel, result, outputFile) gtsam.writeG2o(graphNoKernel, result, outputFile)
print ("Done!") print ("Done!")
if args.plot:
resultPoses = gtsam.extractPose2(result)
for i in range(resultPoses.shape[0]):
plot.plot_pose2(1, gtsam.Pose2(resultPoses[i, :]))
plt.show()

View File

@ -1,35 +1,45 @@
""" """
* @file Pose3SLAMExample_initializePose3.cpp * @file Pose3SLAMExample_initializePose3.cpp
* @brief A 3D Pose SLAM example that reads input from g2o, and initializes the Pose3 using InitializePose3 * @brief A 3D Pose SLAM example that reads input from g2o, and initializes the
* Syntax for the script is ./Pose3SLAMExample_initializePose3 input.g2o output.g2o * Pose3 using InitializePose3
* @date Jan 17, 2019 * @date Jan 17, 2019
* @author Vikrant Shah based on CPP example by Luca Carlone * @author Vikrant Shah based on CPP example by Luca Carlone
""" """
# pylint: disable=invalid-name, E1101 # pylint: disable=invalid-name, E1101
from __future__ import print_function from __future__ import print_function
import argparse
import math
import numpy as np import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import gtsam import gtsam
from utils import plot
import sys
def vector6(x, y, z, a, b, c): def vector6(x, y, z, a, b, c):
"""Create 6d double numpy array.""" """Create 6d double numpy array."""
return np.array([x, y, z, a, b, c], dtype=np.float) return np.array([x, y, z, a, b, c], dtype=np.float)
if len(sys.argv) < 2:
g2oFile = gtsam.findExampleDataFile("pose3example.txt") parser = argparse.ArgumentParser(
else: description="A 3D Pose SLAM example that reads input from g2o, and "
g2oFile = str(sys.argv[1]) "initializes Pose3")
parser.add_argument('-i', '--input', help='input file g2o format')
parser.add_argument('-o', '--output',
help="the path to the output file with optimized graph")
parser.add_argument("-p", "--plot", action="store_true",
help="Flag to plot results")
args = parser.parse_args()
g2oFile = gtsam.findExampleDataFile("pose3example.txt") if args.input is None \
else args.input
is3D = True is3D = True
graph, initial = gtsam.readG2o(g2oFile,is3D) graph, initial = gtsam.readG2o(g2oFile, is3D)
# Add Prior on the first key # Add Prior on the first key
priorModel = gtsam.noiseModel_Diagonal.Variances(vector6(1e-6, 1e-6, 1e-6, priorModel = gtsam.noiseModel_Diagonal.Variances(vector6(1e-6, 1e-6, 1e-6,
1e-4, 1e-4, 1e-4)) 1e-4, 1e-4, 1e-4))
print("Adding prior to g2o file ") print("Adding prior to g2o file ")
@ -38,19 +48,25 @@ firstKey = initial.keys().at(0)
graphWithPrior.add(gtsam.PriorFactorPose3(firstKey, gtsam.Pose3(), priorModel)) graphWithPrior.add(gtsam.PriorFactorPose3(firstKey, gtsam.Pose3(), priorModel))
params = gtsam.GaussNewtonParams() params = gtsam.GaussNewtonParams()
params.setVerbosity("Termination") # this will show info about stopping conditions params.setVerbosity("Termination") # this will show info about stopping conds
optimizer = gtsam.GaussNewtonOptimizer(graphWithPrior, initial, params) optimizer = gtsam.GaussNewtonOptimizer(graphWithPrior, initial, params)
result = optimizer.optimize() result = optimizer.optimize()
print("Optimization complete") print("Optimization complete")
print("initial error = ",graphWithPrior.error(initial)) print("initial error = ", graphWithPrior.error(initial))
print("final error = ",graphWithPrior.error(result)) print("final error = ", graphWithPrior.error(result))
if len(sys.argv) < 3: if args.output is None:
print("Final Result:\n{}".format(result)) print("Final Result:\n{}".format(result))
else: else:
outputFile = sys.argv[2] outputFile = args.output
print("Writing results to file: ", outputFile) print("Writing results to file: ", outputFile)
graphNoKernel, initial2 = gtsam.readG2o(g2oFile,is3D) graphNoKernel, _ = gtsam.readG2o(g2oFile, is3D)
gtsam.writeG2o(graphNoKernel, result, outputFile) gtsam.writeG2o(graphNoKernel, result, outputFile)
print ("Done!") print ("Done!")
if args.plot:
resultPoses = gtsam.allPose3s(result)
for i in range(resultPoses.size()):
plot.plot_pose3(1, resultPoses.atPose3(i))
plt.show()