From 363ad68ddd223779694934c854c8e7e43acdc19e Mon Sep 17 00:00:00 2001 From: mini-1235 Date: Sun, 19 Apr 2026 16:55:33 +0000 Subject: [PATCH] Replace rcpputils::endian with std::endian Signed-off-by: mini-1235 --- cv_bridge/CMakeLists.txt | 7 +---- .../cv_mat_sensor_msgs_image_type_adapter.hpp | 23 ++------------ cv_bridge/package.xml | 2 +- cv_bridge/src/CMakeLists.txt | 7 +++-- cv_bridge/src/cv_bridge.cpp | 10 +++---- cv_bridge/test/test_endian.cpp | 30 +++++++++++++------ image_geometry/CMakeLists.txt | 9 ++---- image_geometry/package.xml | 1 + 8 files changed, 38 insertions(+), 51 deletions(-) diff --git a/cv_bridge/CMakeLists.txt b/cv_bridge/CMakeLists.txt index 942cb0fac..edd33cf53 100644 --- a/cv_bridge/CMakeLists.txt +++ b/cv_bridge/CMakeLists.txt @@ -2,11 +2,7 @@ cmake_minimum_required(VERSION 3.14) project(cv_bridge) find_package(ament_cmake_ros REQUIRED) - -# Default to C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() +find_package(ament_cmake_ros_core REQUIRED) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra) @@ -40,7 +36,6 @@ else() endif() find_package(rclcpp REQUIRED) -find_package(rcpputils REQUIRED) find_package(sensor_msgs REQUIRED) find_package(OpenCV 4 QUIET diff --git a/cv_bridge/include/cv_bridge/cv_mat_sensor_msgs_image_type_adapter.hpp b/cv_bridge/include/cv_bridge/cv_mat_sensor_msgs_image_type_adapter.hpp index 7902304c1..dd9f777f4 100644 --- a/cv_bridge/include/cv_bridge/cv_mat_sensor_msgs_image_type_adapter.hpp +++ b/cv_bridge/include/cv_bridge/cv_mat_sensor_msgs_image_type_adapter.hpp @@ -15,6 +15,7 @@ #ifndef CV_BRIDGE__CV_MAT_SENSOR_MSGS_IMAGE_TYPE_ADAPTER_HPP_ #define CV_BRIDGE__CV_MAT_SENSOR_MSGS_IMAGE_TYPE_ADAPTER_HPP_ +#include #include #include #include @@ -30,26 +31,6 @@ namespace cv_bridge { -namespace detail -{ -// TODO(audrow): Replace with std::endian when C++ 20 is available -// https://en.cppreference.com/w/cpp/types/endian -enum class endian -{ -#ifdef _WIN32 - little = 0, - big = 1, - native = little -#else - little = __ORDER_LITTLE_ENDIAN__, - big = __ORDER_BIG_ENDIAN__, - native = __BYTE_ORDER__ -#endif -}; - -} // namespace detail - - /// A potentially owning, potentially non-owning, container of a cv::Mat and ROS header. /** * The two main use cases for this are publishing user controlled data, and @@ -85,7 +66,7 @@ enum class endian */ class ROSCvMatContainer { - static constexpr bool is_bigendian_system = detail::endian::native == detail::endian::big; + static constexpr bool is_bigendian_system = std::endian::native == std::endian::big; public: using SensorMsgsImageStorageType = std::variant< diff --git a/cv_bridge/package.xml b/cv_bridge/package.xml index fe34f46d8..e1a27dceb 100644 --- a/cv_bridge/package.xml +++ b/cv_bridge/package.xml @@ -18,6 +18,7 @@ ament_cmake_ros python_cmake_module + ament_cmake_ros_core libboost-dev libboost-python-dev @@ -25,7 +26,6 @@ libopencv-dev python3-numpy rclcpp - rcpputils sensor_msgs python3-opencv diff --git a/cv_bridge/src/CMakeLists.txt b/cv_bridge/src/CMakeLists.txt index 76ccfd9f9..80ba482d4 100644 --- a/cv_bridge/src/CMakeLists.txt +++ b/cv_bridge/src/CMakeLists.txt @@ -16,10 +16,10 @@ target_link_libraries(${PROJECT_NAME} PUBLIC opencv_imgproc opencv_imgcodecs rclcpp::rclcpp + ament_cmake_ros_core::ament_ros_defaults ) target_link_libraries(${PROJECT_NAME} PRIVATE - Boost::headers - rcpputils::rcpputils) + Boost::headers) install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} ARCHIVE DESTINATION lib @@ -36,7 +36,8 @@ if(NOT CV_BRIDGE_DISABLE_PYTHON) target_link_libraries(${PROJECT_NAME}_boost PRIVATE ${PROJECT_NAME} ${boost_python_target} - Python3::NumPy) + Python3::NumPy + ament_cmake_ros_core::ament_ros_defaults) target_compile_definitions(${PROJECT_NAME}_boost PRIVATE PYTHON3) if(OpenCV_VERSION_MAJOR VERSION_EQUAL 4) diff --git a/cv_bridge/src/cv_bridge.cpp b/cv_bridge/src/cv_bridge.cpp index 9493d107f..c2e1719fc 100644 --- a/cv_bridge/src/cv_bridge.cpp +++ b/cv_bridge/src/cv_bridge.cpp @@ -40,8 +40,8 @@ #include #include #include -#include "rcpputils/endian.hpp" +#include #include #include #include @@ -299,8 +299,8 @@ cv::Mat matFromImage(const sensor_msgs::msg::Image & source) cv::Mat mat(source.height, source.width, source_type, const_cast(&source.data[0]), source.step); - if ((rcpputils::endian::native == rcpputils::endian::big && source.is_bigendian) || - (rcpputils::endian::native == rcpputils::endian::little && !source.is_bigendian) || + if ((std::endian::native == std::endian::big && source.is_bigendian) || + (std::endian::native == std::endian::little && !source.is_bigendian) || byte_depth == 1) { return mat; @@ -392,7 +392,7 @@ void CvImage::toImageMsg(sensor_msgs::msg::Image & ros_image) const ros_image.height = image.rows; ros_image.width = image.cols; ros_image.encoding = encoding; - ros_image.is_bigendian = (rcpputils::endian::native == rcpputils::endian::big); + ros_image.is_bigendian = (std::endian::native == std::endian::big); ros_image.step = image.cols * image.elemSize(); size_t size = ros_image.step * image.rows; ros_image.data.resize(size); @@ -442,7 +442,7 @@ CvImageConstPtr toCvShare( { // If the encoding different or the endianness different, you have to copy if ((!encoding.empty() && source.encoding != encoding) || (!source.is_bigendian != - (rcpputils::endian::native != rcpputils::endian::big))) + (std::endian::native != std::endian::big))) { return toCvCopy(source, encoding); } diff --git a/cv_bridge/test/test_endian.cpp b/cv_bridge/test/test_endian.cpp index 088091822..2291fd8f3 100644 --- a/cv_bridge/test/test_endian.cpp +++ b/cv_bridge/test/test_endian.cpp @@ -1,12 +1,10 @@ -#include +#include #include #include #include TEST(CvBridgeTest, endianness) { - using namespace boost::endian; - // Create an image of the type opposite to the platform sensor_msgs::msg::Image msg; msg.height = 1; @@ -15,17 +13,31 @@ TEST(CvBridgeTest, endianness) msg.step = 8; msg.data.resize(msg.step); - int32_t * data = reinterpret_cast(&msg.data[0]); + uint8_t * raw = msg.data.data(); // Write 1 and 2 in order, but with an endianness opposite to the platform - if (order::native == order::little) { + if (std::endian::native == std::endian::little) { msg.is_bigendian = true; - *(data++) = native_to_big(static_cast(1)); - *data = native_to_big(static_cast(2)); + raw[0] = 0x00; + raw[1] = 0x00; + raw[2] = 0x00; + raw[3] = 0x01; + + raw[4] = 0x00; + raw[5] = 0x00; + raw[6] = 0x00; + raw[7] = 0x02; } else { msg.is_bigendian = false; - *(data++) = native_to_little(static_cast(1)); - *data = native_to_little(static_cast(2)); + raw[0] = 0x01; + raw[1] = 0x00; + raw[2] = 0x00; + raw[3] = 0x00; + + raw[4] = 0x02; + raw[5] = 0x00; + raw[6] = 0x00; + raw[7] = 0x00; } // Make sure the values are still the same diff --git a/image_geometry/CMakeLists.txt b/image_geometry/CMakeLists.txt index 7c6531ffe..832bb53d5 100644 --- a/image_geometry/CMakeLists.txt +++ b/image_geometry/CMakeLists.txt @@ -3,14 +3,10 @@ project(image_geometry) find_package(ament_cmake_python REQUIRED) find_package(ament_cmake_ros REQUIRED) +find_package(ament_cmake_ros_core REQUIRED) ament_python_install_package(${PROJECT_NAME}) -# Default to C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra) endif() @@ -30,7 +26,8 @@ target_link_libraries(${PROJECT_NAME} PUBLIC opencv_core opencv_highgui opencv_imgproc - ${sensor_msgs_TARGETS}) + ${sensor_msgs_TARGETS} + ament_cmake_ros_core::ament_ros_defaults) install(DIRECTORY include/ DESTINATION include/${PROJECT_NAME}) diff --git a/image_geometry/package.xml b/image_geometry/package.xml index 652c9c241..a4a11836a 100644 --- a/image_geometry/package.xml +++ b/image_geometry/package.xml @@ -18,6 +18,7 @@ ament_cmake_python ament_cmake_ros + ament_cmake_ros_core libopencv-dev sensor_msgs