NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
camera_model.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 #ifndef CAMERA_CAMERA_MODEL_H_
19 #define CAMERA_CAMERA_MODEL_H_
20 
21 #include <camera/camera_params.h>
22 
23 #include <Eigen/Geometry>
24 #include <string>
25 
26 namespace camera {
27 
31 class CameraModel {
32  public:
33  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
34  CameraModel(const Eigen::Vector3d & position, const Eigen::Matrix3d & rotation,
35  double fov_x, int x_res, int y_res);
36  CameraModel(const Eigen::Vector3d & position, const Eigen::Matrix3d & rotation,
37  const camera::CameraParameters & params);
38  CameraModel(const Eigen::Affine3d & transform,
39  const camera::CameraParameters & params);
40  explicit CameraModel(const camera::CameraParameters & params);
41  ~CameraModel();
42 
43  // Takes world coordinates and output image coordinates that are
44  // undistorted and relative to the center of the undistorted image.
45  Eigen::Vector2d ImageCoordinates(const Eigen::Vector3d & p) const;
46  Eigen::Vector2d ImageCoordinates(double x, double y, double z) const;
47 
48  // outputs 3D coordinates in camera frame
50  Eigen::Vector3d CameraCoordinates(double x, double y, double z) const;
51 
52  // outputs 3D ray unit vector from image coordinates
53  Eigen::Vector3d Ray(int x, int y) const;
54 
55  // TODO(oalexan1): This looks buggy. Because ImageCoordinates()
56  // returns an undistorted pixel, it must compare to GetUndistortedHalfSize().
57  bool IsInFov(const Eigen::Vector3d & p) const;
58  bool IsInFov(double x, double y, double z) const;
59 
60  double GetFovX(void) const;
61  double GetFovY(void) const;
62 
65  Eigen::Matrix3d GetRotation() const;
66  const Eigen::Affine3d& GetTransform() const;
67  void SetTransform(const Eigen::Affine3d & cam_t_global);
68 
69  private:
70  void InitTransform(const Eigen::Vector3d & position, const Eigen::Matrix3d & rotation);
71  // The transform cam_t_global_ goes from the world to the camera.
72  Eigen::Affine3d cam_t_global_;
74 };
75 
76 // Rodrigues is a collapsed Angle Axis Representation
77 void RotationToRodrigues(Eigen::Matrix3d const& rotation, Eigen::Vector3d * vector);
78 void RodriguesToRotation(Eigen::Vector3d const& vector, Eigen::Matrix3d * rotation);
79 
80 } // namespace camera
81 
82 #endif // CAMERA_CAMERA_MODEL_H_
camera::CameraModel::~CameraModel
~CameraModel()
Definition: camera_model.cc:53
camera
Definition: camera_model.h:26
camera::CameraModel::GetPosition
Eigen::Vector3d GetPosition() const
Definition: camera_model.cc:55
camera::RodriguesToRotation
void RodriguesToRotation(Eigen::Vector3d const &vector, Eigen::Matrix3d *rotation)
Definition: camera_model.cc:138
camera::CameraParameters
Definition: camera_params.h:58
camera::CameraModel::GetFovY
double GetFovY(void) const
Definition: camera_model.cc:76
camera::RotationToRodrigues
void RotationToRodrigues(Eigen::Matrix3d const &rotation, Eigen::Vector3d *vector)
Definition: camera_model.cc:130
camera::CameraModel::GetRotation
Eigen::Matrix3d GetRotation() const
Definition: camera_model.cc:59
camera::CameraModel
Definition: camera_model.h:31
camera::CameraModel::SetTransform
void SetTransform(const Eigen::Affine3d &cam_t_global)
Definition: camera_model.cc:67
point_cloud_common::Vector3d
Eigen::Vector3d Vector3d(const PointType &point)
Definition: utilities.h:328
camera::CameraModel::GetTransform
const Eigen::Affine3d & GetTransform() const
Definition: camera_model.cc:63
camera::CameraModel::GetParameters
const camera::CameraParameters & GetParameters() const
Definition: camera_model.cc:81
camera::CameraModel::CameraModel
EIGEN_MAKE_ALIGNED_OPERATOR_NEW CameraModel(const Eigen::Vector3d &position, const Eigen::Matrix3d &rotation, double fov_x, int x_res, int y_res)
Definition: camera_model.cc:26
camera::CameraModel::CameraCoordinates
Eigen::Vector3d CameraCoordinates(const Eigen::Vector3d &p) const
Definition: camera_model.cc:105
camera::CameraModel::ImageCoordinates
Eigen::Vector2d ImageCoordinates(const Eigen::Vector3d &p) const
Definition: camera_model.cc:89
camera::CameraModel::Ray
Eigen::Vector3d Ray(int x, int y) const
Definition: camera_model.cc:94
optimization_common::Affine3d
Eigen::Affine3d Affine3d(const Eigen::Matrix< double, 7, 1 > &affine_vector)
Definition: utilities.cc:43
camera::CameraModel::IsInFov
bool IsInFov(const Eigen::Vector3d &p) const
Definition: camera_model.cc:109
camera::CameraModel::GetFovX
double GetFovX(void) const
Definition: camera_model.cc:71
camera_params.h