mirror of
https://github.com/orbbec/OrbbecSDK_ROS2.git
synced 2026-09-15 04:20:20 +08:00
fixed HUB hot plug bug
This commit is contained in:
@@ -72,6 +72,8 @@ class OBCameraNodeDriver : public rclcpp::Node {
|
|||||||
|
|
||||||
void syncTime();
|
void syncTime();
|
||||||
|
|
||||||
|
void resetDevice();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string config_path_;
|
std::string config_path_;
|
||||||
std::unique_ptr<ob::Context> ctx_ = nullptr;
|
std::unique_ptr<ob::Context> ctx_ = nullptr;
|
||||||
@@ -92,5 +94,9 @@ class OBCameraNodeDriver : public rclcpp::Node {
|
|||||||
int num_devices_connected_ = 0;
|
int num_devices_connected_ = 0;
|
||||||
rclcpp::TimerBase::SharedPtr check_connect_timer_ = nullptr;
|
rclcpp::TimerBase::SharedPtr check_connect_timer_ = nullptr;
|
||||||
std::shared_ptr<std::thread> sync_time_thread_ = nullptr;
|
std::shared_ptr<std::thread> sync_time_thread_ = nullptr;
|
||||||
|
std::shared_ptr<std::thread> reset_device_thread_ = nullptr;
|
||||||
|
std::mutex reset_device_mutex_;
|
||||||
|
std::condition_variable reset_device_cond_;
|
||||||
|
std::atomic_bool reset_device_flag_{false};
|
||||||
};
|
};
|
||||||
} // namespace orbbec_camera
|
} // namespace orbbec_camera
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
<!-- stereo_s_u3, astrapro, astra -->
|
<!-- stereo_s_u3, astrapro, astra -->
|
||||||
<arg name="camera1_prefix" default="01"/>
|
<arg name="camera1_prefix" default="01"/>
|
||||||
<arg name="camera2_prefix" default="02"/>
|
<arg name="camera2_prefix" default="02"/>
|
||||||
<arg name="camera1_serila_number" default="AY3A131007R"/>
|
<arg name="camera1_usb_port" default="2-3.3"/>
|
||||||
<arg name="camera2_serila_number" default="AY3JB20003L"/>
|
<arg name="camera2_usb_port" default="1-4.4"/>
|
||||||
<arg name="device_num" default="2"/>
|
<arg name="device_num" default="2"/>
|
||||||
<node name="camera" pkg="orbbec_camera" exec="ob_cleanup_shm_node" output="screen"/>
|
<node name="camera" pkg="orbbec_camera" exec="ob_cleanup_shm_node" output="screen"/>
|
||||||
<group>
|
<group>
|
||||||
<include file="$(find-pkg-share orbbec_camera)/launch/$(var 3d_sensor).launch.xml">
|
<include file="$(find-pkg-share orbbec_camera)/launch/$(var 3d_sensor).launch.xml">
|
||||||
<arg name="camera_name" value="camera_$(var camera1_prefix)"/>
|
<arg name="camera_name" value="camera_$(var camera1_prefix)"/>
|
||||||
<arg name="serial_number" value="$(var camera1_serila_number)"/>
|
<arg name="usb_port" value="$(var camera1_usb_port)"/>
|
||||||
<arg name="device_num" value="$(var device_num)"/>
|
<arg name="device_num" value="$(var device_num)"/>
|
||||||
</include>
|
</include>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<include file="$(find-pkg-share orbbec_camera)/launch/$(var 3d_sensor).launch.xml">
|
<include file="$(find-pkg-share orbbec_camera)/launch/$(var 3d_sensor).launch.xml">
|
||||||
<arg name="camera_name" value="camera_$(var camera2_prefix)"/>
|
<arg name="camera_name" value="camera_$(var camera2_prefix)"/>
|
||||||
<arg name="serial_number" value="$(var camera2_serila_number)"/>
|
<arg name="usb_port" value="$(var camera2_usb_port)"/>
|
||||||
<arg name="device_num" value="$(var device_num)"/>
|
<arg name="device_num" value="$(var device_num)"/>
|
||||||
</include>
|
</include>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ OBCameraNodeDriver::~OBCameraNodeDriver() {
|
|||||||
if (query_thread_ && query_thread_->joinable()) {
|
if (query_thread_ && query_thread_->joinable()) {
|
||||||
query_thread_->join();
|
query_thread_->join();
|
||||||
}
|
}
|
||||||
|
if (reset_device_thread_ && reset_device_thread_->joinable()) {
|
||||||
|
reset_device_cond_.notify_all();
|
||||||
|
reset_device_thread_->join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBCameraNodeDriver::init() {
|
void OBCameraNodeDriver::init() {
|
||||||
@@ -71,7 +75,7 @@ void OBCameraNodeDriver::init() {
|
|||||||
query_thread_ = std::make_shared<std::thread>([this]() { queryDevice(); });
|
query_thread_ = std::make_shared<std::thread>([this]() { queryDevice(); });
|
||||||
device_count_update_thread_ = std::make_shared<std::thread>([this]() { deviceCountUpdate(); });
|
device_count_update_thread_ = std::make_shared<std::thread>([this]() { deviceCountUpdate(); });
|
||||||
sync_time_thread_ = std::make_shared<std::thread>([this]() { syncTime(); });
|
sync_time_thread_ = std::make_shared<std::thread>([this]() { syncTime(); });
|
||||||
CHECK_NOTNULL(device_count_update_thread_);
|
reset_device_thread_ = std::make_shared<std::thread>([this]() { resetDevice(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBCameraNodeDriver::onDeviceConnected(const std::shared_ptr<ob::DeviceList> &device_list) {
|
void OBCameraNodeDriver::onDeviceConnected(const std::shared_ptr<ob::DeviceList> &device_list) {
|
||||||
@@ -105,11 +109,10 @@ void OBCameraNodeDriver::onDeviceDisconnected(const std::shared_ptr<ob::DeviceLi
|
|||||||
std::scoped_lock<decltype(device_lock_)> lock(device_lock_);
|
std::scoped_lock<decltype(device_lock_)> lock(device_lock_);
|
||||||
RCLCPP_INFO_STREAM(logger_, "device with " << uid << " disconnected");
|
RCLCPP_INFO_STREAM(logger_, "device with " << uid << " disconnected");
|
||||||
if (uid == device_unique_id_) {
|
if (uid == device_unique_id_) {
|
||||||
ob_camera_node_.reset();
|
std::unique_lock<decltype(reset_device_mutex_)> reset_device_lock(reset_device_mutex_);
|
||||||
device_.reset();
|
reset_device_flag_ = true;
|
||||||
device_connected_ = false;
|
reset_device_cond_.notify_all();
|
||||||
current_device_disconnected = true;
|
current_device_disconnected = true;
|
||||||
device_unique_id_.clear();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,6 +178,21 @@ void OBCameraNodeDriver::syncTime() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OBCameraNodeDriver::resetDevice() {
|
||||||
|
while (is_alive_ && rclcpp::ok()) {
|
||||||
|
std::unique_lock<decltype(reset_device_mutex_)> lock(reset_device_mutex_);
|
||||||
|
reset_device_cond_.wait(lock,
|
||||||
|
[this]() { return !is_alive_ || !rclcpp::ok() || reset_device_flag_; });
|
||||||
|
if (!is_alive_ || !rclcpp::ok()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ob_camera_node_.reset();
|
||||||
|
device_.reset();
|
||||||
|
device_connected_ = false;
|
||||||
|
device_unique_id_.clear();
|
||||||
|
reset_device_flag_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
void OBCameraNodeDriver::releaseDeviceSemaphore(sem_t *device_sem, int &num_devices_connected) {
|
void OBCameraNodeDriver::releaseDeviceSemaphore(sem_t *device_sem, int &num_devices_connected) {
|
||||||
RCLCPP_INFO_THROTTLE(logger_, *get_clock(), 1000, "Release device semaphore");
|
RCLCPP_INFO_THROTTLE(logger_, *get_clock(), 1000, "Release device semaphore");
|
||||||
sem_post(device_sem);
|
sem_post(device_sem);
|
||||||
@@ -316,15 +334,17 @@ std::shared_ptr<ob::Device> OBCameraNodeDriver::selectDeviceByUSBPort(
|
|||||||
std::string uid = device_info->uid();
|
std::string uid = device_info->uid();
|
||||||
auto port_id = parseUsbPort(uid);
|
auto port_id = parseUsbPort(uid);
|
||||||
if (port_id == usb_port) {
|
if (port_id == usb_port) {
|
||||||
RCLCPP_INFO_STREAM(logger_, "Device port id " << port_id << " matched");
|
RCLCPP_ERROR_STREAM_THROTTLE(logger_, *get_clock(), 1000,
|
||||||
|
"Device port id " << port_id << " matched");
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::string uid = list->uid(i);
|
std::string uid = list->uid(i);
|
||||||
auto port_id = parseUsbPort(uid);
|
auto port_id = parseUsbPort(uid);
|
||||||
RCLCPP_INFO_STREAM(logger_, "Device usb port: " << uid);
|
RCLCPP_ERROR_STREAM_THROTTLE(logger_, *get_clock(), 1000, "Device usb port: " << uid);
|
||||||
if (port_id == usb_port) {
|
if (port_id == usb_port) {
|
||||||
RCLCPP_INFO_STREAM(logger_, "Device usb port <<" << uid << " matched");
|
RCLCPP_ERROR_STREAM_THROTTLE(logger_, *get_clock(), 1000,
|
||||||
|
"Device usb port " << uid << " matched");
|
||||||
return list->getDevice(i);
|
return list->getDevice(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user