def METHOD_NAME(self):
    """Test if FK is correct via comparison to a 3rd party library."""
    robot = gtd.CreateRobotFromFile(self.ROBOT_MODEL)
    th = {}
    joints = [
        "FR_hip_joint", "FR_upper_joint", "FR_lower_joint", "FL_hip_joint",
        "FL_upper_joint", "FL_lower_joint", "RR_hip_joint",
        "RR_upper_joint", "RR_lower_joint", "RL_hip_joint",
        "RL_upper_joint", "RL_lower_joint"
    ]
    joint_angles = np.array(
        [0., 0.1, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
    joint_angles_values = gtd.Values()
    for idx, joint in enumerate(joints):
        th[joint] = joint_angles[idx]
        gtd.InsertJointAngle(joint_angles_values,
                             robot.joint(joint).id(), joint_angles[idx])
    # Forward kinematics via GTDynamics.
    fk = robot.forwardKinematics(joint_angles_values, 0, "trunk")
    # Transform from lower link CoM to CoM of combined lower+toe link.
    # Lower + toe links are combined as they are connected by fixed joint.
    lowerTcom = Pose3(Rot3(), Point3(-0.00170571, 4.63725e-07, -0.0245871))
    # Dict of link-transforms where the transform is
    # from the link frame to the link CoM frame.
    lTcom_adjustments = {
        "FL_hip": Pose3(Rot3(), Point3(-0.003311, 0.000635, 3.1e-05)),
        "FL_lower": Pose3(Rot3(), Point3(0.006435, 0.0, -0.107388)),
        "FL_upper": Pose3(Rot3(), Point3(-0.003237, -0.022327, -0.027326)),
        "FL_toe": Pose3(Rot3(), Point3(0, 0, 0)),
        "FL_upper_shoulder": Pose3(Rot3(), Point3(0, 0, 0)),
        "FR_hip": Pose3(Rot3(), Point3(-0.003311, -0.000635, 3.1e-05)),
        "FR_lower": Pose3(Rot3(), Point3(0.006435, 0.0, -0.107388)),
        "FR_upper": Pose3(Rot3(), Point3(-0.003237, 0.022327, -0.027326)),
        "FR_toe": Pose3(Rot3(), Point3(0, 0, 0)),
        "FR_upper_shoulder": Pose3(Rot3(), Point3(0, 0, 0)),
        "RL_hip": Pose3(Rot3(), Point3(0.003311, 0.000635, 3.1e-05)),
        "RL_lower": Pose3(Rot3(), Point3(0.006435, 0.0, -0.107388)),
        "RL_upper": Pose3(Rot3(), Point3(-0.003237, -0.022327, -0.027326)),
        "RL_toe": Pose3(Rot3(), Point3(0, 0, 0)),
        "RL_upper_shoulder": Pose3(Rot3(), Point3(0, 0, 0)),
        "RR_hip": Pose3(Rot3(), Point3(0.003311, -0.000635, 3.1e-05)),
        "RR_lower": Pose3(Rot3(), Point3(0.006435, 0.0, -0.107388)),
        "RR_upper": Pose3(Rot3(), Point3(-0.003237, 0.022327, -0.027326)),
        "RR_toe": Pose3(Rot3(), Point3(0, 0, 0)),
        "RR_upper_shoulder": Pose3(Rot3(), Point3(0, 0, 0)),
        "trunk": Pose3(Rot3(), Point3(0.012731, 0.002186, 0.000515)),
        "imu_link": Pose3()
    }
    # True FK poses computed using kinpy
    bTl_poses = {
        "FL_hip":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, 0.044814, -0.000515)),
        "FL_lower":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, 0.129864, -0.200515)),
        "FL_upper":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, 0.129864, -0.000515)),
        "FL_toe":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, 0.129864, -0.400515)),
        "FL_upper_shoulder":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, 0.125814, -0.000515)),
        "FR_hip":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, -0.049186, -0.000515)),
        "FR_lower":
        Pose3(Rot3.Quaternion(0.99875026, 0.0, 0.04997917, 0.),
              (0.15030232, -0.134236, -0.19951583)),
        "FR_upper":
        Pose3(Rot3.Quaternion(0.99875026, 0.0, 0.04997917, 0.),
              (0.170269, -0.134236, -0.000515)),
        "FR_toe":
        Pose3(
            Rot3.Quaternion(0.9987502603949663, 0., 0.049979169270678324,
                            0.), (0.130336, -0.134236, -0.398517)),
        "FR_upper_shoulder":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (0.170269, -0.130186, -0.000515)),
        "RL_hip":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, 0.044814, -0.000515)),
        "RL_lower":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, 0.129864, -0.200515)),
        "RL_upper":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, 0.129864, -0.000515)),
        "RL_toe":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, 0.129864, -0.400515)),
        "RL_upper_shoulder":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, 0.125814, -0.000515)),
        "RR_hip":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, -0.049186, -0.000515)),
        "RR_lower":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, -0.134236, -0.200515)),
        "RR_upper":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, -0.134236, -0.000515)),
        "RR_toe":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, -0.134236, -0.400515)),
        "RR_upper_shoulder":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.195731, -0.130186, -0.000515)),
        "trunk":
        Pose3(Rot3.Quaternion(1., 0., 0., 0.),
              (-0.012731, -0.002186, -0.000515)),
        "imu_link":
        Pose3(Rot3(), Point3(-0.012731, -0.002186, -0.000515))
    }
    # Test all the links
    for link in robot.links():
        lTcom = lTcom_adjustments[link.name()]
        if "_lower" in link.name():
            lTcom = lTcom.compose(lowerTcom)
        bTl = bTl_poses[link.name()]
        expected_bTcom = bTl.compose(lTcom)
        actual_bTcom = gtd.Pose(fk, link.id(), 0)
        self.gtsamAssertEquals(actual_bTcom, expected_bTcom, tol=1e-3)