Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add check for the correct layout of camera intrinsics matrices. #360

Merged
merged 4 commits into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions examples/python/gRPC/images/gRPC_fb_addCameraIntrinsics.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,15 @@
header = createHeader(builder, ts, "map", projectuuid, ciuuid)
roi = createRegionOfInterest(builder, 3, 5, 6, 7, True)

matrix = [4, 5, 6]
ci = createCameraIntrinsics(builder, header, 3, 4, "plump_bob", matrix, matrix, matrix, matrix, 4, 5, roi, 5)

distortion_matrix = [4, 5, 6, 7, 8, 9, 10, 11, 12]
rect_matrix = [4, 5, 6, 7, 8, 9, 10, 11, 12]
intrins_matrix = [4, 5, 6, 7, 8, 9, 10, 11, 12]
proj_matrix = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

ci = createCameraIntrinsics(
builder, header, 3, 4, "plumb_bob", distortion_matrix, intrins_matrix, rect_matrix, proj_matrix, 4, 5, roi, 5
)
builder.Finish(ci)

buf = builder.Output()
Expand Down
8 changes: 4 additions & 4 deletions examples/python/gRPC/images/gRPC_pb_addCameraIntrinsics.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@
camin.height = 5
camin.width = 4

camin.distortion_model = "plump_bob"
camin.distortion_model = "plumb_bob"

camin.distortion.extend([3, 4, 5])

camin.intrinsic_matrix.extend([3, 4, 5])
camin.rectification_matrix.extend([3, 4, 5])
camin.projection_matrix.extend([3, 4, 5])
camin.intrinsic_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11])
camin.rectification_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11])
camin.projection_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

camin.binning_x = 6
camin.binning_y = 7
Expand Down
8 changes: 4 additions & 4 deletions examples/python/gRPC/images/gRPC_pb_sendLabeledImage.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,13 @@
camin.height = 5
camin.width = 4

camin.distortion_model = "plump_bob"
camin.distortion_model = "plumb_bob"

camin.distortion.extend([3, 4, 5])

camin.intrinsic_matrix.extend([3, 4, 5])
camin.rectification_matrix.extend([3, 4, 5])
camin.projection_matrix.extend([3, 4, 5])
camin.intrinsic_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11])
camin.rectification_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11])
camin.projection_matrix.extend([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

camin.binning_x = 6
camin.binning_y = 7
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ class Hdf5CoreImage : public virtual Hdf5CoreGeneral, public Hdf5CoreDatatypeInt
* @param camintrinsics_uuid The UUID of the camera intrinsic parameters to use.
* @param bb Axis aligned bounding box to store the result in.
*/
void computeFrusturmBB(const std::string& camintrinsics_uuid, seerep_core_msgs::AABB& bb);
void computeFrustumBB(const std::string& camintrinsics_uuid, seerep_core_msgs::AABB& bb);

public:
// image attribute keys
Expand Down
4 changes: 2 additions & 2 deletions seerep_hdf5/seerep_hdf5_core/src/hdf5_core_image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ std::optional<seerep_core_msgs::DatasetIndexable> Hdf5CoreImage::readDataset(con
}
// lock released

computeFrusturmBB(camintrinsics_uuid, data.boundingbox);
computeFrustumBB(camintrinsics_uuid, data.boundingbox);

return data;
}
Expand Down Expand Up @@ -127,7 +127,7 @@ const std::string Hdf5CoreImage::getHdf5DataSetPath(const std::string& id) const
return getHdf5GroupPath(id) + "/" + RAWDATA;
}

void Hdf5CoreImage::computeFrusturmBB(const std::string& camintrinsics_uuid, seerep_core_msgs::AABB& bb)
void Hdf5CoreImage::computeFrustumBB(const std::string& camintrinsics_uuid, seerep_core_msgs::AABB& bb)
{
seerep_core_msgs::camera_intrinsics ci =
m_ioCI->readCameraIntrinsics(boost::lexical_cast<boost::uuids::uuid>(camintrinsics_uuid));
Expand Down
2 changes: 1 addition & 1 deletion seerep_srv/seerep_core_fb/src/core_fb_image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ boost::uuids::uuid CoreFbImage::addData(const seerep::fb::Image& img)
auto hdf5io = CoreFbGeneral::getHdf5(dataForIndices.header.uuidProject, m_seerepCore, m_hdf5IoMap);
hdf5io->writeImage(boost::lexical_cast<std::string>(dataForIndices.header.uuidData), img);

hdf5io->computeFrusturmBB(img.uuid_cameraintrinsics()->str(), dataForIndices.boundingbox);
hdf5io->computeFrustumBB(img.uuid_cameraintrinsics()->str(), dataForIndices.boundingbox);

m_seerepCore->addDataset(dataForIndices);

Expand Down
2 changes: 1 addition & 1 deletion seerep_srv/seerep_core_pb/src/core_pb_image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ boost::uuids::uuid CorePbImage::addData(const seerep::pb::Image& img)
auto hdf5io = getHdf5(dataForIndices.header.uuidProject);
hdf5io->writeImage(boost::lexical_cast<std::string>(dataForIndices.header.uuidData), img);

hdf5io->computeFrusturmBB(img.uuid_camera_intrinsics(), dataForIndices.boundingbox);
hdf5io->computeFrustumBB(img.uuid_camera_intrinsics(), dataForIndices.boundingbox);

m_seerepCore->addDataset(dataForIndices);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <seerep_core_fb/core_fb_camera_intrinsics.h>
#include <seerep_core_fb/core_fb_conversion.h>

#include "service_constants.h"
#include "util.hpp"

// logging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <seerep_core/core.h>
#include <seerep_core_pb/core_pb_camera_intrinsics.h>

#include "service_constants.h"
#include "util.hpp"

// logging
Expand Down
13 changes: 13 additions & 0 deletions seerep_srv/seerep_server/include/seerep_server/service_constants.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef SEEREP_SERVER_SERVICE_CONSTANTS_H_
#define SEEREP_SERVER_SERVICE_CONSTANTS_H_

#include <sensor_msgs/distortion_models.h>

namespace seerep_server_constants
{
/** @brief constants for allowed distortion models*/
inline const std::string kCameraDistortionModels[] = { sensor_msgs::distortion_models::PLUMB_BOB,
sensor_msgs::distortion_models::RATIONAL_POLYNOMIAL,
sensor_msgs::distortion_models::EQUIDISTANT };
} // namespace seerep_server_constants
#endif // SEEREP_SERVER_SERVICE_CONSTANTS_H_
42 changes: 42 additions & 0 deletions seerep_srv/seerep_server/src/fb_cameraintrinsics_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,48 @@ grpc::Status FbCameraIntrinsicsService::TransferCameraIntrinsics(

BOOST_LOG_SEV(m_logger, boost::log::trivial::severity_level::info) << "received camera instrinsics for storage ";

// check if the distortion model is found in kCameraDistortionModels
bool distortion_model_err =
requestRoot->distortion_model()->size() > 0 &&
std::find(std::begin(seerep_server_constants::kCameraDistortionModels),
std::end(seerep_server_constants::kCameraDistortionModels),
requestRoot->distortion_model()->c_str()) == std::end(seerep_server_constants::kCameraDistortionModels);

bool intrinsics_mat_err = !requestRoot->intrinsic_matrix() || requestRoot->intrinsic_matrix()->size() != 9 ||
(*requestRoot->intrinsic_matrix())[0] == 0 || (*requestRoot->intrinsic_matrix())[4] == 0;

bool rectification_mat_err =
requestRoot->rectification_matrix() &&
(requestRoot->rectification_matrix()->size() > 0 && requestRoot->rectification_matrix()->size() != 9);

bool projection_mat_err = requestRoot->projection_matrix() && (requestRoot->projection_matrix()->size() > 0 &&
requestRoot->projection_matrix()->size() != 12);

if (distortion_model_err || intrinsics_mat_err || rectification_mat_err || projection_mat_err)
{
response_message = "";
if (distortion_model_err)
{
response_message += "The distortion model is set but invalid. ";
}
if (intrinsics_mat_err)
{
response_message += "Instrinsics matrix is not set, dimensions are incorrect or the focal length values are "
"invalid. ";
}
if (rectification_mat_err)
{
response_message += "Rectification matrix dimensions are incorrect. ";
}
if (projection_mat_err)
{
response_message += "Projection matrix dimensions are incorrect.";
}
BOOST_LOG_SEV(m_logger, boost::log::trivial::severity_level::error) << response_message;
seerep_server_util::createResponseFb(response_message, seerep::fb::TRANSMISSION_STATE_FAILURE, response);
return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, response_message);
}
jarkenau marked this conversation as resolved.
Show resolved Hide resolved

if (requestRoot->header()->uuid_msgs()->str().empty())
{
response_message = "No UUID for Camera Intrinsics set";
Expand Down
44 changes: 44 additions & 0 deletions seerep_srv/seerep_server/src/pb_camera_intrinsics_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,50 @@ grpc::Status PbCameraIntrinsicsService::TransferCameraIntrinsics(grpc::ServerCon
(void)context; // ignore that variable without causing warnings
BOOST_LOG_SEV(m_logger, boost::log::trivial::severity_level::debug) << "received camera intrinsics... ";

std::string response_message;

/* TODO: Add common implementation between Protocol Buffers and Flatbuffers for checking the correct matrix dimensions */
// check if the distortion model is found in kCameraDistortionModels
bool distortion_model_err = camintrinsics->distortion_model().size() > 0 &&
std::find(std::begin(seerep_server_constants::kCameraDistortionModels),
std::end(seerep_server_constants::kCameraDistortionModels),
camintrinsics->distortion_model().c_str()) ==
std::end(seerep_server_constants::kCameraDistortionModels);

bool intrinsics_mat_err = camintrinsics->intrinsic_matrix_size() != 9 || camintrinsics->intrinsic_matrix()[0] == 0 ||
camintrinsics->intrinsic_matrix()[4] == 0;

bool rectification_mat_err =
camintrinsics->rectification_matrix_size() > 0 && camintrinsics->rectification_matrix_size() != 9;

bool projection_mat_err =
camintrinsics->projection_matrix_size() > 0 && camintrinsics->projection_matrix_size() != 12;

if (distortion_model_err || intrinsics_mat_err || rectification_mat_err || projection_mat_err)
{
response_message = "";
if (distortion_model_err)
{
response_message += "The distortion model is set but invalid. ";
}
if (intrinsics_mat_err)
{
response_message += "Instrinsics matrix dimensions are incorrect or the focal length values are "
"invalid. ";
}
if (rectification_mat_err)
{
response_message += "Rectification matrix dimensions are incorrect. ";
}
if (projection_mat_err)
{
response_message += "Projection matrix dimensions are incorrect.";
}
BOOST_LOG_SEV(m_logger, boost::log::trivial::severity_level::error) << response_message;
seerep_server_util::createResponsePb(response_message, seerep::pb::ServerResponse::FAILURE, response);
return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, response_message);
}

if (!camintrinsics->header().uuid_project().empty())
{
std::string grpc_msg = "Added Camera Intrinsics.";
Expand Down