From 5efa57da6ebef60bb8bf437d525586d353d04dda Mon Sep 17 00:00:00 2001 From: mt-lifan Date: Tue, 2 Dec 2025 17:05:06 +0800 Subject: [PATCH] compatible with odin1 firmware version 0.8.0 1. add option to use host ros time as data timestamp, not recommanded unless specifically require this setup 2. only pub odm-map tf in relocal mode 3. add option to also not pub odm-base_link tf, not recommanded unless specifically require this setup 4. dev_status.csv now have device timestamp to better help analyzing 5. add control option to enable encrtypted device debug log, should only enable when instructed by official support --- README.md | 15 +- config/control_command.yaml | 67 ++++++- include/host_sdk_sample.h | 383 ++++++++++++++++-------------------- include/lidar_api.h | 10 + include/lidar_api_type.h | 11 ++ lib/liblydHostApi_amd.a | Bin 337956 -> 352194 bytes lib/liblydHostApi_arm.a | Bin 359620 -> 373786 bytes src/host_sdk_sample.cpp | 274 ++++++++++++++++++++------ 8 files changed, 474 insertions(+), 286 deletions(-) diff --git a/README.md b/README.md index e9960c2..85c488b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ ROS driver suite for Odin sensor modules (Manifold Tech Ltd.) +Odin1 wiki: https://manifoldtehltd.github.io/wiki/Odin1/Cover.html + ## Odin_ROS_Driver Compatibility: @@ -16,18 +18,20 @@ This driver package provides core functionality for point cloud SLAM application ## 1. Version -Current Version: v0.6.1 +Current Version: v0.7.0 ## 2. Preparation ### 2.1 OS Requirement -● Ubuntu 18.04 for ROS Melodic; - ● Ubuntu 20.04 for ROS Noetic and ROS2 Foxy; ● Ubuntu 22.04 for ROS2 Humble; +● Ubuntu 18.04 is currently not supported; + +● Ubuntu 24.04 is not officially supported but may work with some modifications. + ### 2.2 Dependencies ● Opencv >= 4.5.0(recommand 4.5.5/4.8.0. Make sure only one version of opencv is installed) @@ -67,8 +71,6 @@ sudo apt-get install libopencv-dev ``` #### 2.3.4 ROS install -For ROS Melodic installation, please refer to: -[ROS Melodic installation instructions](https://wiki.ros.org/melodic/Installation) For ROS Noetic installation, please refer to: [ROS Noetic installation instructions](https://wiki.ros.org/noetic/Installation) @@ -437,6 +439,9 @@ Disable odin1/image with sendrgb = 0 in control_command.yaml and try again. If t Purge the unused version of opencv and maintain a single complete version, then rebuild the driver and try again. ## 6. Contact Information​​ + +You can contact our support through support@manifoldtech.cn + To help diagnose the issue, please provide the following details to our FAE engineer: 1. ​Current firmware version​​ diff --git a/config/control_command.yaml b/config/control_command.yaml index 073ea6e..233486a 100644 --- a/config/control_command.yaml +++ b/config/control_command.yaml @@ -1,23 +1,70 @@ register_keys: - strict_usb3.0_check: 0 # 0: off: 1: on; if off, allow connection even if usb connection is below usb 3.0 + # if off, allow connection even if usb connection is below usb 3.0 + # ATTENTION: usb 3.0 is always recommended, as advance functionality like SLAM mode requires usb 3.0 for reliable map file transfer + strict_usb3.0_check: 0 # 0: off: 1: on; + + # 0: use odin internal system time as data time stamp as before, typical and recommanded; + # 1: use host ros time (upon recieve) as data time stamp, only use if you specifically require this setup, not recommanded for most user + use_host_ros_time: 0 + streamctrl: 1 # 0: off; 1: on - sendrgb: 1 # 0: off; 1: on - sendimu: 1 # 0: off; 1: on - sendodom: 1 # 0: off; 1: on - senddtof: 1 # 0: off; 1: on - sendcloudslam: 1 # 0: off; 1: on - sendcloudrender: 1 # 0: off; 1: on + + # original rgb data in jpeg format from device sendrgbcompressed: 1 # 0: off; 1: on + + # RGB data, decoded from original jpeg data from device, bgr8 format + # Processed on host device + sendrgb: 1 # 0: off; 1: on + + # undistort rgb image processed from decoded rgb data. + # depends on sendrgb. related camera parameters can be found in ws/src/odin_ros_driver/config/calib.yaml + # Processed on host device + sendrgbundistort: 0 # 0: off; 1: on. + + # IMU data + sendimu: 1 # 0: off; 1: on + + # Odometry data + sendodom: 1 # 0: off; 1: on + + # TF from odom to base_link. Leave it on unless you specifically need it off. + # ATTENTION: critical for rviz to show cloud_raw. + send_odom_baselink_tf: 1 # 0: off; 1: on. + + # raw dtof data + senddtof: 1 # 0: off; 1: on + + # slam cloud data + sendcloudslam: 1 # 0: off; 1: on + + # processed with raw point cloud, rgb image, and calib.yaml from device + # Processed on host device + sendcloudrender: 1 # 0: off; 1: on + + # depth completion demo, high computing resource usage. + # for more information please refer to the readme file. + # Processed on host device senddepth: 0 # 0: off; 1: on - sendrgbundistort: 0 # 0: off; 1: on + + # record rgb, odometry, and slam cloud data as proprietary olx format for further processing in MindCloud(TM) software. + # save path: ws/src/odin_ros_driver/recorddata/{record_start_time}/ + # ATTENTION: please copy the full folder for post-processing. recorddata: 0 # 0: off; 1: on - devstatuslog: 1 # 0: off; 1: on + + # Save device runtime status info to ws/src/odin_ros_driver/log/Driver_{drvier_start_time}/Conn_{device_connection_time}/dev_status.csv + devstatuslog: 1 # 0: off; 1: on. + + save_log: 0 # 0: off; 1: on; + + # raw dtof sensor intensity data in gray format, mostly for debug purpose. pubintensitygray: 0 # 0: off; 1: on + showpath: 0 # 0: off; 1: on showcamerapose: 0 # 0: off; 1: on + custom_save_map: 0 custom_map_mode: 0 # 0: Odometry mode 1: SLAM mode 2: Relocalization mode custom_init_pos: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0] relocalization_map_abs_path: "" # must be set for Relocalization mode or will fail mapping_result_dest_dir: "" # "": use default value; other: use custom value - mapping_result_file_name: "" # "": use default value; other: use custom value \ No newline at end of file + mapping_result_file_name: "" # "": use default value; other: use custom value diff --git a/include/host_sdk_sample.h b/include/host_sdk_sample.h index 2dc2bea..108335a 100644 --- a/include/host_sdk_sample.h +++ b/include/host_sdk_sample.h @@ -182,6 +182,10 @@ class RosNodeControlInterface { virtual ~RosNodeControlInterface() = default; virtual void setDtofSubframeODR(int odr) = 0; virtual int getDtofSubframeODR() const = 0; + virtual void setUseHostRosTime(bool use_host_ros_time) = 0; + virtual bool useHostRosTime() const = 0; + virtual void setSendOdomBaseLinkTF(bool send_odom_baselink_tf) = 0; + virtual bool sendOdomBaseLinkTF() const = 0; }; RosNodeControlInterface* getRosNodeControl(); @@ -233,7 +237,15 @@ public: ros::Imu imu_msg; #endif - imu_msg.header.stamp = ns_to_ros_time(stream->stamp); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + imu_msg.header.stamp = node_->now(); + #else + imu_msg.header.stamp = ros::Time::now(); + #endif + } else { + imu_msg.header.stamp = ns_to_ros_time(stream->stamp); + } imu_msg.header.frame_id = "imu_link"; imu_msg.linear_acceleration.y = -1 * stream->accel_x; @@ -499,7 +511,7 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m } } - void publishIntensityCloud(capture_Image_List_t* stream, int idx) +void publishIntensityCloud(capture_Image_List_t* stream, int idx) { // Check index validity if (idx < 0 || idx >= 10) { @@ -534,7 +546,15 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m // Set message header msg->header.frame_id = "odin1_base_link"; - msg->header.stamp = ns_to_ros_time(cloud.timestamp); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + msg->header.stamp = node_->now(); + #else + msg->header.stamp = ros::Time::now(); + #endif + } else { + msg->header.stamp = ns_to_ros_time(cloud.timestamp); + } msg->height = cloud.height; msg->width = cloud.width; @@ -653,173 +673,51 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m #endif } - void publishGrayUInt8(capture_Image_List_t *stream, int idx) { - ImageMsg msg; - msg.header.stamp = ns_to_ros_time(stream->imageList[idx].timestamp); - msg.header.frame_id = "map"; - - int width = stream->imageList[idx].width; - int height = stream->imageList[idx].height; - - msg.height = height; - msg.width = width; - msg.encoding = "mono8"; - msg.is_bigendian = false; - msg.step = width * sizeof(uint8_t); - - size_t image_size = msg.step * height; - - msg.data.resize(image_size); - - memcpy(msg.data.data(), stream->imageList[idx].pAddr, image_size); - +void publishGrayUInt8(capture_Image_List_t *stream, int idx) { + ImageMsg msg; + if (getRosNodeControl()->useHostRosTime()) { #ifdef ROS2 - intensity_gray_pub_->publish(msg); + msg.header.stamp = node_->now(); #else - intensity_gray_pub_.publish(msg); + msg.header.stamp = ros::Time::now(); #endif + } else { + msg.header.stamp = ns_to_ros_time(stream->imageList[idx].timestamp); } + msg.header.frame_id = "map"; - void publishRgb(capture_Image_List_t *stream) { + int width = stream->imageList[idx].width; + int height = stream->imageList[idx].height; + + msg.height = height; + msg.width = width; + msg.encoding = "mono8"; + msg.is_bigendian = false; + msg.step = width * sizeof(uint8_t); + + size_t image_size = msg.step * height; + + msg.data.resize(image_size); + + memcpy(msg.data.data(), stream->imageList[idx].pAddr, image_size); + + #ifdef ROS2 + intensity_gray_pub_->publish(msg); + #else + intensity_gray_pub_.publish(msg); + #endif +} + +void publishRgb(capture_Image_List_t *stream) { buffer_List_t &image = stream->imageList[0]; // old version yuv data if (image.length == image.width * image.height * 3 / 2) { - try { - const int height_nv12 = image.height * 3 / 2; - cv::Mat nv12_mat(height_nv12, image.width, CV_8UC1, image.pAddr); - cv::Mat bgr; - cv::cvtColor(nv12_mat, bgr, cv::COLOR_YUV2BGR_NV12); - - if (bgr.empty()) { - #ifndef ROS2 - ROS_ERROR("Failed to convert NV12 to BGR"); - #endif - return; - } - - //Create ROS image message - #ifdef ROS2 - auto header = std::make_shared(); - header->stamp = ns_to_ros_time(image.timestamp); // Offset compensation - - //RCLCPP_INFO(rclcpp::get_logger("device_cb"), "image rgb %ld",image.timestamp); - header->frame_id = "camera_rgb_frame"; - - auto cv_image = std::make_shared(*header, "bgr8", bgr); - auto msg = cv_image->toImageMsg(); - - // Add to unified queue - if (g_sendcloudrender) { - std::lock_guard lock(rgb_queue_mutex_); - if (rgb_image_queue_.size() >= 10) { - rgb_image_queue_.pop_front(); - } - rgb_image_queue_.push_back(msg); - } - - // Publish original image message - rgb_pub_->publish(*msg); - - // Create compressed image message - auto compressed_msg = std::make_shared(); - compressed_msg->header = *header; - compressed_msg->format = "jpeg"; - - // Set compression parameters - std::vector compression_params; - compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); - compression_params.push_back(80); - - // Compress image - cv::imencode(".JPEG", bgr, compressed_msg->data, compression_params); - - // Enqueue binary logging for image - if (data_logger_) { - const uint32_t idx_now = image_index_.fetch_add(1, std::memory_order_relaxed); - const double ts_sec = static_cast(image.timestamp) / 1e9; - const uint32_t jpeg_size = static_cast(compressed_msg->data.size()); - std::vector blob; - blob.reserve(sizeof(uint32_t) + sizeof(double) + sizeof(uint32_t) + jpeg_size); - auto append_pod = [&](const auto& v) { - const uint8_t* p = reinterpret_cast(&v); - blob.insert(blob.end(), p, p + sizeof(v)); - }; - append_pod(idx_now); - append_pod(ts_sec); - append_pod(jpeg_size); - blob.insert(blob.end(), compressed_msg->data.begin(), compressed_msg->data.end()); - data_logger_->enqueueImageFrame(std::move(blob)); - } - - compressed_rgb_pub_->publish(*compressed_msg); - - #else - // ROS1 version - std_msgs::Header header; - header.stamp = ns_to_ros_time(image.timestamp); // Offset compensation - header.frame_id = "camera_rgb_frame"; - - auto cv_image = boost::make_shared(header, "bgr8", bgr); - auto msg = cv_image->toImageMsg(); - - // Add to unified queue - if (g_sendcloudrender) { - std::lock_guard lock(rgb_queue_mutex_); - if (rgb_image_queue_.size() >= 10) { - rgb_image_queue_.pop_front(); - } - rgb_image_queue_.push_back(msg); - } - - // Publish original image message - rgb_pub_.publish(msg); - - // Publish compressed image - always publish - // Create compressed image message - sensor_msgs::CompressedImagePtr compressed_msg(new sensor_msgs::CompressedImage()); - compressed_msg->header = header; - compressed_msg->format = "jpeg"; - - // Set compression parameters - std::vector compression_params; - compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); - compression_params.push_back(80); // JPEG quality 80% - - // Compress image - cv::imencode(".jpg", bgr, compressed_msg->data, compression_params); - - // Enqueue binary logging for image - if (data_logger_) { - const uint32_t idx_now = image_index_.fetch_add(1, std::memory_order_relaxed); - // Convert ROS1 header.stamp to seconds - const double ts_sec = static_cast(header.stamp.sec) + static_cast(header.stamp.nsec) / 1e9; - const uint32_t jpeg_size = static_cast(compressed_msg->data.size()); - std::vector blob; - blob.reserve(sizeof(uint32_t) + sizeof(double) + sizeof(uint32_t) + jpeg_size); - auto append_pod = [&](const auto& v) { - const uint8_t* p = reinterpret_cast(&v); - blob.insert(blob.end(), p, p + sizeof(v)); - }; - append_pod(idx_now); - append_pod(ts_sec); - append_pod(jpeg_size); - blob.insert(blob.end(), compressed_msg->data.begin(), compressed_msg->data.end()); - data_logger_->enqueueImageFrame(std::move(blob)); - } - compressed_rgb_pub_.publish(compressed_msg); - - #endif - - } catch (const cv::Exception& e) { - #ifndef ROS2 - ROS_ERROR("OpenCV error in publishRgb: %s", e.what()); - #endif - } catch (const std::exception& e) { - #ifndef ROS2 - ROS_ERROR("Exception in publishRgb: %s", e.what()); - #endif - } + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("publishRgb"), "old format rgb data, please upgrade device firmware"); + #else + ROS_INFO("old format rgb data, please upgrade device firmware"); + #endif } else {// new version jpeg data std::vector jpeg_data(static_cast(image.pAddr), @@ -829,7 +727,15 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m cv::Mat decoded_image = cv::imdecode(jpeg_data, cv::IMREAD_COLOR); cv_bridge::CvImage cv_image; - cv_image.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + cv_image.header.stamp = node_->now(); + #else + cv_image.header.stamp = ros::Time::now(); + #endif + } else { + cv_image.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } cv_image.encoding = "bgr8"; cv_image.image = decoded_image; @@ -865,10 +771,19 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m if (m_undistort_map_init_success) { cv::remap(decoded_image, undistorted_image, m_undistort_map_x, m_undistort_map_y, cv::INTER_LINEAR); - cv_undistorted_image.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + cv_undistorted_image.header.stamp = node_->now(); + #else + cv_undistorted_image.header.stamp = ros::Time::now(); + #endif + } else { + cv_undistorted_image.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } cv_undistorted_image.encoding = "bgr8"; cv_undistorted_image.image = undistorted_image; } + #ifdef ROS2 { rgb_pub_->publish(*cv_image.toImageMsg()); @@ -878,7 +793,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m // original jpeg sensor_msgs::msg::CompressedImage jpeg_msg; - jpeg_msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + jpeg_msg.header.stamp = node_->now(); + } else { + jpeg_msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } jpeg_msg.format = "jpeg"; jpeg_msg.data = jpeg_data; @@ -893,9 +812,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m // original jpeg sensor_msgs::CompressedImagePtr jpeg_msg(new sensor_msgs::CompressedImage()); - // compressed_msg->header = header; - // compressed_msg->format = "jpeg"; - jpeg_msg->header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + jpeg_msg->header.stamp = ros::Time::now(); + } else { + jpeg_msg->header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } jpeg_msg->format = "jpeg"; jpeg_msg->data = jpeg_data; @@ -912,7 +833,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m #ifdef ROS2 sensor_msgs::msg::PointCloud2 msg; msg.header.frame_id = "odom"; - msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + msg.header.stamp = node_->now(); + } else { + msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } //RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Point cloudrgba %ld",stream->imageList[0].timestamp); @@ -940,7 +865,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m #else sensor_msgs::PointCloud2 msg; msg.header.frame_id = "odom"; - msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + if (getRosNodeControl()->useHostRosTime()) { + msg.header.stamp = ros::Time::now(); + } else { + msg.header.stamp = ns_to_ros_time(stream->imageList[0].timestamp); + } size_t pt_size = sizeof(int32_t) * 3 + sizeof(int32_t) * 4; uint32_t points = stream->imageList[idx].length / pt_size; @@ -1054,7 +983,15 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m if (data_len == sizeof(ros_odom_convert_complete_t)) { ros_odom_convert_complete_t* odom_data = (ros_odom_convert_complete_t*)stream->imageList[0].pAddr; - msg.header.stamp = ns_to_ros_time(odom_data->timestamp_ns); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + msg.header.stamp = node_->now(); + #else + msg.header.stamp = ros::Time::now(); + #endif + } else { + msg.header.stamp = ns_to_ros_time(odom_data->timestamp_ns); + } msg.pose.pose.position.x = static_cast(odom_data->pos[0]) / 1e6; msg.pose.pose.position.y = static_cast(odom_data->pos[1]) / 1e6; @@ -1109,7 +1046,15 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m } else if (data_len == sizeof(ros2_odom_convert_t)) { ros2_odom_convert_t* odom_data = (ros2_odom_convert_t*)stream->imageList[0].pAddr; - msg.header.stamp = ns_to_ros_time(odom_data->timestamp_ns); + if (getRosNodeControl()->useHostRosTime()) { + #ifdef ROS2 + msg.header.stamp = node_->now(); + #else + msg.header.stamp = ros::Time::now(); + #endif + } else { + msg.header.stamp = ns_to_ros_time(odom_data->timestamp_ns); + } msg.pose.pose.position.x = static_cast(odom_data->pos[0]) / 1e6; msg.pose.pose.position.y = static_cast(odom_data->pos[1]) / 1e6; @@ -1125,18 +1070,24 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m switch(odom_type) { case OdometryType::STANDARD: { - geometry_msgs::msg::TransformStamped transformStamped; - transformStamped.header.stamp = msg.header.stamp; - transformStamped.header.frame_id = "odom"; - transformStamped.child_frame_id = "odin1_base_link"; - transformStamped.transform.translation.x = msg.pose.pose.position.x; - transformStamped.transform.translation.y = msg.pose.pose.position.y; - transformStamped.transform.translation.z = msg.pose.pose.position.z; - transformStamped.transform.rotation.x = msg.pose.pose.orientation.x; - transformStamped.transform.rotation.y = msg.pose.pose.orientation.y; - transformStamped.transform.rotation.z = msg.pose.pose.orientation.z; - transformStamped.transform.rotation.w = msg.pose.pose.orientation.w; - tf_broadcaster->sendTransform(transformStamped); + if (getRosNodeControl()->sendOdomBaseLinkTF()) { + geometry_msgs::msg::TransformStamped transformStamped; + if (getRosNodeControl()->useHostRosTime()) { + transformStamped.header.stamp = node_->now(); + } else { + transformStamped.header.stamp = msg.header.stamp; + } + transformStamped.header.frame_id = "odom"; + transformStamped.child_frame_id = "odin1_base_link"; + transformStamped.transform.translation.x = msg.pose.pose.position.x; + transformStamped.transform.translation.y = msg.pose.pose.position.y; + transformStamped.transform.translation.z = msg.pose.pose.position.z; + transformStamped.transform.rotation.x = msg.pose.pose.orientation.x; + transformStamped.transform.rotation.y = msg.pose.pose.orientation.y; + transformStamped.transform.rotation.z = msg.pose.pose.orientation.z; + transformStamped.transform.rotation.w = msg.pose.pose.orientation.w; + tf_broadcaster->sendTransform(transformStamped); + } odom_publisher_->publish(msg); // Publish odom trajectory as visualization markers (green lines connecting adjacent points) @@ -1201,7 +1152,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m case OdometryType::TRANSFORM: { geometry_msgs::msg::TransformStamped transformStamped; - transformStamped.header.stamp = msg.header.stamp; + if (getRosNodeControl()->useHostRosTime()) { + transformStamped.header.stamp = node_->now(); + } else { + transformStamped.header.stamp = msg.header.stamp; + } transformStamped.header.frame_id = "odom"; transformStamped.child_frame_id = "map"; transformStamped.transform.translation.x = msg.pose.pose.position.x; @@ -1219,18 +1174,24 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m switch(odom_type) { case OdometryType::STANDARD: { - geometry_msgs::TransformStamped transformStamped; - transformStamped.header.stamp = msg.header.stamp; - transformStamped.header.frame_id = "odom"; - transformStamped.child_frame_id = "odin1_base_link"; - transformStamped.transform.translation.x = msg.pose.pose.position.x; - transformStamped.transform.translation.y = msg.pose.pose.position.y; - transformStamped.transform.translation.z = msg.pose.pose.position.z; - transformStamped.transform.rotation.x = msg.pose.pose.orientation.x; - transformStamped.transform.rotation.y = msg.pose.pose.orientation.y; - transformStamped.transform.rotation.z = msg.pose.pose.orientation.z; - transformStamped.transform.rotation.w = msg.pose.pose.orientation.w; - tf_broadcaster->sendTransform(transformStamped); + if (getRosNodeControl()->sendOdomBaseLinkTF()) { + geometry_msgs::TransformStamped transformStamped; + if (getRosNodeControl()->useHostRosTime()) { + transformStamped.header.stamp = ros::Time::now(); + } else { + transformStamped.header.stamp = msg.header.stamp; + } + transformStamped.header.frame_id = "odom"; + transformStamped.child_frame_id = "odin1_base_link"; + transformStamped.transform.translation.x = msg.pose.pose.position.x; + transformStamped.transform.translation.y = msg.pose.pose.position.y; + transformStamped.transform.translation.z = msg.pose.pose.position.z; + transformStamped.transform.rotation.x = msg.pose.pose.orientation.x; + transformStamped.transform.rotation.y = msg.pose.pose.orientation.y; + transformStamped.transform.rotation.z = msg.pose.pose.orientation.z; + transformStamped.transform.rotation.w = msg.pose.pose.orientation.w; + tf_broadcaster->sendTransform(transformStamped); + } odom_publisher_.publish(msg); if (show_path) { @@ -1296,7 +1257,11 @@ void process_pair(const ImageConstPtr &rgb_msg, const PointCloud2ConstPtr &pcd_m case OdometryType::TRANSFORM: { geometry_msgs::TransformStamped transformStamped; - transformStamped.header.stamp = msg.header.stamp; + if (getRosNodeControl()->useHostRosTime()) { + transformStamped.header.stamp = ros::Time::now(); + } else { + transformStamped.header.stamp = msg.header.stamp; + } transformStamped.header.frame_id = "odom"; transformStamped.child_frame_id = "map"; transformStamped.transform.translation.x = msg.pose.pose.position.x; @@ -1533,18 +1498,18 @@ private: } #ifdef ROS1 void initialize_publishers(ros::NodeHandle& nh) { - imu_pub_ = nh.advertise("odin1/imu", 10); - rgb_pub_ = nh.advertise("odin1/image", 10); - cloud_pub_ = nh.advertise("odin1/cloud_raw", 10); - xyzrgbacloud_pub_ = nh.advertise("odin1/cloud_slam", 10); - odom_publisher_ = nh.advertise("odin1/odometry", 10); - odom_highfreq_publisher_ = nh.advertise("odin1/odometry_highfreq", 10); - path_publisher_ = nh.advertise("odin1/path", 10); - pub_camera_pose_visual_ = nh.advertise("odin1/camera_pose_visual", 10); - rgbcloud_pub_ = nh.advertise("odin1/cloud_render", 10); - compressed_rgb_pub_ = nh.advertise("odin1/image/compressed", 10); - undistort_rgb_pub_ = nh.advertise("odin1/image/undistorted", 10); - intensity_gray_pub_ = nh.advertise("odin1/image/intensity_gray", 10); + imu_pub_ = nh.advertise("odin1/imu", 4000); + rgb_pub_ = nh.advertise("odin1/image", 100); + cloud_pub_ = nh.advertise("odin1/cloud_raw", 100); + xyzrgbacloud_pub_ = nh.advertise("odin1/cloud_slam", 100); + odom_publisher_ = nh.advertise("odin1/odometry", 100); + odom_highfreq_publisher_ = nh.advertise("odin1/odometry_highfreq", 4000); + path_publisher_ = nh.advertise("odin1/path", 100); + pub_camera_pose_visual_ = nh.advertise("odin1/camera_pose_visual", 100); + rgbcloud_pub_ = nh.advertise("odin1/cloud_render", 100); + compressed_rgb_pub_ = nh.advertise("odin1/image/compressed", 100); + undistort_rgb_pub_ = nh.advertise("odin1/image/undistorted", 100); + intensity_gray_pub_ = nh.advertise("odin1/image/intensity_gray", 100); tf_broadcaster = std::make_unique(); } #endif diff --git a/include/lidar_api.h b/include/lidar_api.h index cad84d4..1324179 100644 --- a/include/lidar_api.h +++ b/include/lidar_api.h @@ -245,6 +245,16 @@ int lidar_get_custom_parameter(device_handle device, const char* param_name, int */ int lidar_get_mapping_result(device_handle device, const char* dest_dir, const char* file_name); + /** + * @brief enable device log + * + * + * @param device Handle to the target device + * @param dest_dir Destination directory to save the logs + * @return int 0 on success, -1 on failure + */ + int lidar_enable_encrypted_device_log(device_handle device, const char* dest_dir); + #ifdef __cplusplus } #endif diff --git a/include/lidar_api_type.h b/include/lidar_api_type.h index 40bbf91..5e7d56c 100644 --- a/include/lidar_api_type.h +++ b/include/lidar_api_type.h @@ -56,12 +56,14 @@ typedef enum { LIDAR_DT_DEV_STATUS, LIDAR_DT_SLAM_ODOMETRY_HIGHFREQ, LIDAR_DT_SLAM_ODOMETRY_TF, + LIDAR_DT_SLAM_WIWC } lidar_data_type_e; typedef struct { int8_t serial[LIDAR_SERIAL_MAX]; int8_t model[LIDAR_MODEL_MAX]; bool online; + uint32_t initial_state; } lidar_device_info_t; typedef struct { @@ -187,6 +189,7 @@ typedef struct{ } lidar_soc_thermal_t; typedef struct { + double uptime_seconds; lidar_soc_thermal_t soc_thermal; int cpu_use_rate[8]; /* cpu usage rate */ @@ -202,6 +205,14 @@ typedef struct } lidar_device_status_t; +typedef enum { + LIDAR_DEVICE_NONE = 0, + LIDAR_DEVICE_NOT_INITIALIZED, + LIDAR_DEVICE_INITIALIZED, + LIDAR_DEVICE_STREAMING, + LIDAR_DEVICE_STREAM_STOPPED, +} lidar_device_initial_state_e; + #ifdef __cplusplus } #endif diff --git a/lib/liblydHostApi_amd.a b/lib/liblydHostApi_amd.a index 449725feb4e5f21ffb3d9490c3548e056d2ded74..9ca742eb0cf40f732899d40f6c856fb148000a63 100644 GIT binary patch delta 69015 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 delta 67793 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 diff --git a/src/host_sdk_sample.cpp b/src/host_sdk_sample.cpp index 4c0b916..3832366 100644 --- a/src/host_sdk_sample.cpp +++ b/src/host_sdk_sample.cpp @@ -35,6 +35,7 @@ limitations under the License. #include #include #include +#include // #include #include #include @@ -45,7 +46,9 @@ limitations under the License. #include #include #endif -#define ros_driver_version "0.6.1" +#define ros_driver_version "0.7.0" +#define recommended_firmware_version "0.8.0" + // Global variable declarations static device_handle odinDevice = nullptr; static std::atomic deviceConnected(false); @@ -88,6 +91,7 @@ int g_sendrgb = 1; int g_sendimu = 1; int g_senddtof = 1; int g_sendodom = 1; +int g_send_odom_baselink_tf = 0; int g_sendcloudslam = 0; int g_sendcloudrender = 0; int g_sendrgb_compressed = 0; @@ -98,6 +102,8 @@ int g_pub_intensity_gray = 0; int g_show_path = 0; int g_show_camerapose = 0; int g_strict_usb3_0_check = 0; +int g_use_host_ros_time = 0; +int g_save_log = 0; std::filesystem::path log_root_dir_; int g_custom_map_mode = 0; @@ -169,9 +175,27 @@ class RosNodeControlImpl : public RosNodeControlInterface { int getDtofSubframeODR() const override { return dtof_subframe_interval_time; } + + void setUseHostRosTime(bool use_host_ros_time) override { + pub_use_host_ros_time = use_host_ros_time; + } + + bool useHostRosTime() const override { + return pub_use_host_ros_time; + } + void setSendOdomBaseLinkTF(bool send_odom_baselink_tf) override { + pub_odom_baselink_tf = send_odom_baselink_tf; + } + + bool sendOdomBaseLinkTF() const override { + return pub_odom_baselink_tf; + } + private: int dtof_subframe_interval_time = 0; + bool pub_use_host_ros_time = false; + bool pub_odom_baselink_tf = false; }; static RosNodeControlImpl g_rosNodeControlImpl; @@ -790,9 +814,8 @@ static void lidar_data_callback(const lidar_data_t *data, void *user_data) if (dev_status_csv_file) { // append the data row int rc = 0; - rc = std::fprintf(dev_status_csv_file, "%d,%d,%d,%d,%d,%d,", // %.0f - // get_uptime_seconds(), - 0, + rc = std::fprintf(dev_status_csv_file, "%.2f,%d,%d,%d,%d,%d,", + dev_info_data->uptime_seconds, dev_info_data->soc_thermal.package_temp, dev_info_data->soc_thermal.cpu_temp, dev_info_data->soc_thermal.center_temp, @@ -937,7 +960,14 @@ static void lidar_data_callback(const lidar_data_t *data, void *user_data) break; case LIDAR_DT_SLAM_ODOMETRY_TF: { - g_ros_object->publishOdometry((capture_Image_List_t *)&data->stream, OdometryType::TRANSFORM, false, false); + if (g_custom_map_mode == 2) { + g_ros_object->publishOdometry((capture_Image_List_t *)&data->stream, OdometryType::TRANSFORM, false, false); + } + } + break; + case LIDAR_DT_SLAM_WIWC: + { + //... } break; default: @@ -988,18 +1018,6 @@ static void lidar_device_callback(const lidar_device_info_t* device, bool attach #endif return; } - - if (lidar_open_device(odinDevice)) { - #ifdef ROS2 - RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Open device failed"); - #else - ROS_ERROR("Open device failed"); - #endif - lidar_destory_device(odinDevice); - odinDevice = nullptr; - return; - } - const std::string package_name = "odin_ros_driver"; std::string config_dir = ""; #ifdef ROS2 @@ -1024,7 +1042,41 @@ static void lidar_device_callback(const lidar_device_info_t* device, bool attach #else ROS_INFO("Calibration files will be saved to: %s", config_dir.c_str()); #endif - + + std::filesystem::path per_con_log_root_dir; + { + auto connection_time = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(connection_time); + std::tm tm{}; + #ifdef _WIN32 + localtime_s(&tm, &t); + #else + localtime_r(&t, &tm); + #endif + char buf[32]; + std::strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", &tm); + std::string folder_name = std::string("Conn_") + std::string(buf); + std::filesystem::path base_log_dir = log_root_dir_.empty() + ? std::filesystem::path(config_dir) + : log_root_dir_; + per_con_log_root_dir = base_log_dir / folder_name; + + std::error_code per_con_dir_err; + std::filesystem::create_directories(per_con_log_root_dir, per_con_dir_err); + if (per_con_dir_err) { + #ifdef ROS2 + RCLCPP_WARN(rclcpp::get_logger("device_cb"), + "Failed to create per-connection log directory %s: %s", + per_con_log_root_dir.c_str(), + per_con_dir_err.message().c_str()); + #else + ROS_WARN("Failed to create per-connection log directory %s: %s", + per_con_log_root_dir.c_str(), + per_con_dir_err.message().c_str()); + #endif + } + } + auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - software_connect_start); if (elapsed.count() >= 60) { @@ -1055,30 +1107,122 @@ static void lidar_device_callback(const lidar_device_info_t* device, bool attach exit(1); } else { - printf("ros_driver_version:%s\n", ros_driver_version); + printf("ros_driver_version:%s, recommended_firmware_version:%s\n", ros_driver_version, recommended_firmware_version); printf("get version success.\n"); } - - if (lidar_get_calib_file(odinDevice, config_dir.c_str())) { + + if (g_save_log) { + if (lidar_enable_encrypted_device_log(const_cast(device), per_con_log_root_dir.c_str())) { + #ifdef ROS2 + RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Enable log failed"); + #else + ROS_ERROR("Enable log failed"); + #endif + lidar_close_device(odinDevice); + lidar_destory_device(odinDevice); + odinDevice = nullptr; + return; + } + #ifdef ROS2 - RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Failed to get calibration file"); + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Encrypted device log enabled at: %s", per_con_log_root_dir.c_str()); #else - ROS_ERROR("Failed to get calibration file"); + ROS_INFO("Encrypted device log enabled at: %s", per_con_log_root_dir.c_str()); + #endif + } else { + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Encrypted device log disabled via configuration"); + #else + ROS_INFO("Encrypted device log disabled via configuration"); #endif - lidar_close_device(odinDevice); - lidar_destory_device(odinDevice); - odinDevice = nullptr; - return; } - - #ifdef ROS2 - RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Successfully retrieved calibration files"); - #else - ROS_INFO("Successfully retrieved calibration files"); - #endif + + bool need_open_device = true; + bool need_configure_device = true; + switch (device->initial_state) { + case LIDAR_DEVICE_NOT_INITIALIZED: + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Device state: not initialized, performing full setup"); + #else + ROS_INFO("Device state: not initialized, performing full setup"); + #endif + break; + case LIDAR_DEVICE_INITIALIZED: + need_open_device = false; + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Device state: initialized, skip opening device"); + #else + ROS_INFO("Device state: initialized, skip opening device"); + #endif + break; + case LIDAR_DEVICE_STREAMING: + need_open_device = false; + need_configure_device = false; + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Device state: streaming, skip opening and configuring"); + #else + ROS_INFO("Device state: streaming, skip opening and configuring"); + #endif + break; + case LIDAR_DEVICE_STREAM_STOPPED: + need_open_device = false; + need_configure_device = false; + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Device state: stream stopped, resume streaming"); + #else + ROS_INFO("Device state: stream stopped, resume streaming"); + #endif + break; + default: + #ifdef ROS2 + RCLCPP_WARN(rclcpp::get_logger("device_cb"), "Unknown device initial state: %d", device->initial_state); + #else + ROS_WARN("Unknown device initial state: %d", device->initial_state); + #endif + break; + } + + if (need_open_device) { + if (lidar_open_device(odinDevice)) { + #ifdef ROS2 + RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Open device failed"); + #else + ROS_ERROR("Open device failed"); + #endif + lidar_destory_device(odinDevice); + odinDevice = nullptr; + return; + } + } std::string calib_config = config_dir + "/calib.yaml"; calib_file_ = calib_config; + if (need_configure_device) { + if (lidar_get_calib_file(odinDevice, config_dir.c_str())) { + #ifdef ROS2 + RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Failed to get calibration file"); + #else + ROS_ERROR("Failed to get calibration file"); + #endif + lidar_close_device(odinDevice); + lidar_destory_device(odinDevice); + odinDevice = nullptr; + return; + } + + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Successfully retrieved calibration files"); + #else + ROS_INFO("Successfully retrieved calibration files"); + #endif + } else { + #ifdef ROS2 + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Skipping calibration retrieval for current device state"); + #else + ROS_INFO("Skipping calibration retrieval for current device state"); + #endif + } + if (std::filesystem::exists(calib_config)) { g_renderer = std::make_shared(); if (g_renderer->init(calib_config)) { @@ -1102,24 +1246,32 @@ static void lidar_device_callback(const lidar_device_info_t* device, bool attach #endif } - if (lidar_set_mode(odinDevice, type)) { - #ifdef ROS2 - RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Set mode failed"); - #else - ROS_ERROR("Set mode failed"); - #endif - lidar_close_device(odinDevice); - lidar_destory_device(odinDevice); - odinDevice = nullptr; - return; - } + if (need_configure_device) { + if (lidar_set_mode(odinDevice, type)) { + #ifdef ROS2 + RCLCPP_ERROR(rclcpp::get_logger("device_cb"), "Set mode failed"); + #else + ROS_ERROR("Set mode failed"); + #endif + lidar_close_device(odinDevice); + lidar_destory_device(odinDevice); + odinDevice = nullptr; + return; + } - // Apply custom parameters after setting mode - if (g_parser && !g_parser->applyCustomParameters(odinDevice)) { + // Apply custom parameters after setting mode + if (g_parser && !g_parser->applyCustomParameters(odinDevice)) { + #ifdef ROS2 + RCLCPP_WARN(rclcpp::get_logger("device_cb"), "Some custom parameters failed to apply"); + #else + ROS_WARN("Some custom parameters failed to apply"); + #endif + } + } else { #ifdef ROS2 - RCLCPP_WARN(rclcpp::get_logger("device_cb"), "Some custom parameters failed to apply"); + RCLCPP_INFO(rclcpp::get_logger("device_cb"), "Skipping device mode configuration for current state"); #else - ROS_WARN("Some custom parameters failed to apply"); + ROS_INFO("Skipping device mode configuration for current state"); #endif } @@ -1166,20 +1318,7 @@ static void lidar_device_callback(const lidar_device_info_t* device, bool attach return; } - auto con_time = std::chrono::system_clock::now(); - std::time_t t = std::chrono::system_clock::to_time_t(con_time); - std::tm tm{}; - #ifdef _WIN32 - localtime_s(&tm, &t); - #else - localtime_r(&t, &tm); - #endif - char buf[32]; - std::strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", &tm); - std::string folder_name = std::string("Conn_") + std::string(buf); - std::filesystem::path per_con_log_root_dir_ = log_root_dir_ / folder_name; - std::filesystem::create_directories(per_con_log_root_dir_); - std::string dev_status_csv_file_path_ = per_con_log_root_dir_ / "dev_status.csv"; + std::string dev_status_csv_file_path_ = per_con_log_root_dir / "dev_status.csv"; if (dev_status_csv_file) { std::fflush(dev_status_csv_file); @@ -1359,6 +1498,7 @@ int main(int argc, char *argv[]) g_sendimu = get_key_value("sendimu", 1); g_senddtof = get_key_value("senddtof", 1); g_sendodom = get_key_value("sendodom", 1); + g_send_odom_baselink_tf = get_key_value("send_odom_baselink_tf", 0); g_sendcloudslam = get_key_value("sendcloudslam", 0); g_sendcloudrender = get_key_value("sendcloudrender", 1); g_sendrgb_compressed = get_key_value("sendrgbcompressed", 1); @@ -1371,6 +1511,16 @@ int main(int argc, char *argv[]) g_show_camerapose = get_key_value("showcamerapose", 0); g_log_level = get_key_value("log_devel", LOG_LEVEL_INFO); g_strict_usb3_0_check = get_key_value("strict_usb3.0_check", 1); + g_use_host_ros_time = get_key_value("use_host_ros_time", 0); + g_save_log = get_key_value("save_log", 0); + + if (g_use_host_ros_time) { + g_rosNodeControlImpl.setUseHostRosTime(true); + } + + if (g_send_odom_baselink_tf) { + g_rosNodeControlImpl.setSendOdomBaseLinkTF(true); + } auto get_key_str_value = [&](const std::string& key, const std::string& default_value) -> std::string { auto it = keys_w_str_val.find(key);