7 cameraInfo = ensenso::std::make_shared<sensor_msgs::msg::CameraInfo>();
43 NxLibItem imageNode =
cameraNode[itmImages][itmRaw];
44 if (imageNode.isArray())
46 imageNode = imageNode[0];
70 NxLibItem calibrationNode =
cameraNode[itmCalibration];
81 for (
int row = 0; row < 3; row++)
83 for (
int column = 0; column < 3; column++)
85 GET_K_MATRIX(info)[3 * row + column] = calibrationNode[itmCamera][column][row].asDouble();
99 ensenso::action::RequestDataMonoResult result;
100 ensenso::action::RequestDataMonoFeedback feedback;
102 bool publishResults = goal->publish_results;
103 if (!goal->publish_results && !goal->include_results_in_response)
105 publishResults =
true;
108 bool requestRectified = goal->request_rectified_images;
109 if (!goal->request_rectified_images && !goal->request_raw_images)
111 requestRectified =
true;
118 feedback.images_acquired =
true;
121 if (goal->request_raw_images)
124 cameraInfo->header.stamp = rawImages[0]->header.stamp;
126 if (goal->include_results_in_response)
128 for (
auto const& image : rawImages)
130 result.raw_images.push_back(*image);
142 if (requestRectified)
148 auto rectifiedImages =
152 if (goal->include_results_in_response)
154 for (
auto const& image : rectifiedImages)
156 result.rectified_images.push_back(*image);
175 ensenso::action::SetParameterResult result;
179 result.parameter_file_applied =
false;
180 if (!goal->parameter_file.empty())
182 result.parameter_file_applied =
loadSettings(goal->parameter_file);
183 if (!result.parameter_file_applied)
185 server->setAborted(std::move(result));
190 for (
auto const& parameter : goal->parameters)
196 NxLibCommand synchronize(cmdSynchronize,
params.
serial);
198 synchronize.execute();
206 for (
auto const& parameter : goal->parameters)
220 ensenso::action::LocatePatternMonoResult result;
221 ensenso::action::LocatePatternMonoFeedback feedback;
225 int numberOfShots = goal->number_of_shots;
226 if (numberOfShots < 1)
231 std::vector<MonoCalibrationPattern> patterns;
233 for (
int i = 0; i < numberOfShots; i++)
239 imageTimestamp = timestamp;
243 if (i == (numberOfShots - 1))
246 feedback.images_acquired =
true;
250 bool clearBuffer = (i == 0);
252 if (patterns.empty())
254 result.found_pattern =
false;
259 if (patterns.size() > 1)
267 result.found_pattern =
true;
268 result.mono_patterns.resize(patterns.size());
269 for (
size_t i = 0; i < patterns.size(); i++)
271 patterns[i].writeToMessage(result.mono_patterns[i]);
277 if (!goal->target_frame.empty())
279 patternFrame = goal->target_frame;
282 result.frame = patternFrame;
284 if (patterns.size() > 1)
289 result.mono_pattern_poses.resize(patternPoses.size());
290 for (
size_t i = 0; i < patternPoses.size(); i++)
292 result.mono_pattern_poses[i] = patternPoses[i];
300 result.mono_pattern_poses.resize(1);
301 result.mono_pattern_poses[0] = patternPose;
304 if (!goal->tf_frame.empty())
306 if (patterns.size() == 1)
308 geometry_msgs::msg::TransformStamped transform =
transformFromPose(result.mono_pattern_poses[0], goal->tf_frame);
313 ENSENSO_WARN(
nh,
"Cannot publish the pattern pose in tf, because there are multiple patterns!");
326 NxLibCommand(cmdDiscardPatterns,
params.
serial).execute();
330 collectPattern.parameters()[itmCameras] =
params.
serial;
331 collectPattern.parameters()[itmDecodeData] =
true;
334 collectPattern.execute();
336 catch (NxLibException& e)
338 if (e.getErrorCode() == NxLibExecutionFailed)
340 if (collectPattern.result()[itmErrorSymbol] == errPatternNotFound ||
341 collectPattern.result()[itmErrorSymbol] == errPatternNotDecodable)
349 std::vector<MonoCalibrationPattern> result;
351 for (
int i = 0; i < collectPattern.result()[itmPatterns][0][
params.
serial].count(); i++)
353 result.emplace_back(collectPattern.result()[itmPatterns][0][
params.
serial][i][itmPattern]);
357 NxLibItem pattern = collectPattern.result()[itmPatterns][0][
params.
serial];
359 for (
size_t i = 0; i < result.size(); i++)
361 for (
int j = 0; j < pattern[i][itmPoints].count(); j++)
363 NxLibItem pointNode = pattern[i][itmPoints][j];
365 ensenso::msg::ImagePoint point;
366 point.x = pointNode[0].asDouble();
367 point.y = pointNode[1].asDouble();
368 result[i].points.push_back(point);
376 std::string
const& targetFrame,
377 bool latestPatternOnly)
const 382 estimatePatternPose.parameters()[itmType] = itmMonocular;
383 if (latestPatternOnly)
385 estimatePatternPose.parameters()[itmAverage] =
false;
387 int patternCount = NxLibItem()[itmParameters][itmPatternCount].asInt();
388 estimatePatternPose.parameters()[itmFilter][itmOr][0][itmAnd][0][itmType] = valIndex;
389 estimatePatternPose.parameters()[itmFilter][itmOr][0][itmAnd][0][itmValue] = patternCount - 1;
393 estimatePatternPose.parameters()[itmAverage] =
true;
395 estimatePatternPose.execute();
397 auto patterns = estimatePatternPose.result()[itmPatterns];
404 std::string
const& targetFrame)
const 409 estimatePatternPose.parameters()[itmAverage] =
false;
410 estimatePatternPose.parameters()[itmType] = itmMonocular;
411 estimatePatternPose.parameters()[itmFilter][itmCameras] =
params.
serial;
413 estimatePatternPose.execute();
415 auto patterns = estimatePatternPose.result()[itmPatterns];
417 std::vector<geometry_msgs::msg::PoseStamped> result;
418 result.reserve(patterns.count());
420 for (
int i = 0; i < patterns.count(); i++)
422 result.push_back(
stampedPoseFromNxLib(patterns[i][itmPatternPose], targetFrame, imageTimestamp));
#define GET_K_MATRIX(info)
void ENSENSO_DEBUG(T... args)
virtual void initStatusTimer()
void onLocatePattern(ensenso::action::LocatePatternMonoGoalConstPtr const &goal)
StampedTransformMsg transformFromPose(StampedPoseMsg const &pose, std::string const &childFrame)
#define GET_P_MATRIX(info)
std::unique_ptr< LocatePatternMonoServer > locatePatternServer
virtual ensenso::msg::ParameterPtr readParameter(std::string const &key) const
void fillCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const &info, bool rectified=false)
StampedPoseMsg stampedPoseFromNxLib(NxLibItem const &node, std::string const &parentFrame, ensenso::ros::Time timestamp)
image_transport::CameraPublisher rectifiedImagePublisher
virtual void writeParameter(ensenso::msg::Parameter const ¶meter)
ensenso::ros::NodeHandle nh
inline ::image_transport::CameraPublisher create_camera_publisher(ensenso::ros::NodeHandle const &nh, ::std::string const &topic_name)
std::unique_ptr< SetParameterServer > setParameterServer
MonoCamera(ensenso::ros::NodeHandle &nh, CameraParameters params)
void updateGlobalLink(ensenso::ros::Time time, std::string targetFrame="", bool useCachedTransformation=false) const
std::vector< geometry_msgs::msg::PoseStamped > estimatePatternPoses(ensenso::ros::Time imageTimestamp, std::string const &targetFrame="") const override
virtual void initTfPublishTimer()
sensor_msgs::msg::CameraInfoPtr cameraInfo
std::vector< ImagePtr > imagesFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
#define GET_D_MATRIX(info)
ensenso::ros::Time capture() const override
inline ::ros::Time now(ensenso::ros::NodeHandle const &nh)
void onSetParameter(ensenso::action::SetParameterGoalConstPtr const &goal) override
#define MAKE_MONO_SERVER(CallbackClass, ActionName, TopicName)
sensor_msgs::msg::CameraInfoPtr rectifiedCameraInfo
::ros::NodeHandle NodeHandle
std::unique_ptr< RequestDataMonoServer > requestDataServer
void fillDistortionParamsFromNxLib(NxLibItem const &distortionItem, sensor_msgs::msg::CameraInfoPtr const &info)
void ENSENSO_WARN(T... args)
void onRequestData(ensenso::action::RequestDataMonoGoalConstPtr const &goal)
void startServers() const override
void loadParameterSet(std::string name)
ensenso::ros::Time timestampFromNxLibNode(NxLibItem const &node)
void move(std::vector< T > &a, std::vector< T > &b)
void publish(const sensor_msgs::Image &image, const sensor_msgs::CameraInfo &info) const
#define GET_R_MATRIX(info)
image_transport::CameraPublisher rawImagePublisher
geometry_msgs::msg::PoseStamped estimatePatternPose(ensenso::ros::Time imageTimestamp, std::string const &targetFrame="", bool latestPatternOnly=false) const override
std::vector< MonoCalibrationPattern > collectPattern(bool clearBuffer=false) const
#define START_NXLIB_ACTION(ACTION_NAME, ACTION_SERVER)
#define PREEMPT_ACTION_IF_REQUESTED
#define ENSENSO_ASSERT(cond)
void updateCameraInfo() override
virtual void startServers() const
void saveParameterSet(std::string name)
#define FINISH_NXLIB_ACTION(ACTION_NAME)
bool loadSettings(std::string const &jsonFile, bool saveAsDefaultParameters=false)
std::unique_ptr< tf2_ros::TransformBroadcaster > transformBroadcaster
void fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const &info) const