fixed g2 no color point cloud

This commit is contained in:
Joe Dong
2024-05-07 11:08:38 +08:00
parent 1670b7a3ac
commit 88e5bff87c
3 changed files with 92 additions and 25 deletions
@@ -321,6 +321,8 @@ class OBCameraNode {
orbbec_camera_msgs::msg::IMUInfo createIMUInfo(const stream_index_pair& stream_index); orbbec_camera_msgs::msg::IMUInfo createIMUInfo(const stream_index_pair& stream_index);
static bool isGemini335PID(uint32_t pid);
private: private:
rclcpp::Node* node_ = nullptr; rclcpp::Node* node_ = nullptr;
std::shared_ptr<ob::Device> device_ = nullptr; std::shared_ptr<ob::Device> device_ = nullptr;
+88 -24
View File
@@ -828,6 +828,9 @@ void OBCameraNode::setupPublishers() {
"depth/points", rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(point_cloud_qos_profile), "depth/points", rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(point_cloud_qos_profile),
point_cloud_qos_profile)); point_cloud_qos_profile));
} }
auto device_info = device_->getDeviceInfo();
CHECK_NOTNULL(device_info.get());
auto pid = device_info->pid();
for (const auto &stream_index : IMAGE_STREAMS) { for (const auto &stream_index : IMAGE_STREAMS) {
if (!enable_stream_[stream_index]) { if (!enable_stream_[stream_index]) {
continue; continue;
@@ -844,10 +847,13 @@ void OBCameraNode::setupPublishers() {
camera_info_publishers_[stream_index] = node_->create_publisher<CameraInfo>( camera_info_publishers_[stream_index] = node_->create_publisher<CameraInfo>(
topic, rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile), topic, rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile),
camera_info_qos_profile)); camera_info_qos_profile));
metadata_publishers_[stream_index] = node_->create_publisher<orbbec_camera_msgs::msg::Metadata>( if (isGemini335PID(pid)) {
name + "/metadata", metadata_publishers_[stream_index] =
rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile), node_->create_publisher<orbbec_camera_msgs::msg::Metadata>(
camera_info_qos_profile)); name + "/metadata",
rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile),
camera_info_qos_profile));
}
} }
if (enable_sync_output_accel_gyro_) { if (enable_sync_output_accel_gyro_) {
@@ -1048,9 +1054,18 @@ void OBCameraNode::publishColoredPointCloud(const std::shared_ptr<ob::FrameSet>
depth_height, color_width, color_height); depth_height, color_width, color_height);
return; return;
} }
auto color_profile = stream_profile_[COLOR]->as<ob::VideoStreamProfile>(); auto device_info = device_->getDeviceInfo();
CHECK_NOTNULL(color_profile.get()); CHECK_NOTNULL(device_info);
auto intrinsics = color_profile->getIntrinsic(); auto pid = device_info->pid();
OBCameraIntrinsic intrinsics;
if (isGemini335PID(pid)) {
auto color_profile = stream_profile_[COLOR]->as<ob::VideoStreamProfile>();
CHECK_NOTNULL(color_profile.get());
intrinsics = color_profile->getIntrinsic();
} else {
auto camera_params = pipeline_->getCameraParam();
intrinsics = camera_params.rgbIntrinsic;
}
float fdx = intrinsics.fx * ((float)(color_width) / intrinsics.width); float fdx = intrinsics.fx * ((float)(color_width) / intrinsics.width);
float fdy = intrinsics.fy * ((float)(color_height) / intrinsics.height); float fdy = intrinsics.fy * ((float)(color_height) / intrinsics.height);
fdx = 1 / fdx; fdx = 1 / fdx;
@@ -1178,15 +1193,20 @@ void OBCameraNode::onNewFrameSetCallback(std::shared_ptr<ob::FrameSet> frame_set
// is_color_frame_decoded_ = decodeColorFrameToBuffer(frame_set->colorFrame(), rgb_buffer_); // is_color_frame_decoded_ = decodeColorFrameToBuffer(frame_set->colorFrame(), rgb_buffer_);
std::shared_ptr<ob::ColorFrame> colorFrame = frame_set->colorFrame(); std::shared_ptr<ob::ColorFrame> colorFrame = frame_set->colorFrame();
depth_frame_ = frame_set->getFrame(OB_FRAME_DEPTH); depth_frame_ = frame_set->getFrame(OB_FRAME_DEPTH);
if (depth_registration_ && align_filter_) { auto device_info = device_->getDeviceInfo();
auto new_frame = align_filter_->process(frame_set); CHECK_NOTNULL(device_info.get());
if (new_frame) { auto pid = device_info->pid();
auto new_frame_set = new_frame->as<ob::FrameSet>(); if (isGemini335PID(pid)) {
CHECK_NOTNULL(new_frame_set.get()); if (depth_registration_ && align_filter_) {
depth_frame_ = new_frame_set->getFrame(OB_FRAME_DEPTH); auto new_frame = align_filter_->process(frame_set);
if (new_frame) {
auto new_frame_set = new_frame->as<ob::FrameSet>();
CHECK_NOTNULL(new_frame_set.get());
depth_frame_ = new_frame_set->getFrame(OB_FRAME_DEPTH);
}
} }
depth_frame_ = processDepthFrameFilter(depth_frame_);
} }
depth_frame_ = processDepthFrameFilter(depth_frame_);
if (enable_stream_[COLOR] && colorFrame) { if (enable_stream_[COLOR] && colorFrame) {
std::lock_guard<std::mutex> colorLock(colorFrameMtx_); std::lock_guard<std::mutex> colorLock(colorFrameMtx_);
@@ -1291,7 +1311,11 @@ bool OBCameraNode::decodeColorFrameToBuffer(const std::shared_ptr<ob::Frame> &fr
if (!has_subscriber) { if (!has_subscriber) {
return false; return false;
} }
if (metadata_publishers_[COLOR]->get_subscription_count() > 0) { if (metadata_publishers_.count(COLOR) &&
metadata_publishers_[COLOR]->get_subscription_count() > 0) {
has_subscriber = true;
}
if (camera_info_publishers_[COLOR]->get_subscription_count() > 0) {
has_subscriber = true; has_subscriber = true;
} }
bool is_decoded = false; bool is_decoded = false;
@@ -1369,7 +1393,8 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
has_subscriber = has_subscriber =
has_subscriber || camera_info_publishers_[stream_index]->get_subscription_count() > 0; has_subscriber || camera_info_publishers_[stream_index]->get_subscription_count() > 0;
has_subscriber = has_subscriber =
has_subscriber || metadata_publishers_[stream_index]->get_subscription_count() > 0; has_subscriber || (metadata_publishers_.count(stream_index) &&
metadata_publishers_[stream_index]->get_subscription_count() > 0);
if (!has_subscriber) { if (!has_subscriber) {
return; return;
} }
@@ -1394,12 +1419,25 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
use_hardware_time_ = true; use_hardware_time_ = true;
auto timestamp = use_hardware_time_ ? fromUsToROSTime(video_frame->timeStampUs()) auto timestamp = use_hardware_time_ ? fromUsToROSTime(video_frame->timeStampUs())
: fromMsToROSTime(video_frame->systemTimeStamp()); : fromMsToROSTime(video_frame->systemTimeStamp());
auto stream_profile = frame->getStreamProfile(); auto device_info = device_->getDeviceInfo();
CHECK_NOTNULL(stream_profile); CHECK_NOTNULL(device_info);
auto video_stream_profile = stream_profile->as<ob::VideoStreamProfile>(); auto pid = device_info->pid();
CHECK_NOTNULL(video_stream_profile); OBCameraIntrinsic intrinsic;
const auto &intrinsic = video_stream_profile->getIntrinsic(); OBCameraDistortion distortion;
const auto &distortion = video_stream_profile->getDistortion(); if (isGemini335PID(pid)) {
auto stream_profile = frame->getStreamProfile();
CHECK_NOTNULL(stream_profile);
auto video_stream_profile = stream_profile->as<ob::VideoStreamProfile>();
CHECK_NOTNULL(video_stream_profile);
intrinsic = video_stream_profile->getIntrinsic();
distortion = video_stream_profile->getDistortion();
} else {
auto camera_params = pipeline_->getCameraParam();
intrinsic = stream_index.first == OB_STREAM_COLOR ? camera_params.rgbIntrinsic
: camera_params.depthIntrinsic;
distortion = stream_index.first == OB_STREAM_COLOR ? camera_params.rgbDistortion
: camera_params.depthDistortion;
}
std::string frame_id = std::string frame_id =
depth_registration_ ? depth_aligned_frame_id_[stream_index] : optical_frame_id_[stream_index]; depth_registration_ ? depth_aligned_frame_id_[stream_index] : optical_frame_id_[stream_index];
auto camera_info = convertToCameraInfo(intrinsic, distortion, width); auto camera_info = convertToCameraInfo(intrinsic, distortion, width);
@@ -1408,7 +1446,12 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
camera_info.width = width; camera_info.width = width;
camera_info.height = height; camera_info.height = height;
if (frame->type() == OB_FRAME_IR_RIGHT && enable_stream_[INFRA1]) { if (frame->type() == OB_FRAME_IR_RIGHT && enable_stream_[INFRA1]) {
auto stream_profile = frame->getStreamProfile();
CHECK_NOTNULL(stream_profile);
auto video_stream_profile = stream_profile->as<ob::VideoStreamProfile>();
CHECK_NOTNULL(video_stream_profile);
auto left_video_profile = stream_profile_[INFRA1]->as<ob::VideoStreamProfile>(); auto left_video_profile = stream_profile_[INFRA1]->as<ob::VideoStreamProfile>();
CHECK_NOTNULL(left_video_profile);
auto ex = video_stream_profile->getExtrinsicTo(left_video_profile); auto ex = video_stream_profile->getExtrinsicTo(left_video_profile);
float fx = camera_info.k.at(0); float fx = camera_info.k.at(0);
float fy = camera_info.k.at(4); float fy = camera_info.k.at(4);
@@ -1417,6 +1460,12 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
} }
CHECK(camera_info_publishers_.count(stream_index) > 0); CHECK(camera_info_publishers_.count(stream_index) > 0);
camera_info_publishers_[stream_index]->publish(camera_info); camera_info_publishers_[stream_index]->publish(camera_info);
if (isGemini335PID(pid)) {
publishMetadata(frame, stream_index, camera_info.header);
}
if (image_publishers_[stream_index].getNumSubscribers() == 0) {
return;
}
auto &image = images_[stream_index]; auto &image = images_[stream_index];
if (image.empty() || image.cols != width || image.rows != height) { if (image.empty() || image.cols != width || image.rows != height) {
image.create(height, width, image_format_[stream_index]); image.create(height, width, image_format_[stream_index]);
@@ -1440,8 +1489,6 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
image_msg->is_bigendian = false; image_msg->is_bigendian = false;
image_msg->step = width * unit_step_size_[stream_index]; image_msg->step = width * unit_step_size_[stream_index];
image_msg->header.frame_id = frame_id; image_msg->header.frame_id = frame_id;
publishMetadata(frame, stream_index, image_msg->header);
CHECK(image_publishers_.count(stream_index) > 0); CHECK(image_publishers_.count(stream_index) > 0);
image_publishers_[stream_index].publish(image_msg); image_publishers_[stream_index].publish(image_msg);
saveImageToFile(stream_index, image, image_msg); saveImageToFile(stream_index, image, image_msg);
@@ -1946,6 +1993,23 @@ bool OBCameraNode::setupFormatConvertType(OBFormat format) {
return true; return true;
} }
bool OBCameraNode::isGemini335PID(uint32_t pid) {
const uint16_t GEMINI_335_PID = 0x0800; // Gemini 335 / 335e
const uint16_t GEMINI_330_PID = 0x0801; // Gemini 330
const uint16_t GEMINI_336_PID = 0x0803; // Gemini 336 / 336e
const uint16_t GEMINI_335L_PID = 0x0804; // Gemini 335L
const uint16_t GEMINI_330L_PID = 0x0805; // Gemini 336L
const uint16_t GEMINI_336L_PID = 0x0807; // Gemini 335Lg
const uint16_t GEMINI_335LG_PID = 0x080B; // Gemini 336Lg
const uint16_t GEMINI_336LG_PID = 0x080D;
const uint16_t GEMINI_335LE_PID = 0x080E; // Gemini 335Le
const uint16_t GEMINI_336LE_PID = 0x0810; // Gemini 335Le
return pid == GEMINI_335_PID || pid == GEMINI_330_PID || pid == GEMINI_336_PID ||
pid == GEMINI_335L_PID || pid == GEMINI_330L_PID || pid == GEMINI_336L_PID ||
pid == GEMINI_335LG_PID || pid == GEMINI_336LG_PID || pid == GEMINI_335LE_PID ||
pid == GEMINI_336LE_PID;
}
orbbec_camera_msgs::msg::IMUInfo OBCameraNode::createIMUInfo( orbbec_camera_msgs::msg::IMUInfo OBCameraNode::createIMUInfo(
const stream_index_pair &stream_index) { const stream_index_pair &stream_index) {
orbbec_camera_msgs::msg::IMUInfo imu_info; orbbec_camera_msgs::msg::IMUInfo imu_info;
+2 -1
View File
@@ -305,8 +305,8 @@ void OBCameraNodeDriver::initializeDevice(const std::shared_ptr<ob::Device> &dev
ob_camera_node_.reset(); ob_camera_node_.reset();
} }
ob_camera_node_ = std::make_unique<OBCameraNode>(this, device_, parameters_); ob_camera_node_ = std::make_unique<OBCameraNode>(this, device_, parameters_);
ob_camera_node_->startStreams();
ob_camera_node_->startIMU(); ob_camera_node_->startIMU();
ob_camera_node_->startStreams();
device_connected_ = true; device_connected_ = true;
device_info_ = device_->getDeviceInfo(); device_info_ = device_->getDeviceInfo();
serial_number_ = device_info_->serialNumber(); serial_number_ = device_info_->serialNumber();
@@ -320,6 +320,7 @@ void OBCameraNodeDriver::initializeDevice(const std::shared_ptr<ob::Device> &dev
RCLCPP_INFO_STREAM(logger_, "Firmware version: " << device_info_->firmwareVersion()); RCLCPP_INFO_STREAM(logger_, "Firmware version: " << device_info_->firmwareVersion());
RCLCPP_INFO_STREAM(logger_, "Hardware version: " << device_info_->hardwareVersion()); RCLCPP_INFO_STREAM(logger_, "Hardware version: " << device_info_->hardwareVersion());
RCLCPP_INFO_STREAM(logger_, "device unique id: " << device_unique_id_); RCLCPP_INFO_STREAM(logger_, "device unique id: " << device_unique_id_);
RCLCPP_INFO_STREAM(logger_, "Current node pid: " << getpid());
} }
void OBCameraNodeDriver::connectNetDevice(const std::string &net_device_ip, int net_device_port) { void OBCameraNodeDriver::connectNetDevice(const std::string &net_device_ip, int net_device_port) {