37 #include <opencv2/opencv.hpp>
45 DiagnosticNodelet::onInit();
48 pub_ = advertise<sensor_msgs::Image>(*pnh_,
"output", 1);
49 pub_camera_info_ = advertise<sensor_msgs::CameraInfo>(*pnh_,
"output/info", 1);
55 sub_ = pnh_->subscribe(
"input/camera_info", 1,
66 vital_checker_->poke();
69 model.fromCameraInfo(info_msg);
71 sensor_msgs::RegionOfInterest roi =
info_msg->roi;
81 cv::Mat mask_image = cv::Mat::zeros(height, width, CV_8UC1);
83 for (
int u = 0; u <
width; u++) {
87 cv::Point3d
p =
model.projectPixelTo3dRay(uv);
91 mask_image.data[mask_image.step *
v + mask_image.elemSize() * u] = 255;
95 sensor_msgs::CameraInfo camera_info_msg;
97 camera_info_msg.width =
width;
98 camera_info_msg.height =
height;
99 camera_info_msg.distortion_model =
info_msg->distortion_model;
100 camera_info_msg.roi.x_offset = 0;
101 camera_info_msg.roi.y_offset = 0;
102 camera_info_msg.roi.width =
width;
103 camera_info_msg.roi.height =
height;
104 camera_info_msg.roi.do_rectify =
info_msg->roi.do_rectify;
105 cv::Matx33d K =
model.intrinsicMatrix();
106 for (
size_t i = 0;
i < 3; ++
i)
for (
size_t j = 0; j < 3; ++j) camera_info_msg.K[i * 3 + j] = K(i, j);
107 cv::Matx33d R =
model.rotationMatrix();
108 for (
size_t i = 0;
i < 3; ++
i)
for (
size_t j = 0; j < 3; ++j) camera_info_msg.R[i * 3 + j] = R(i, j);
109 cv::Matx34d P =
model.projectionMatrix();
110 for (
size_t i = 0;
i < 3; ++
i)
for (
size_t j = 0; j < 4; ++j) camera_info_msg.P[i * 4 + j] = P(i, j);
111 cv::Mat_<double>
D =
model.distortionCoeffs();
112 camera_info_msg.D.resize(
D.rows *
D.cols);
113 for (
size_t i = 0;
i <
D.rows; ++
i)
for (
size_t j = 0; j <
D.cols; ++j) camera_info_msg.D[i *
D.cols + j] =
D(i, j);
124 double default_padding, default_scale;
125 pnh.
param(
"self_see_default_padding", default_padding, 0.01);
126 pnh.
param(
"self_see_default_scale", default_scale, 1.0);
127 std::vector<robot_self_filter::LinkInfo> links;
129 if(!pnh.
hasParam(
"self_see_links")) {
130 ROS_WARN(
"No links specified for self filtering.");
133 pnh.
getParam(
"self_see_links", ssl_vals);
135 ROS_WARN(
"Self see links need to be an array");
137 if(ssl_vals.
size() == 0) {
138 ROS_WARN(
"No values in self see links array");
140 for(
int i = 0;
i < ssl_vals.
size();
i++) {
143 ROS_WARN(
"Self see links entry %d is not a structure. Stopping processing of self see links",i);
146 if(!ssl_vals[i].hasMember(
"name")) {
147 ROS_WARN(
"Self see links entry %d has no name. Stopping processing of self see links",i);
150 li.
name = std::string(ssl_vals[i][
"name"]);
151 if(!ssl_vals[i].hasMember(
"padding")) {
152 ROS_DEBUG(
"Self see links entry %d has no padding. Assuming default padding of %g",i,default_padding);
155 li.
padding = ssl_vals[
i][
"padding"];
157 if(!ssl_vals[i].hasMember(
"scale")) {
158 ROS_DEBUG(
"Self see links entry %d has no scale. Assuming default scale of %g",i,default_scale);
159 li.
scale = default_scale;
161 li.
scale = ssl_vals[
i][
"scale"];