@@ -9,11 +9,12 @@ RobotReadServiceImpl::RobotReadServiceImpl(std::shared_ptr<rclcpp::Node> node)
99 DeclareROSParameter (" topic_pose" , std::string (" /tcp_pose" ), " [str] Init; Sub: topic with the TCP pose data." );
1010 DeclareROSParameter (" topic_wrench" , std::string (" /wrench" ), " [str] Init; Sub: topic with the F/T data." );
1111 DeclareROSParameter (" topic_joints" , std::string (" /joint_states" ), " [str] Init; Sub: topic with the joint states." );
12- DeclareROSParameter (" topic_camera_scene" , std::string (" /cam_scene/rgb/image_rect" ), " [str] Camera scene image topic" );
13- DeclareROSParameter (" topic_camera_right" , std::string (" /cam_tool_right/image_raw" ), " [str] Camera scene image topic" );
14- DeclareROSParameter (" topic_camera_left" , std::string (" /cam_tool_left/image_raw" ), " [str] Camera scene image topic" );
15- DeclareROSParameter (" target_image_width" , 64 , " [int] Init; TODO" );
16- DeclareROSParameter (" target_image_height" , 64 , " [int] Init; TODO" );
12+ DeclareROSParameter (" topic_camera_scene" , std::string (" /cam_scene/rgb/image_rect" ), " [str] Init; Sub: Camera scene image topic." );
13+ DeclareROSParameter (" topic_camera_right" , std::string (" /cam_tool_right/image_raw" ), " [str] Init; Sub: Camera scene image topic." );
14+ DeclareROSParameter (" topic_camera_left" , std::string (" /cam_tool_left/image_raw" ), " [str] Init; Sub:Camera scene image topic." );
15+ DeclareROSParameter (" target_image_width" , 64 , " [int] Init; Target output image width in pixels." );
16+ DeclareROSParameter (" target_image_height" , 64 , " [int] Init; Target output image height in pixels." );
17+ DeclareROSParameter (" enable_image_resize" , true , " [bool] Init; Enable resizing images before sending over gRPC." );
1718
1819 pose_sub_ = node_->create_subscription <geometry_msgs::msg::PoseStamped>(
1920 node_->get_parameter (" topic_pose" ).as_string (), 10 ,
@@ -41,6 +42,7 @@ RobotReadServiceImpl::RobotReadServiceImpl(std::shared_ptr<rclcpp::Node> node)
4142 std::placeholders::_1));
4243 target_img_width_ = node_->get_parameter (" target_image_width" ).as_int ();
4344 target_img_height_ = node_->get_parameter (" target_image_height" ).as_int ();
45+ enable_image_resize_ = node_->get_parameter (" enable_image_resize" ).as_bool ();
4446}
4547
4648template <class T >
@@ -141,7 +143,7 @@ grpc::Status RobotReadServiceImpl::GetCameraSceneImage(
141143 (void )request;
142144 {
143145 std::lock_guard<std::mutex> lock (image_scene_mutex_);
144- FillProtoImage (image_scene_data_, response);
146+ FillProtoImage (image_scene_data_, response, scene_resized_ );
145147 }
146148 return grpc::Status::OK;
147149}
@@ -154,7 +156,7 @@ grpc::Status RobotReadServiceImpl::GetCameraRightImage(
154156 (void )request;
155157 {
156158 std::lock_guard<std::mutex> lock (image_right_mutex_);
157- FillProtoImage (image_right_data_, response);
159+ FillProtoImage (image_right_data_, response, right_resized_ );
158160 }
159161 return grpc::Status::OK;
160162}
@@ -167,7 +169,7 @@ grpc::Status RobotReadServiceImpl::GetCameraLeftImage(
167169 (void )request;
168170 {
169171 std::lock_guard<std::mutex> lock (image_left_mutex_);
170- FillProtoImage (image_left_data_, response);
172+ FillProtoImage (image_left_data_, response, left_resized_ );
171173 }
172174 return grpc::Status::OK;
173175}
@@ -204,15 +206,15 @@ grpc::Status RobotReadServiceImpl::GetRobotVision(
204206 (void ) request;
205207 {
206208 std::lock_guard<std::mutex> lock (image_scene_mutex_);
207- FillProtoImage (image_scene_data_, response->mutable_image_scene ());
209+ FillProtoImage (image_scene_data_, response->mutable_image_scene (), scene_resized_ );
208210 }
209211 {
210212 std::lock_guard<std::mutex> lock (image_right_mutex_);
211- FillProtoImage (image_right_data_, response->mutable_image_right ());
213+ FillProtoImage (image_right_data_, response->mutable_image_right (), right_resized_ );
212214 }
213215 {
214216 std::lock_guard<std::mutex> lock (image_left_mutex_);
215- FillProtoImage (image_left_data_, response->mutable_image_left ());
217+ FillProtoImage (image_left_data_, response->mutable_image_left (), left_resized_ );
216218 }
217219 return grpc::Status::OK;
218220}
@@ -237,15 +239,15 @@ grpc::Status RobotReadServiceImpl::GetAll(
237239 }
238240 {
239241 std::lock_guard<std::mutex> lock (image_scene_mutex_);
240- FillProtoImage (image_scene_data_, response->mutable_robot_vision ()->mutable_image_scene ());
242+ FillProtoImage (image_scene_data_, response->mutable_robot_vision ()->mutable_image_scene (), scene_resized_ );
241243 }
242244 {
243245 std::lock_guard<std::mutex> lock (image_right_mutex_);
244- FillProtoImage (image_right_data_, response->mutable_robot_vision ()->mutable_image_right ());
246+ FillProtoImage (image_right_data_, response->mutable_robot_vision ()->mutable_image_right (), right_resized_ );
245247 }
246248 {
247249 std::lock_guard<std::mutex> lock (image_left_mutex_);
248- FillProtoImage (image_left_data_, response->mutable_robot_vision ()->mutable_image_left ());
250+ FillProtoImage (image_left_data_, response->mutable_robot_vision ()->mutable_image_left (), left_resized_ );
249251 }
250252 return grpc::Status::OK;
251253}
@@ -293,33 +295,45 @@ void RobotReadServiceImpl::FillProtoJointState(
293295 for (const auto & v : ros.effort ) out->add_effort (v);
294296}
295297
296- void RobotReadServiceImpl::FillProtoImage (
297- const sensor_msgs::msg::Image& ros,
298- proto_aegis_grpc::v1::Image* out) {
299- cv_bridge::CvImagePtr cv_ptr;
298+ void RobotReadServiceImpl::FillProtoImage (
299+ const sensor_msgs::msg::Image& ros,
300+ proto_aegis_grpc::v1::Image* out,
301+ cv::Mat& buffer)
302+ {
303+ cv_bridge::CvImageConstPtr cv_ptr;
300304 try {
301- cv_ptr = cv_bridge::toCvCopy (ros, ros.encoding );
305+ cv_ptr = cv_bridge::toCvCopy (ros, ros.encoding );
302306 } catch (cv_bridge::Exception& e) {
303- RCLCPP_ERROR (node_->get_logger (), " cv_bridge exception : %s" , e.what ());
304- return ;
307+ RCLCPP_ERROR (node_->get_logger (), " cv_bridge: %s" , e.what ());
308+ return ;
305309 }
306- cv::Mat image_resized;
307- cv::resize (cv_ptr->image , image_resized, cv::Size (target_img_width_, target_img_height_));
308310
309- out->set_height (image_resized.rows );
310- out->set_width (image_resized.cols );
311- out->set_step (image_resized.step );
311+ const cv::Mat* src = &cv_ptr->image ;
312312
313- if (ros.encoding == " bgr8" ) {
314- out->set_encoding (proto_aegis_grpc::v1::Image::BGR8);
315- } else if (ros.encoding == " bayer_rggb8" ) {
316- out->set_encoding (proto_aegis_grpc::v1::Image::BAYER_RGGB8);
313+ if (enable_image_resize_) {
314+ cv::resize (
315+ cv_ptr->image ,
316+ buffer,
317+ cv::Size (target_img_width_, target_img_height_),
318+ 0 , 0 , cv::INTER_LINEAR);
319+ src = &buffer;
320+ }
321+
322+ if (ros.encoding == " bayer_rggb8" ) {
323+ cv::cvtColor (*src, buffer, cv::COLOR_BayerRG2BGR);
324+ src = &buffer;
325+ out->set_encoding (proto_aegis_grpc::v1::Image::BGR8);
326+ } else if (ros.encoding == " bgr8" ) {
327+ out->set_encoding (proto_aegis_grpc::v1::Image::BGR8);
317328 } else {
318- out->set_encoding (proto_aegis_grpc::v1::Image::UNKNOWN);
329+ out->set_encoding (proto_aegis_grpc::v1::Image::UNKNOWN);
319330 }
320331
321- out->set_data (image_resized.data , image_resized.total () * image_resized.elemSize ());
322- }
332+ out->set_height (src->rows );
333+ out->set_width (src->cols );
334+ out->set_step (src->step );
335+ out->set_data (src->data , src->total () * src->elemSize ());
336+ }
323337
324338
325339} // namespace aegis_grpc
0 commit comments