Fix nested flatbuffer building and transpose

This makes y2020 vision run now and predict field location

Change-Id: I4303fff6f2a80b058d2330642f1a4c4f68753c68
diff --git a/y2020/vision/camera_reader.cc b/y2020/vision/camera_reader.cc
index ed4082d..23986bf 100644
--- a/y2020/vision/camera_reader.cc
+++ b/y2020/vision/camera_reader.cc
@@ -177,12 +177,14 @@
 
   flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<sift::Feature>>>
       features_offset;
+  flatbuffers::Offset<
+      flatbuffers::Vector<flatbuffers::Offset<sift::ImageMatch>>>
+      image_matches_offset;
   if (send_details) {
     features_offset = PackFeatures(builder.fbb(), keypoints, descriptors);
+    image_matches_offset = PackImageMatches(builder.fbb(), matches);
   }
 
-  const auto image_matches_offset = PackImageMatches(builder.fbb(), matches);
-
   std::vector<flatbuffers::Offset<sift::CameraPose>> camera_poses;
 
   for (size_t i = 0; i < camera_target_list.size(); ++i) {
@@ -190,21 +192,23 @@
     CHECK(camera_target.isContinuous());
     const auto data_offset = builder.fbb()->CreateVector<float>(
         reinterpret_cast<float *>(camera_target.data), camera_target.total());
-    auto transform_offset =
+    const flatbuffers::Offset<sift::TransformationMatrix> transform_offset =
         sift::CreateTransformationMatrix(*builder.fbb(), data_offset);
+    const flatbuffers::Offset<sift::TransformationMatrix>
+        field_to_target_offset =
+            aos::CopyFlatBuffer(FieldToTarget(i), builder.fbb());
 
     sift::CameraPose::Builder pose_builder(*builder.fbb());
     pose_builder.add_camera_to_target(transform_offset);
-    pose_builder.add_field_to_target(
-        aos::CopyFlatBuffer(FieldToTarget(i), builder.fbb()));
+    pose_builder.add_field_to_target(field_to_target_offset);
     camera_poses.emplace_back(pose_builder.Finish());
   }
   const auto camera_poses_offset = builder.fbb()->CreateVector(camera_poses);
 
   sift::ImageMatchResult::Builder result_builder(*builder.fbb());
-  result_builder.add_image_matches(image_matches_offset);
   result_builder.add_camera_poses(camera_poses_offset);
   if (send_details) {
+    result_builder.add_image_matches(image_matches_offset);
     result_builder.add_features(features_offset);
   }
   result_builder.add_image_monotonic_timestamp_ns(
@@ -286,6 +290,7 @@
     cv::solvePnPRansac(per_image.training_points_3d, per_image.query_points,
                        CameraIntrinsics(), CameraDistCoeffs(),
                        R_camera_target_vec, T_camera_target);
+    T_camera_target = T_camera_target.t();
     // Convert Camera from angle-axis (3x1) to homogenous (3x3) representation
     cv::Rodrigues(R_camera_target_vec, R_camera_target);