Skip to content

Commit 5f16f6a

Browse files
committed
Refactor image buffers and resize logic
1 parent 3c54d52 commit 5f16f6a

File tree

2 files changed

+55
-34
lines changed

2 files changed

+55
-34
lines changed

aegis_grpc/include/aegis_grpc/robot_read_service.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ class RobotReadServiceImpl final
105105

106106
void FillProtoImage(
107107
const sensor_msgs::msg::Image& ros,
108-
proto_aegis_grpc::v1::Image* out);
108+
proto_aegis_grpc::v1::Image* out,
109+
cv::Mat& resize_buffer);
109110

110111
std::shared_ptr<rclcpp::Node> node_;
111112
rclcpp::Subscription<geometry_msgs::msg::PoseStamped>::SharedPtr pose_sub_;
@@ -131,6 +132,12 @@ class RobotReadServiceImpl final
131132

132133
uint32_t target_img_width_;
133134
uint32_t target_img_height_;
135+
136+
cv::Mat scene_resized_;
137+
cv::Mat right_resized_;
138+
cv::Mat left_resized_;
139+
140+
bool enable_image_resize_;
134141
};
135142

136143
} // namespace aegis_grpc

aegis_grpc/src/robot_read_service.cpp

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4648
template <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

Comments
 (0)