Merge pull request #1042 from magicbycalvin/develop
Added a convenience function for plotting 2D points.release/4.3a0
						commit
						ee7d32d242
					
				| 
						 | 
				
			
			@ -10,7 +10,7 @@ from matplotlib import patches
 | 
			
		|||
from mpl_toolkits.mplot3d import Axes3D  # pylint: disable=unused-import
 | 
			
		||||
 | 
			
		||||
import gtsam
 | 
			
		||||
from gtsam import Marginals, Point3, Pose2, Pose3, Values
 | 
			
		||||
from gtsam import Marginals, Point2, Point3, Pose2, Pose3, Values
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def set_axes_equal(fignum: int) -> None:
 | 
			
		||||
| 
						 | 
				
			
			@ -108,6 +108,69 @@ def plot_covariance_ellipse_3d(axes,
 | 
			
		|||
    axes.plot_surface(x, y, z, alpha=alpha, cmap='hot')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def plot_point2_on_axes(axes,
 | 
			
		||||
                        point: Point2,
 | 
			
		||||
                        linespec: str,
 | 
			
		||||
                        P: Optional[np.ndarray] = None) -> None:
 | 
			
		||||
    """
 | 
			
		||||
    Plot a 2D point on given axis `axes` with given `linespec`.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
        axes (matplotlib.axes.Axes): Matplotlib axes.
 | 
			
		||||
        point: The point to be plotted.
 | 
			
		||||
        linespec: String representing formatting options for Matplotlib.
 | 
			
		||||
        P: Marginal covariance matrix to plot the uncertainty of the estimation.
 | 
			
		||||
    """
 | 
			
		||||
    axes.plot([point[0]], [point[1]], linespec, marker='.', markersize=10)
 | 
			
		||||
    if P is not None:
 | 
			
		||||
        w, v = np.linalg.eig(P)
 | 
			
		||||
 | 
			
		||||
        # "Sigma" value for drawing the uncertainty ellipse. 5 sigma corresponds
 | 
			
		||||
        # to a 99.9999% confidence, i.e. assuming the estimation has been
 | 
			
		||||
        # computed properly, there is a 99.999% chance that the true position
 | 
			
		||||
        # of the point will lie within the uncertainty ellipse.
 | 
			
		||||
        k = 5.0
 | 
			
		||||
 | 
			
		||||
        angle = np.arctan2(v[1, 0], v[0, 0])
 | 
			
		||||
        e1 = patches.Ellipse(point,
 | 
			
		||||
                             np.sqrt(w[0] * k),
 | 
			
		||||
                             np.sqrt(w[1] * k),
 | 
			
		||||
                             np.rad2deg(angle),
 | 
			
		||||
                             fill=False)
 | 
			
		||||
        axes.add_patch(e1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def plot_point2(
 | 
			
		||||
    fignum: int,
 | 
			
		||||
    point: Point2,
 | 
			
		||||
    linespec: str,
 | 
			
		||||
    P: np.ndarray = None,
 | 
			
		||||
    axis_labels: Iterable[str] = ("X axis", "Y axis"),
 | 
			
		||||
) -> plt.Figure:
 | 
			
		||||
    """
 | 
			
		||||
    Plot a 2D point on given figure with given `linespec`.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
        fignum: Integer representing the figure number to use for plotting.
 | 
			
		||||
        point: The point to be plotted.
 | 
			
		||||
        linespec: String representing formatting options for Matplotlib.
 | 
			
		||||
        P: Marginal covariance matrix to plot the uncertainty of the estimation.
 | 
			
		||||
        axis_labels: List of axis labels to set.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        fig: The matplotlib figure.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    fig = plt.figure(fignum)
 | 
			
		||||
    axes = fig.gca()
 | 
			
		||||
    plot_point2_on_axes(axes, point, linespec, P)
 | 
			
		||||
 | 
			
		||||
    axes.set_xlabel(axis_labels[0])
 | 
			
		||||
    axes.set_ylabel(axis_labels[1])
 | 
			
		||||
 | 
			
		||||
    return fig
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def plot_pose2_on_axes(axes,
 | 
			
		||||
                       pose: Pose2,
 | 
			
		||||
                       axis_length: float = 0.1,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue