diff --git a/.gitignore b/.gitignore index db7a09e0..8ffc5fb9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,15 @@ /third_party/osqp/ /third_party/OsqpEigen/ /output + +# Generated development artifacts +compile_commands.json +MUJOCO_LOG.TXT +__pycache__/ +*.py[cod] +*.log + +# Generated plots and vision debug output +/data/*.png +/data/*.svg +/python/vision_servo/red_point.png diff --git a/MUJOCO_LOG.TXT b/MUJOCO_LOG.TXT deleted file mode 100644 index 55930968..00000000 --- a/MUJOCO_LOG.TXT +++ /dev/null @@ -1,6 +0,0 @@ -Fri Jul 24 15:39:05 2026 -ERROR: could not create window - -Fri Jul 24 15:40:37 2026 -ERROR: could not create window - diff --git a/cmvr-es/CMakeLists.txt b/cmvr-es/CMakeLists.txt index 0ff7c443..e49727d0 100644 --- a/cmvr-es/CMakeLists.txt +++ b/cmvr-es/CMakeLists.txt @@ -6,6 +6,8 @@ add_subdirectory(hardware) add_subdirectory(algorithms) add_subdirectory(simulate) add_subdirectory(devices) +add_subdirectory(manager/control_authority_manager) +add_subdirectory(manager/safety_manager) add_subdirectory(manager/device_manager) add_subdirectory(manager/media_source_hub) add_subdirectory(service/quic_edge) diff --git a/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt b/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt new file mode 100644 index 00000000..6e847056 --- /dev/null +++ b/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt @@ -0,0 +1,22 @@ +add_library(ume_legacy_controller SHARED + src/ume_legacy_controller.cpp + src/pinocchio_ume_legacy_model_adapter.cpp +) + +target_include_directories(ume_legacy_controller + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +target_link_libraries(ume_legacy_controller + PRIVATE + pinocchio_default + pinocchio_parsers +) + +add_library( + cmvr_es::algorithms::ume_legacy + ALIAS ume_legacy_controller +) + +install(TARGETS ume_legacy_controller LIBRARY DESTINATION lib) diff --git a/cmvr-es/common/CMakeLists.txt b/cmvr-es/common/CMakeLists.txt index a9e3f852..b34192ff 100644 --- a/cmvr-es/common/CMakeLists.txt +++ b/cmvr-es/common/CMakeLists.txt @@ -28,26 +28,3 @@ target_link_libraries(common PUBLIC add_library(cmvr_es::common ALIAS common) install(TARGETS common LIBRARY DESTINATION lib) - -add_executable(support_functions_test - math/support_functions_test.cpp -) -target_include_directories(support_functions_test PRIVATE ${CMAKE_SOURCE_DIR}/cmvr-es) -target_link_libraries(support_functions_test PRIVATE gtest gtest_main glog) - -#add_executable(image_display_test -# utils/visualization/image_display_test.cpp -#) -# -#target_link_libraries(image_display_test -# PRIVATE -# cmvr_es::common -# cmvr_es::perception -# cmvr_es::device::realsense_camera -# cmvr_es::proto -# glog -# gtest -# gtest_main -# pthread -#) -# diff --git a/cmvr-es/common/types/agv/agv_types.h b/cmvr-es/common/types/agv/agv_types.h index 5c7ef69c..191d7f40 100644 --- a/cmvr-es/common/types/agv/agv_types.h +++ b/cmvr-es/common/types/agv/agv_types.h @@ -2,6 +2,7 @@ #define CMVR_ES_AGV_TYPES_H #include +#include #include #include #include @@ -90,6 +91,14 @@ enum class AgvTaskType { Custom }; +/** + * @brief 固定距离平移使用的距离参考模式。 + */ +enum class AgvTranslationMode { + Odometry = 0, + Localization +}; + /** * @brief AGV 车体坐标系下的平面速度。 * @@ -101,6 +110,20 @@ struct AgvVelocity { double wz{0.0}; }; + + +/** + * @brief AGV 车体坐标系下的固定距离平移参数。 + */ +struct AgvTranslation { + double distance{0.0}; + double vx{0.0}; + double vy{0.0}; + AgvTranslationMode mode{AgvTranslationMode::Odometry}; +}; + + + /** * @brief 导航通用运动约束和执行选项。 * @@ -114,7 +137,14 @@ struct AgvMotionOptions { double reach_distance{0.0}; double reach_angle{0.0}; double speed_ratio{1.0}; - bool asynchronous{true}; + // 导航默认同步阻塞;调用方只有显式设为 true 才在任务接受后立即返回。 + bool asynchronous{false}; + int wait_timeout_ms{0}; + int poll_interval_ms{0}; + int blocked_timeout_ms{0}; + // 不带 RPC 框架依赖的取消检查。同步导航等待期间可由 + // 上层绑定 deadline/cancel;驱动不得在函数返回后保留该回调。 + std::function cancellation_requested; }; /** @@ -220,7 +250,7 @@ struct AgvPathSegment { /** * @brief AGV 扫图过程中产生的数据文件。 * - * content 可保存控制器返回的二进制内容,例如 SRC1100 的 rawmap zip 包。 + * content 可保存控制器返回的二进制内容,例如 SEER Robokit 的 rawmap zip 包。 */ struct AgvMappingDataFile { std::string name; diff --git a/cmvr-es/common/types/arm/arm_types.h b/cmvr-es/common/types/arm/arm_types.h index 4728236c..a4682a77 100644 --- a/cmvr-es/common/types/arm/arm_types.h +++ b/cmvr-es/common/types/arm/arm_types.h @@ -2,6 +2,7 @@ #define CMVR_ES_ARM_TYPES_H #include +#include #include #include @@ -103,6 +104,11 @@ struct JointGroupState { std::vector position; std::vector velocity; std::vector effort; + std::uint64_t sequence{0}; + std::int64_t sample_monotonic_ns{0}; + bool position_valid{false}; + bool velocity_valid{false}; + bool effort_valid{false}; bool validForModel(const RobotModel& model) const { @@ -112,6 +118,8 @@ struct JointGroupState { } }; +// Kept for compatibility with the existing MotorRobotArm protective-stop +// recovery contract while the newer safety framework is integrated. struct JointTrajectoryPoint { double time_s{0.0}; std::vector position; @@ -165,6 +173,11 @@ struct MotionOptions { double jerk{5.0}; std::vector joint_velocity_limits; bool asynchronous{false}; + // Framework-independent cancellation check used by queued synchronous + // motion. Cancellation after device acceptance retains a typed motion + // barrier; the owner must call stopMotion() to confirm physical idle. + // Drivers must not retain this callback after moveJ/moveL returns. + std::function cancellation_requested; }; struct ServoOptions { @@ -173,6 +186,14 @@ struct ServoOptions { double gain{300.0}; }; +struct TorqueServoOptions { + // The UME legacy loop runs at 800 Hz by default. + double period{0.00125}; + // A producer must continuously refresh the latest torque command. A stale + // command latches a fault and disables the actuator chain. + std::uint32_t command_watchdog_ms{20}; +}; + enum class RobotMode { Unknown = 0, Disconnected, @@ -205,6 +226,14 @@ enum class ControlMode { Freedrive }; +enum class JointEffortSource { + Unspecified = 0, + MotorEstimate, + JointSensor, + ForceTorqueSensor, + Observer +}; + struct ArmState { double timestamp{0.0}; RobotMode robot_mode{RobotMode::Unknown}; diff --git a/cmvr-es/common/vision/image_display.h b/cmvr-es/common/vision/image_display.h deleted file mode 100644 index 67b3f781..00000000 --- a/cmvr-es/common/vision/image_display.h +++ /dev/null @@ -1,609 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace cmvr::common { - -/** - * @brief 图像像素坐标。 - * - * 坐标系约定: - * - `u`:图像列坐标,向右为正,单位像素。 - * - `v`:图像行坐标,向下为正,单位像素。 - */ -struct Pixel { - int u{0}; // 图像像素列坐标,单位像素。 - int v{0}; // 图像像素行坐标,单位像素。 -}; - -/** - * @brief BGR 颜色定义。 - */ -struct Color { - uint8_t b{0}; // 蓝色通道,范围 [0, 255]。 - uint8_t g{255}; // 绿色通道,范围 [0, 255]。 - uint8_t r{0}; // 红色通道,范围 [0, 255]。 - - /** - * @brief 转为 OpenCV 的 `cv::Scalar`。 - */ - cv::Scalar toCvScalar() const { - return cv::Scalar(static_cast(b), - static_cast(g), - static_cast(r)); - } - - /** - * @brief 预定义红色。 - */ - static Color red() { return Color{0, 0, 255}; } - - /** - * @brief 预定义绿色。 - */ - static Color green() { return Color{0, 255, 0}; } - - /** - * @brief 预定义蓝色。 - */ - static Color blue() { return Color{255, 0, 0}; } - - /** - * @brief 预定义黄色。 - */ - static Color yellow() { return Color{0, 255, 255}; } - - /** - * @brief 预定义白色。 - */ - static Color white() { return Color{255, 255, 255}; } - - /** - * @brief 预定义黑色。 - */ - static Color black() { return Color{0, 0, 0}; } -}; - -/** - * @brief 图像上的文本叠加配置。 - */ -struct TextOverlay { - std::string text; // 需要显示的字符串内容。 - Pixel position_px{}; // 文本左下角在图像像素坐标系中的位置。 - Color color{Color::green()}; // 文本颜色。 - double font_scale{0.7}; // OpenCV 字体缩放系数。 - int thickness{2}; // 文本线宽,单位像素。 - int font_face{cv::FONT_HERSHEY_SIMPLEX}; // OpenCV 字体类型。 - bool draw_background{false}; // 是否绘制文本背景框。 - Color background_color{Color::black()}; // 文本背景框颜色。 - int background_padding_px{2}; // 文本背景框四周留白,单位像素。 -}; - -/** - * @brief 图像上的点叠加配置。 - */ -struct PointOverlay { - Pixel position_px{}; // 点中心在图像像素坐标系中的位置。 - Color color{Color::red()}; // 点颜色。 - int radius_px{5}; // 圆点半径,单位像素。 - int thickness{2}; // 线宽,`-1` 表示填充。 - std::string label; // 点旁边附带显示的字符串;为空时不显示。 - Pixel label_offset_px{8, -8}; // 标签相对点中心的像素偏移。 - double label_font_scale{0.6}; // 点标签字体缩放系数。 - int label_thickness{2}; // 点标签线宽,单位像素。 -}; - -/** - * @brief 图像上的圆圈叠加配置。 - */ -struct CircleOverlay { - Pixel center_px{}; // 圆心在图像像素坐标系中的位置。 - int radius_px{10}; // 圆半径,单位像素。 - Color color{Color::yellow()}; // 圆圈颜色。 - int thickness{2}; // 圆圈线宽,单位像素,`-1` 表示填充。 -}; - -/** - * @brief 图像上的十字叠加配置。 - */ -struct CrossOverlay { - Pixel center_px{}; // 十字中心在图像像素坐标系中的位置。 - int arm_length_px{8}; // 单侧十字臂长度,单位像素。 - Color color{Color::blue()}; // 十字颜色。 - int thickness{2}; // 十字线宽,单位像素。 -}; - -/** - * @brief 通用图像叠加显示接口。 - * - * 该接口不依赖任何感知或跟踪类,只抽象三类输入: - * - 待显示的图像数据; - * - 文本叠加项; - * - 点叠加项。 - */ -class ImageDisplay { -public: - virtual ~ImageDisplay() = default; - - /** - * @brief 设置窗口名称。 - * @param window_name 显示窗口名称。 - */ - virtual void setWindowName(const std::string& window_name) = 0; - - /** - * @brief 设置待显示的图像。 - * @param image 输入图像,支持灰度图、BGR 图或 BGRA 图。 - */ - virtual void setImage(const cv::Mat& image) = 0; - - /** - * @brief 清空所有叠加项,但保留当前图像。 - */ - virtual void clearOverlays() = 0; - - /** - * @brief 添加文本叠加项。 - * @param overlay 文本叠加配置。 - */ - virtual void showText(const TextOverlay& overlay) = 0; - - /** - * @brief 按位置、字符串、颜色和大小直接添加文本。 - * @param text 需要显示的字符串内容。 - * @param position_px 文本左下角在图像像素坐标系中的位置。 - * @param color 文本颜色。 - * @param font_scale OpenCV 字体缩放系数。 - * @param thickness 文本线宽,单位像素。 - */ - virtual void showText(const std::string& text, - const Pixel& position_px, - const Color& color, - double font_scale = 0.7, - int thickness = 2) = 0; - - /** - * @brief 添加点叠加项。 - * @param overlay 点叠加配置。 - */ - virtual void showPoint(const PointOverlay& overlay) = 0; - - /** - * @brief 按位置、颜色和大小直接添加点。 - * @param position_px 点中心在图像像素坐标系中的位置。 - * @param color 点颜色。 - * @param radius_px 圆点半径,单位像素。 - * @param thickness 线宽,`-1` 表示填充。 - * @param label 点旁边附带显示的字符串;为空时不显示。 - */ - virtual void showPoint(const Pixel& position_px, - const Color& color, - int radius_px = 5, - int thickness = 2, - const std::string& label = {}) = 0; - - /** - * @brief 显示圆圈叠加项。 - * @param overlay 圆圈叠加配置。 - */ - virtual void showCircle(const CircleOverlay& overlay) = 0; - - /** - * @brief 按位置、半径、颜色和线宽直接显示圆圈。 - * @param center_px 圆心在图像像素坐标系中的位置。 - * @param radius_px 圆半径,单位像素。 - * @param color 圆圈颜色。 - * @param thickness 圆圈线宽,单位像素,`-1` 表示填充。 - */ - virtual void showCircle(const Pixel& center_px, - int radius_px, - const Color& color, - int thickness = 2) = 0; - - /** - * @brief 显示十字叠加项。 - * @param overlay 十字叠加配置。 - */ - virtual void showCross(const CrossOverlay& overlay) = 0; - - /** - * @brief 按位置、尺寸、颜色和线宽直接显示十字。 - * @param center_px 十字中心在图像像素坐标系中的位置。 - * @param arm_length_px 单侧十字臂长度,单位像素。 - * @param color 十字颜色。 - * @param thickness 十字线宽,单位像素。 - */ - virtual void showCross(const Pixel& center_px, - int arm_length_px, - const Color& color, - int thickness = 2) = 0; - - /** - * @brief 判断当前是否已有待显示图像。 - */ - virtual bool hasImage() const = 0; - - /** - * @brief 将当前图像和叠加项渲染到输出图像。 - * @param rendered_image 输出的渲染结果图像,BGR 三通道。 - * @return 渲染成功返回 `true`。 - */ - virtual bool render(cv::Mat& rendered_image) const = 0; - - /** - * @brief 显示当前渲染结果。 - * @param wait_key_ms `cv::waitKey` 等待时间,单位毫秒。 - * @return 返回 `cv::waitKey` 的按键值;若没有可显示图像则返回 `-1`。 - */ - virtual int show(int wait_key_ms = 1) = 0; - - /** - * @brief 关闭显示窗口。 - */ - virtual void close() = 0; -}; - -/** - * @brief 基于 OpenCV HighGUI 的图像叠加显示实现。 - */ -class OpenCvImageCvDisplay final : public ImageDisplay { -public: - /** - * @brief 构造显示器。 - * @param window_name 显示窗口名称。 - */ - explicit OpenCvImageCvDisplay(std::string window_name = "image_overlay") - : window_name_(std::move(window_name)) {} - - /** - * @brief 设置窗口名称。 - * @param window_name 显示窗口名称。 - */ - void setWindowName(const std::string& window_name) override { - window_name_ = window_name; - } - - /** - * @brief 设置待显示图像。 - * @param image 输入图像,支持灰度图、BGR 图或 BGRA 图。 - */ - void setImage(const cv::Mat& image) override { - image_ = image.clone(); - } - - /** - * @brief 清空所有叠加项,但保留当前图像。 - */ - void clearOverlays() override { - texts_.clear(); - points_.clear(); - circles_.clear(); - crosses_.clear(); - } - - /** - * @brief 添加文本叠加项。 - * @param overlay 文本叠加配置。 - */ - void showText(const TextOverlay& overlay) override { - texts_.push_back(overlay); - } - - /** - * @brief 按位置、字符串、颜色和大小直接添加文本。 - * @param text 需要显示的字符串内容。 - * @param position_px 文本左下角在图像像素坐标系中的位置。 - * @param color 文本颜色。 - * @param font_scale OpenCV 字体缩放系数。 - * @param thickness 文本线宽,单位像素。 - */ - void showText(const std::string& text, - const Pixel& position_px, - const Color& color, - double font_scale = 0.7, - int thickness = 2) override { - TextOverlay overlay; - overlay.text = text; - overlay.position_px = position_px; - overlay.color = color; - overlay.font_scale = font_scale; - overlay.thickness = thickness; - showText(overlay); - } - - /** - * @brief 添加点叠加项。 - * @param overlay 点叠加配置。 - */ - void showPoint(const PointOverlay& overlay) override { - points_.push_back(overlay); - } - - /** - * @brief 按位置、颜色和大小直接添加点。 - * @param position_px 点中心在图像像素坐标系中的位置。 - * @param color 点颜色。 - * @param radius_px 圆点半径,单位像素。 - * @param thickness 线宽,`-1` 表示填充。 - * @param label 点旁边附带显示的字符串;为空时不显示。 - */ - void showPoint(const Pixel& position_px, - const Color& color, - int radius_px = 5, - int thickness = 2, - const std::string& label = {}) override { - PointOverlay overlay; - overlay.position_px = position_px; - overlay.color = color; - overlay.radius_px = radius_px; - overlay.thickness = thickness; - overlay.label = label; - showPoint(overlay); - } - - /** - * @brief 显示圆圈叠加项。 - * @param overlay 圆圈叠加配置。 - */ - void showCircle(const CircleOverlay& overlay) override { - circles_.push_back(overlay); - } - - /** - * @brief 按位置、半径、颜色和线宽直接显示圆圈。 - * @param center_px 圆心在图像像素坐标系中的位置。 - * @param radius_px 圆半径,单位像素。 - * @param color 圆圈颜色。 - * @param thickness 圆圈线宽,单位像素,`-1` 表示填充。 - */ - void showCircle(const Pixel& center_px, - int radius_px, - const Color& color, - int thickness = 2) override { - CircleOverlay overlay; - overlay.center_px = center_px; - overlay.radius_px = radius_px; - overlay.color = color; - overlay.thickness = thickness; - showCircle(overlay); - } - - /** - * @brief 显示十字叠加项。 - * @param overlay 十字叠加配置。 - */ - void showCross(const CrossOverlay& overlay) override { - crosses_.push_back(overlay); - } - - /** - * @brief 按位置、尺寸、颜色和线宽直接显示十字。 - * @param center_px 十字中心在图像像素坐标系中的位置。 - * @param arm_length_px 单侧十字臂长度,单位像素。 - * @param color 十字颜色。 - * @param thickness 十字线宽,单位像素。 - */ - void showCross(const Pixel& center_px, - int arm_length_px, - const Color& color, - int thickness = 2) override { - CrossOverlay overlay; - overlay.center_px = center_px; - overlay.arm_length_px = arm_length_px; - overlay.color = color; - overlay.thickness = thickness; - showCross(overlay); - } - - /** - * @brief 判断当前是否已有待显示图像。 - */ - bool hasImage() const override { - return !image_.empty(); - } - - /** - * @brief 将当前图像和叠加项渲染到输出图像。 - * @param rendered_image 输出的渲染结果图像,BGR 三通道。 - * @return 渲染成功返回 `true`。 - */ - bool render(cv::Mat& rendered_image) const override { - if (!toBgrImage(image_, rendered_image)) { - return false; - } - - for (const CircleOverlay& overlay : circles_) { - drawCircle(rendered_image, overlay); - } - for (const CrossOverlay& overlay : crosses_) { - drawCross(rendered_image, overlay); - } - for (const PointOverlay& overlay : points_) { - drawPoint(rendered_image, overlay); - } - for (const TextOverlay& overlay : texts_) { - drawText(rendered_image, overlay); - } - return true; - } - - /** - * @brief 显示当前渲染结果。 - * @param wait_key_ms `cv::waitKey` 等待时间,单位毫秒。 - * @return 返回 `cv::waitKey` 的按键值;若没有可显示图像则返回 `-1`。 - */ - int show(int wait_key_ms = 1) override { - cv::Mat rendered_image; - if (!render(rendered_image)) { - return -1; - } - - if (!window_created_) { - cv::namedWindow(window_name_, cv::WINDOW_NORMAL); - window_created_ = true; - } - cv::imshow(window_name_, rendered_image); - return cv::waitKey(wait_key_ms); - } - - /** - * @brief 关闭显示窗口。 - */ - void close() override { - if (!window_created_) { - return; - } - cv::destroyWindow(window_name_); - window_created_ = false; - } - -private: - /** - * @brief 将输入图像转换为可叠加绘制的 BGR 三通道图像。 - * @param input 输入图像。 - * @param output 输出 BGR 图像。 - * @return 转换成功返回 `true`。 - */ - static bool toBgrImage(const cv::Mat& input, cv::Mat& output) { - if (input.empty()) { - return false; - } - - if (input.channels() == 1) { - cv::cvtColor(input, output, cv::COLOR_GRAY2BGR); - return true; - } - if (input.channels() == 3) { - output = input.clone(); - return true; - } - if (input.channels() == 4) { - cv::cvtColor(input, output, cv::COLOR_BGRA2BGR); - return true; - } - return false; - } - - /** - * @brief 在图像上绘制文本叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 文本叠加配置。 - */ - static void drawText(cv::Mat& image, const TextOverlay& overlay) { - const cv::Point origin(overlay.position_px.u, overlay.position_px.v); - const int thickness = std::max(1, overlay.thickness); - const double font_scale = std::max(0.0, overlay.font_scale); - - if (overlay.draw_background) { - int baseline = 0; - const cv::Size text_size = cv::getTextSize(overlay.text, - overlay.font_face, - font_scale, - thickness, - &baseline); - const int pad = std::max(0, overlay.background_padding_px); - const cv::Point top_left(origin.x - pad, origin.y - text_size.height - pad); - const cv::Point bottom_right(origin.x + text_size.width + pad, origin.y + baseline + pad); - cv::rectangle(image, - top_left, - bottom_right, - overlay.background_color.toCvScalar(), - cv::FILLED); - } - - cv::putText(image, - overlay.text, - origin, - overlay.font_face, - font_scale, - overlay.color.toCvScalar(), - thickness, - cv::LINE_AA); - } - - /** - * @brief 在图像上绘制点叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 点叠加配置。 - */ - static void drawPoint(cv::Mat& image, const PointOverlay& overlay) { - const cv::Point center(overlay.position_px.u, overlay.position_px.v); - const int radius = std::max(1, overlay.radius_px); - cv::circle(image, - center, - radius, - overlay.color.toCvScalar(), - overlay.thickness, - cv::LINE_AA); - - if (!overlay.label.empty()) { - TextOverlay label_overlay; - label_overlay.text = overlay.label; - label_overlay.position_px = Pixel{center.x + overlay.label_offset_px.u, - center.y + overlay.label_offset_px.v}; - label_overlay.color = overlay.color; - label_overlay.font_scale = overlay.label_font_scale; - label_overlay.thickness = overlay.label_thickness; - drawText(image, label_overlay); - } - } - - /** - * @brief 在图像上绘制圆圈叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 圆圈叠加配置。 - */ - static void drawCircle(cv::Mat& image, const CircleOverlay& overlay) { - const cv::Point center(overlay.center_px.u, overlay.center_px.v); - const int radius = std::max(1, overlay.radius_px); - const int thickness = (overlay.thickness == 0) ? 1 : overlay.thickness; - cv::circle(image, - center, - radius, - overlay.color.toCvScalar(), - thickness, - cv::LINE_AA); - } - - /** - * @brief 在图像上绘制十字叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 十字叠加配置。 - */ - static void drawCross(cv::Mat& image, const CrossOverlay& overlay) { - const cv::Point center(overlay.center_px.u, overlay.center_px.v); - const int arm_length = std::max(1, overlay.arm_length_px); - const int thickness = std::max(1, overlay.thickness); - const cv::Scalar color = overlay.color.toCvScalar(); - cv::line(image, - cv::Point(center.x - arm_length, center.y), - cv::Point(center.x + arm_length, center.y), - color, - thickness, - cv::LINE_AA); - cv::line(image, - cv::Point(center.x, center.y - arm_length), - cv::Point(center.x, center.y + arm_length), - color, - thickness, - cv::LINE_AA); - } - - std::string window_name_; // 显示窗口名称。 - cv::Mat image_; // 当前待显示图像。 - std::vector texts_; // 当前待绘制的文本叠加列表。 - std::vector points_; // 当前待绘制的点叠加列表。 - std::vector circles_; // 当前待绘制的圆圈叠加列表。 - std::vector crosses_; // 当前待绘制的十字叠加列表。 - bool window_created_{false}; // 显示窗口是否已经创建。 -}; - -} // namespace cmvr::common diff --git a/cmvr-es/common/vision/matplotlibcpp.h b/cmvr-es/common/vision/matplotlibcpp.h deleted file mode 100644 index 06735df4..00000000 --- a/cmvr-es/common/vision/matplotlibcpp.h +++ /dev/null @@ -1,2988 +0,0 @@ -#pragma once - -// Python headers must be included before any system headers, since -// they define _POSIX_C_SOURCE -#include - -#include -#include -#include -#include -#include -#include -#include -#include // requires c++11 support -#include -#include // std::stod - -#ifndef WITHOUT_NUMPY -# define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION -# include - -# ifdef WITH_OPENCV -# include -# endif // WITH_OPENCV - -/* - * A bunch of constants were removed in OpenCV 4 in favour of enum classes, so - * define the ones we need here. - */ -# if CV_MAJOR_VERSION > 3 -# define CV_BGR2RGB cv::COLOR_BGR2RGB -# define CV_BGRA2RGBA cv::COLOR_BGRA2RGBA -# endif -#endif // WITHOUT_NUMPY - -#if PY_MAJOR_VERSION >= 3 -# define PyString_FromString PyUnicode_FromString -# define PyInt_FromLong PyLong_FromLong -# define PyString_FromString PyUnicode_FromString -#endif - - -namespace matplotlibcpp { -namespace detail { - -static std::string s_backend; - -struct _interpreter { - PyObject* s_python_function_arrow; - PyObject *s_python_function_show; - PyObject *s_python_function_close; - PyObject *s_python_function_draw; - PyObject *s_python_function_pause; - PyObject *s_python_function_save; - PyObject *s_python_function_figure; - PyObject *s_python_function_fignum_exists; - PyObject *s_python_function_plot; - PyObject *s_python_function_quiver; - PyObject* s_python_function_contour; - PyObject *s_python_function_semilogx; - PyObject *s_python_function_semilogy; - PyObject *s_python_function_loglog; - PyObject *s_python_function_fill; - PyObject *s_python_function_fill_between; - PyObject *s_python_function_hist; - PyObject *s_python_function_imshow; - PyObject *s_python_function_scatter; - PyObject *s_python_function_boxplot; - PyObject *s_python_function_subplot; - PyObject *s_python_function_subplot2grid; - PyObject *s_python_function_legend; - PyObject *s_python_function_xlim; - PyObject *s_python_function_ion; - PyObject *s_python_function_ginput; - PyObject *s_python_function_ylim; - PyObject *s_python_function_title; - PyObject *s_python_function_axis; - PyObject *s_python_function_axhline; - PyObject *s_python_function_axvline; - PyObject *s_python_function_axvspan; - PyObject *s_python_function_xlabel; - PyObject *s_python_function_ylabel; - PyObject *s_python_function_gca; - PyObject *s_python_function_xticks; - PyObject *s_python_function_yticks; - PyObject* s_python_function_margins; - PyObject *s_python_function_tick_params; - PyObject *s_python_function_grid; - PyObject* s_python_function_cla; - PyObject *s_python_function_clf; - PyObject *s_python_function_errorbar; - PyObject *s_python_function_annotate; - PyObject *s_python_function_tight_layout; - PyObject *s_python_colormap; - PyObject *s_python_empty_tuple; - PyObject *s_python_function_stem; - PyObject *s_python_function_xkcd; - PyObject *s_python_function_text; - PyObject *s_python_function_suptitle; - PyObject *s_python_function_bar; - PyObject *s_python_function_barh; - PyObject *s_python_function_colorbar; - PyObject *s_python_function_subplots_adjust; - PyObject *s_python_function_rcparams; - PyObject *s_python_function_spy; - - /* For now, _interpreter is implemented as a singleton since its currently not possible to have - multiple independent embedded python interpreters without patching the python source code - or starting a separate process for each. [1] - Furthermore, many python objects expect that they are destructed in the same thread as they - were constructed. [2] So for advanced usage, a `kill()` function is provided so that library - users can manually ensure that the interpreter is constructed and destroyed within the - same thread. - - 1: http://bytes.com/topic/python/answers/793370-multiple-independent-python-interpreters-c-c-program - 2: https://github.com/lava/matplotlib-cpp/pull/202#issue-436220256 - */ - - static _interpreter& get() { - return interkeeper(false); - } - - static _interpreter& kill() { - return interkeeper(true); - } - - // Stores the actual singleton object referenced by `get()` and `kill()`. - static _interpreter& interkeeper(bool should_kill) { - static _interpreter ctx; - if (should_kill) - ctx.~_interpreter(); - return ctx; - } - - PyObject* safe_import(PyObject* module, std::string fname) { - PyObject* fn = PyObject_GetAttrString(module, fname.c_str()); - - if (!fn) - throw std::runtime_error(std::string("Couldn't find required function: ") + fname); - - if (!PyFunction_Check(fn)) - throw std::runtime_error(fname + std::string(" is unexpectedly not a PyFunction.")); - - return fn; - } - -private: - -#ifndef WITHOUT_NUMPY -# if PY_MAJOR_VERSION >= 3 - - void *import_numpy() { - import_array(); // initialize C-API - return NULL; - } - -# else - - void import_numpy() { - import_array(); // initialize C-API - } - -# endif -#endif - - _interpreter() { - - // optional but recommended -#if PY_MAJOR_VERSION >= 3 - wchar_t name[] = L"plotting"; -#else - char name[] = "plotting"; -#endif - Py_SetProgramName(name); - Py_Initialize(); - - wchar_t const *dummy_args[] = {L"Python", NULL}; // const is needed because literals must not be modified - wchar_t const **argv = dummy_args; - int argc = sizeof(dummy_args)/sizeof(dummy_args[0])-1; - -#if PY_MAJOR_VERSION >= 3 - PySys_SetArgv(argc, const_cast(argv)); -#else - PySys_SetArgv(argc, (char **)(argv)); -#endif - -#ifndef WITHOUT_NUMPY - import_numpy(); // initialize numpy C-API -#endif - - PyObject* matplotlibname = PyString_FromString("matplotlib"); - PyObject* pyplotname = PyString_FromString("matplotlib.pyplot"); - PyObject* cmname = PyString_FromString("matplotlib.cm"); - PyObject* pylabname = PyString_FromString("pylab"); - if (!pyplotname || !pylabname || !matplotlibname || !cmname) { - throw std::runtime_error("couldnt create string"); - } - - PyObject* matplotlib = PyImport_Import(matplotlibname); - - Py_DECREF(matplotlibname); - if (!matplotlib) { - PyErr_Print(); - throw std::runtime_error("Error loading module matplotlib!"); - } - - // matplotlib.use() must be called *before* pylab, matplotlib.pyplot, - // or matplotlib.backends is imported for the first time - if (!s_backend.empty()) { - PyObject_CallMethod(matplotlib, const_cast("use"), const_cast("s"), s_backend.c_str()); - } - - - - PyObject* pymod = PyImport_Import(pyplotname); - Py_DECREF(pyplotname); - if (!pymod) { throw std::runtime_error("Error loading module matplotlib.pyplot!"); } - - s_python_colormap = PyImport_Import(cmname); - Py_DECREF(cmname); - if (!s_python_colormap) { throw std::runtime_error("Error loading module matplotlib.cm!"); } - - PyObject* pylabmod = PyImport_Import(pylabname); - Py_DECREF(pylabname); - if (!pylabmod) { throw std::runtime_error("Error loading module pylab!"); } - - s_python_function_arrow = safe_import(pymod, "arrow"); - s_python_function_show = safe_import(pymod, "show"); - s_python_function_close = safe_import(pymod, "close"); - s_python_function_draw = safe_import(pymod, "draw"); - s_python_function_pause = safe_import(pymod, "pause"); - s_python_function_figure = safe_import(pymod, "figure"); - s_python_function_fignum_exists = safe_import(pymod, "fignum_exists"); - s_python_function_plot = safe_import(pymod, "plot"); - s_python_function_quiver = safe_import(pymod, "quiver"); - s_python_function_contour = safe_import(pymod, "contour"); - s_python_function_semilogx = safe_import(pymod, "semilogx"); - s_python_function_semilogy = safe_import(pymod, "semilogy"); - s_python_function_loglog = safe_import(pymod, "loglog"); - s_python_function_fill = safe_import(pymod, "fill"); - s_python_function_fill_between = safe_import(pymod, "fill_between"); - s_python_function_hist = safe_import(pymod,"hist"); - s_python_function_scatter = safe_import(pymod,"scatter"); - s_python_function_boxplot = safe_import(pymod,"boxplot"); - s_python_function_subplot = safe_import(pymod, "subplot"); - s_python_function_subplot2grid = safe_import(pymod, "subplot2grid"); - s_python_function_legend = safe_import(pymod, "legend"); - s_python_function_xlim = safe_import(pymod, "xlim"); - s_python_function_ylim = safe_import(pymod, "ylim"); - s_python_function_title = safe_import(pymod, "title"); - s_python_function_axis = safe_import(pymod, "axis"); - s_python_function_axhline = safe_import(pymod, "axhline"); - s_python_function_axvline = safe_import(pymod, "axvline"); - s_python_function_axvspan = safe_import(pymod, "axvspan"); - s_python_function_xlabel = safe_import(pymod, "xlabel"); - s_python_function_ylabel = safe_import(pymod, "ylabel"); - s_python_function_gca = safe_import(pymod, "gca"); - s_python_function_xticks = safe_import(pymod, "xticks"); - s_python_function_yticks = safe_import(pymod, "yticks"); - s_python_function_margins = safe_import(pymod, "margins"); - s_python_function_tick_params = safe_import(pymod, "tick_params"); - s_python_function_grid = safe_import(pymod, "grid"); - s_python_function_ion = safe_import(pymod, "ion"); - s_python_function_ginput = safe_import(pymod, "ginput"); - s_python_function_save = safe_import(pylabmod, "savefig"); - s_python_function_annotate = safe_import(pymod,"annotate"); - s_python_function_cla = safe_import(pymod, "cla"); - s_python_function_clf = safe_import(pymod, "clf"); - s_python_function_errorbar = safe_import(pymod, "errorbar"); - s_python_function_tight_layout = safe_import(pymod, "tight_layout"); - s_python_function_stem = safe_import(pymod, "stem"); - s_python_function_xkcd = safe_import(pymod, "xkcd"); - s_python_function_text = safe_import(pymod, "text"); - s_python_function_suptitle = safe_import(pymod, "suptitle"); - s_python_function_bar = safe_import(pymod,"bar"); - s_python_function_barh = safe_import(pymod, "barh"); - s_python_function_colorbar = PyObject_GetAttrString(pymod, "colorbar"); - s_python_function_subplots_adjust = safe_import(pymod,"subplots_adjust"); - s_python_function_rcparams = PyObject_GetAttrString(pymod, "rcParams"); - s_python_function_spy = PyObject_GetAttrString(pymod, "spy"); -#ifndef WITHOUT_NUMPY - s_python_function_imshow = safe_import(pymod, "imshow"); -#endif - s_python_empty_tuple = PyTuple_New(0); - } - - ~_interpreter() { - Py_Finalize(); - } -}; - -} // end namespace detail - -/// Select the backend -/// -/// **NOTE:** This must be called before the first plot command to have -/// any effect. -/// -/// Mainly useful to select the non-interactive 'Agg' backend when running -/// matplotlibcpp in headless mode, for example on a machine with no display. -/// -/// See also: https://matplotlib.org/2.0.2/api/matplotlib_configuration_api.html#matplotlib.use -inline void backend(const std::string& name) -{ - detail::s_backend = name; -} - -inline bool annotate(std::string annotation, double x, double y) -{ - detail::_interpreter::get(); - - PyObject * xy = PyTuple_New(2); - PyObject * str = PyString_FromString(annotation.c_str()); - - PyTuple_SetItem(xy,0,PyFloat_FromDouble(x)); - PyTuple_SetItem(xy,1,PyFloat_FromDouble(y)); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "xy", xy); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, str); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_annotate, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -namespace detail { - -#ifndef WITHOUT_NUMPY -// Type selector for numpy array conversion -template struct select_npy_type { const static NPY_TYPES type = NPY_NOTYPE; }; //Default -template <> struct select_npy_type { const static NPY_TYPES type = NPY_DOUBLE; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_FLOAT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_BOOL; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT8; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_SHORT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT8; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_USHORT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_ULONG; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; - -// Sanity checks; comment them out or change the numpy type below if you're compiling on -// a platform where they don't apply -static_assert(sizeof(long long) == 8); -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; -static_assert(sizeof(unsigned long long) == 8); -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; - -template -PyObject* get_array(const std::vector& v) -{ - npy_intp vsize = v.size(); - NPY_TYPES type = select_npy_type::type; - if (type == NPY_NOTYPE) { - size_t memsize = v.size()*sizeof(double); - double* dp = static_cast(::malloc(memsize)); - for (size_t i=0; i(varray), NPY_ARRAY_OWNDATA); - return varray; - } - - PyObject* varray = PyArray_SimpleNewFromData(1, &vsize, type, (void*)(v.data())); - return varray; -} - - -template -PyObject* get_2darray(const std::vector<::std::vector>& v) -{ - if (v.size() < 1) throw std::runtime_error("get_2d_array v too small"); - - npy_intp vsize[2] = {static_cast(v.size()), - static_cast(v[0].size())}; - - PyArrayObject *varray = - (PyArrayObject *)PyArray_SimpleNew(2, vsize, NPY_DOUBLE); - - double *vd_begin = static_cast(PyArray_DATA(varray)); - - for (const ::std::vector &v_row : v) { - if (v_row.size() != static_cast(vsize[1])) - throw std::runtime_error("Missmatched array size"); - std::copy(v_row.begin(), v_row.end(), vd_begin); - vd_begin += vsize[1]; - } - - return reinterpret_cast(varray); -} - -#else // fallback if we don't have numpy: copy every element of the given vector - -template -PyObject* get_array(const std::vector& v) -{ - PyObject* list = PyList_New(v.size()); - for(size_t i = 0; i < v.size(); ++i) { - PyList_SetItem(list, i, PyFloat_FromDouble(v.at(i))); - } - return list; -} - -#endif // WITHOUT_NUMPY - -// sometimes, for labels and such, we need string arrays -inline PyObject * get_array(const std::vector& strings) -{ - PyObject* list = PyList_New(strings.size()); - for (std::size_t i = 0; i < strings.size(); ++i) { - PyList_SetItem(list, i, PyString_FromString(strings[i].c_str())); - } - return list; -} - -// not all matplotlib need 2d arrays, some prefer lists of lists -template -PyObject* get_listlist(const std::vector>& ll) -{ - PyObject* listlist = PyList_New(ll.size()); - for (std::size_t i = 0; i < ll.size(); ++i) { - PyList_SetItem(listlist, i, get_array(ll[i])); - } - return listlist; -} - -} // namespace detail - -/// Plot a line through the given x and y data points.. -/// -/// See: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.plot.html -template -bool plot(const std::vector &x, const std::vector &y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -// TODO - it should be possible to make this work by implementing -// a non-numpy alternative for `detail::get_2darray()`. -#ifndef WITHOUT_NUMPY -template -void plot_surface(const std::vector<::std::vector> &x, - const std::vector<::std::vector> &y, - const std::vector<::std::vector> &z, - const std::map &keywords = - std::map(), - const long fig_number=0) -{ - detail::_interpreter::get(); - - // We lazily load the modules here the first time this function is called - // because I'm not sure that we can assume "matplotlib installed" implies - // "mpl_toolkits installed" on all platforms, and we don't want to require - // it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - // using numpy arrays - PyObject *xarray = detail::get_2darray(x); - PyObject *yarray = detail::get_2darray(y); - PyObject *zarray = detail::get_2darray(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "rstride", PyInt_FromLong(1)); - PyDict_SetItemString(kwargs, "cstride", PyInt_FromLong(1)); - - PyObject *python_colormap_coolwarm = PyObject_GetAttrString( - detail::_interpreter::get().s_python_colormap, "coolwarm"); - - PyDict_SetItemString(kwargs, "cmap", python_colormap_coolwarm); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - if (it->first == "linewidth" || it->first == "alpha") { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(std::stod(it->second))); - } else { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - } - - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject( - detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - Py_DECREF(fig_exists); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot_surface = PyObject_GetAttrString(axis, "plot_surface"); - if (!plot_surface) throw std::runtime_error("No surface"); - Py_INCREF(plot_surface); - PyObject *res = PyObject_Call(plot_surface, args, kwargs); - if (!res) throw std::runtime_error("failed surface"); - Py_DECREF(plot_surface); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -void contour(const std::vector<::std::vector> &x, - const std::vector<::std::vector> &y, - const std::vector<::std::vector> &z, - const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - // using numpy arrays - PyObject *xarray = detail::get_2darray(x); - PyObject *yarray = detail::get_2darray(y); - PyObject *zarray = detail::get_2darray(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - PyObject *python_colormap_coolwarm = PyObject_GetAttrString( - detail::_interpreter::get().s_python_colormap, "coolwarm"); - - PyDict_SetItemString(kwargs, "cmap", python_colormap_coolwarm); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_contour, args, kwargs); - if (!res) - throw std::runtime_error("failed contour"); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -void spy(const std::vector<::std::vector> &x, - const double markersize = -1, // -1 for default matplotlib size - const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject *xarray = detail::get_2darray(x); - - PyObject *kwargs = PyDict_New(); - if (markersize != -1) { - PyDict_SetItemString(kwargs, "markersize", PyFloat_FromDouble(markersize)); - } - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *plot_args = PyTuple_New(1); - PyTuple_SetItem(plot_args, 0, xarray); - - PyObject *res = PyObject_Call( - detail::_interpreter::get().s_python_function_spy, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} -#endif // WITHOUT_NUMPY - -template -void plot3(const std::vector &x, - const std::vector &y, - const std::vector &z, - const std::map &keywords = - std::map(), - const long fig_number=0) -{ - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - PyObject *zarray = detail::get_array(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot3 = PyObject_GetAttrString(axis, "plot"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject *res = PyObject_Call(plot3, args, kwargs); - if (!res) throw std::runtime_error("Failed 3D line plot"); - Py_DECREF(plot3); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -bool stem(const std::vector &x, const std::vector &y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = - keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_stem, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) - Py_DECREF(res); - - return res; -} - -template< typename Numeric > -bool fill(const std::vector& x, const std::vector& y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if (res) Py_DECREF(res); - - return res; -} - -template< typename Numeric > -bool fill_between(const std::vector& x, const std::vector& y1, const std::vector& y2, const std::map& keywords) -{ - assert(x.size() == y1.size()); - assert(x.size() == y2.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* y1array = detail::get_array(y1); - PyObject* y2array = detail::get_array(y2); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, y1array); - PyTuple_SetItem(args, 2, y2array); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill_between, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template -bool arrow(Numeric x, Numeric y, Numeric end_x, Numeric end_y, const std::string& fc = "r", - const std::string ec = "k", Numeric head_length = 0.25, Numeric head_width = 0.1625) { - PyObject* obj_x = PyFloat_FromDouble(x); - PyObject* obj_y = PyFloat_FromDouble(y); - PyObject* obj_end_x = PyFloat_FromDouble(end_x); - PyObject* obj_end_y = PyFloat_FromDouble(end_y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "fc", PyString_FromString(fc.c_str())); - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "head_width", PyFloat_FromDouble(head_width)); - PyDict_SetItemString(kwargs, "head_length", PyFloat_FromDouble(head_length)); - - PyObject* plot_args = PyTuple_New(4); - PyTuple_SetItem(plot_args, 0, obj_x); - PyTuple_SetItem(plot_args, 1, obj_y); - PyTuple_SetItem(plot_args, 2, obj_end_x); - PyTuple_SetItem(plot_args, 3, obj_end_y); - - PyObject* res = - PyObject_Call(detail::_interpreter::get().s_python_function_arrow, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) - Py_DECREF(res); - - return res; -} - -template< typename Numeric> -bool hist(const std::vector& y, long bins=10,std::string color="b", - double alpha=1.0, bool cumulative=false) -{ - detail::_interpreter::get(); - - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); - PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - PyDict_SetItemString(kwargs, "cumulative", cumulative ? Py_True : Py_False); - - PyObject* plot_args = PyTuple_New(1); - - PyTuple_SetItem(plot_args, 0, yarray); - - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); - - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -#ifndef WITHOUT_NUMPY -namespace detail { - -inline void imshow(void *ptr, const NPY_TYPES type, const int rows, const int columns, const int colors, const std::map &keywords, PyObject** out) -{ - assert(type == NPY_UINT8 || type == NPY_FLOAT); - assert(colors == 1 || colors == 3 || colors == 4); - - detail::_interpreter::get(); - - // construct args - npy_intp dims[3] = { rows, columns, colors }; - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyArray_SimpleNewFromData(colors == 1 ? 2 : 3, dims, type, ptr)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_imshow, args, kwargs); - Py_DECREF(args); - Py_DECREF(kwargs); - if (!res) - throw std::runtime_error("Call to imshow() failed"); - if (out) - *out = res; - else - Py_DECREF(res); -} - -} // namespace detail - -inline void imshow(const unsigned char *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) -{ - detail::imshow((void *) ptr, NPY_UINT8, rows, columns, colors, keywords, out); -} - -inline void imshow(const float *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) -{ - detail::imshow((void *) ptr, NPY_FLOAT, rows, columns, colors, keywords, out); -} - -#ifdef WITH_OPENCV -void imshow(const cv::Mat &image, const std::map &keywords = {}) -{ - // Convert underlying type of matrix, if needed - cv::Mat image2; - NPY_TYPES npy_type = NPY_UINT8; - switch (image.type() & CV_MAT_DEPTH_MASK) { - case CV_8U: - image2 = image; - break; - case CV_32F: - image2 = image; - npy_type = NPY_FLOAT; - break; - default: - image.convertTo(image2, CV_MAKETYPE(CV_8U, image.channels())); - } - - // If color image, convert from BGR to RGB - switch (image2.channels()) { - case 3: - cv::cvtColor(image2, image2, CV_BGR2RGB); - break; - case 4: - cv::cvtColor(image2, image2, CV_BGRA2RGBA); - } - - detail::imshow(image2.data, npy_type, image2.rows, image2.cols, image2.channels(), keywords); -} -#endif // WITH_OPENCV -#endif // WITHOUT_NUMPY - -template -bool scatter(const std::vector& x, - const std::vector& y, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "s", PyLong_FromLong(s)); - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template - bool scatter_colored(const std::vector& x, - const std::vector& y, - const std::vector& colors, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}) - { - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* colors_array = detail::get_array(colors); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "s", PyLong_FromLong(s)); - PyDict_SetItemString(kwargs, "c", colors_array); - - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; - } - - -template -bool scatter(const std::vector& x, - const std::vector& y, - const std::vector& z, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}, - const long fig_number=0) { - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - PyObject *zarray = detail::get_array(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - Py_DECREF(fig_exists); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot3 = PyObject_GetAttrString(axis, "scatter"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject *res = PyObject_Call(plot3, args, kwargs); - if (!res) throw std::runtime_error("Failed 3D line plot"); - Py_DECREF(plot3); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(fig); - if (res) Py_DECREF(res); - return res; - -} - -template -bool boxplot(const std::vector>& data, - const std::vector& labels = {}, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* listlist = detail::get_listlist(data); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, listlist); - - PyObject* kwargs = PyDict_New(); - - // kwargs needs the labels, if there are (the correct number of) labels - if (!labels.empty() && labels.size() == data.size()) { - PyDict_SetItemString(kwargs, "labels", detail::get_array(labels)); - } - - // take care of the remaining keywords - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -template -bool boxplot(const std::vector& data, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* vector = detail::get_array(data); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, vector); - - PyObject* kwargs = PyDict_New(); - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -template -bool bar(const std::vector & x, - const std::vector & y, - std::string ec = "black", - std::string ls = "-", - double lw = 1.0, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject * xarray = detail::get_array(x); - PyObject * yarray = detail::get_array(y); - - PyObject * kwargs = PyDict_New(); - - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "ls", PyString_FromString(ls.c_str())); - PyDict_SetItemString(kwargs, "lw", PyFloat_FromDouble(lw)); - - for (std::map::const_iterator it = - keywords.begin(); - it != keywords.end(); - ++it) { - PyDict_SetItemString( - kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject * plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject * res = PyObject_Call( - detail::_interpreter::get().s_python_function_bar, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); - - return res; -} - -template -bool bar(const std::vector & y, - std::string ec = "black", - std::string ls = "-", - double lw = 1.0, - const std::map & keywords = {}) -{ - using T = typename std::remove_reference::type::value_type; - - detail::_interpreter::get(); - - std::vector x; - for (std::size_t i = 0; i < y.size(); i++) { x.push_back(i); } - - return bar(x, y, ec, ls, lw, keywords); -} - - -template -bool barh(const std::vector &x, const std::vector &y, std::string ec = "black", std::string ls = "-", double lw = 1.0, const std::map &keywords = { }) { - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - - PyObject *kwargs = PyDict_New(); - - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "ls", PyString_FromString(ls.c_str())); - PyDict_SetItemString(kwargs, "lw", PyFloat_FromDouble(lw)); - - for (std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_barh, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); - - return res; -} - - -inline bool subplots_adjust(const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = - keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(it->second)); - } - - - PyObject* plot_args = PyTuple_New(0); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_subplots_adjust, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template< typename Numeric> -bool named_hist(std::string label,const std::vector& y, long bins=10, std::string color="b", double alpha=1.0) -{ - detail::_interpreter::get(); - - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(label.c_str())); - PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); - PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - - - PyObject* plot_args = PyTuple_New(1); - PyTuple_SetItem(plot_args, 0, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template -bool plot(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool contour(const std::vector& x, const std::vector& y, - const std::vector& z, - const std::map& keywords = {}) { - assert(x.size() == y.size() && x.size() == z.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* zarray = detail::get_array(z); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, zarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = - PyObject_Call(detail::_interpreter::get().s_python_function_contour, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool quiver(const std::vector& x, const std::vector& y, const std::vector& u, const std::vector& w, const std::map& keywords = {}) -{ - assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* uarray = detail::get_array(u); - PyObject* warray = detail::get_array(w); - - PyObject* plot_args = PyTuple_New(4); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, uarray); - PyTuple_SetItem(plot_args, 3, warray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_quiver, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool quiver(const std::vector& x, const std::vector& y, const std::vector& z, const std::vector& u, const std::vector& w, const std::vector& v, const std::map& keywords = {}) -{ - //set up 3d axes stuff - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - //assert sizes match up - assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size() && x.size() == z.size() && x.size() == v.size() && u.size() == v.size()); - - //set up parameters - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* zarray = detail::get_array(z); - PyObject* uarray = detail::get_array(u); - PyObject* warray = detail::get_array(w); - PyObject* varray = detail::get_array(v); - - PyObject* plot_args = PyTuple_New(6); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, zarray); - PyTuple_SetItem(plot_args, 3, uarray); - PyTuple_SetItem(plot_args, 4, warray); - PyTuple_SetItem(plot_args, 5, varray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - //get figure gca to enable 3d projection - PyObject *fig = - PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - //plot our boys bravely, plot them strongly, plot them with a wink and clap - PyObject *plot3 = PyObject_GetAttrString(axis, "quiver"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject* res = PyObject_Call( - plot3, plot_args, kwargs); - if (!res) throw std::runtime_error("Failed 3D plot"); - Py_DECREF(plot3); - Py_DECREF(axis); - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool stem(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_stem, plot_args); - - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool semilogx(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogx, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool semilogy(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogy, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool loglog(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_loglog, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool errorbar(const std::vector &x, const std::vector &y, const std::vector &yerr, const std::map &keywords = {}) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* yerrarray = detail::get_array(yerr); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyDict_SetItemString(kwargs, "yerr", yerrarray); - - PyObject *plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_errorbar, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - - if (res) - Py_DECREF(res); - else - throw std::runtime_error("Call to errorbar() failed."); - - return res; -} - -template -bool named_plot(const std::string& name, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(2); - - PyTuple_SetItem(plot_args, 0, yarray); - PyTuple_SetItem(plot_args, 1, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_semilogx(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogx, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_semilogy(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogy, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_loglog(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_loglog, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool plot(const std::vector& y, const std::string& format = "") -{ - std::vector x(y.size()); - for(size_t i=0; i -bool plot(const std::vector& y, const std::map& keywords) -{ - std::vector x(y.size()); - for(size_t i=0; i -bool stem(const std::vector& y, const std::string& format = "") -{ - std::vector x(y.size()); - for (size_t i = 0; i < x.size(); ++i) x.at(i) = i; - return stem(x, y, format); -} - -template -void text(Numeric x, Numeric y, const std::string& s = "") -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(y)); - PyTuple_SetItem(args, 2, PyString_FromString(s.c_str())); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_text, args); - if(!res) throw std::runtime_error("Call to text() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void colorbar(PyObject* mappable = NULL, const std::map& keywords = {}) -{ - if (mappable == NULL) - throw std::runtime_error("Must call colorbar with PyObject* returned from an image, contour, surface, etc."); - - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, mappable); - - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyFloat_FromDouble(it->second)); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_colorbar, args, kwargs); - if(!res) throw std::runtime_error("Call to colorbar() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - - -inline long figure(long number = -1) -{ - detail::_interpreter::get(); - - PyObject *res; - if (number == -1) - res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, detail::_interpreter::get().s_python_empty_tuple); - else { - assert(number > 0); - - // Make sure interpreter is initialised - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(number)); - res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, args); - Py_DECREF(args); - } - - if(!res) throw std::runtime_error("Call to figure() failed."); - - PyObject* num = PyObject_GetAttrString(res, "number"); - if (!num) throw std::runtime_error("Could not get number attribute of figure object"); - const long figureNumber = PyLong_AsLong(num); - - Py_DECREF(num); - Py_DECREF(res); - - return figureNumber; -} - -inline bool fignum_exists(long number) -{ - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(number)); - PyObject *res = PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, args); - if(!res) throw std::runtime_error("Call to fignum_exists() failed."); - - bool ret = PyObject_IsTrue(res); - Py_DECREF(res); - Py_DECREF(args); - - return ret; -} - -inline void figure_size(size_t w, size_t h) -{ - detail::_interpreter::get(); - - const size_t dpi = 100; - PyObject* size = PyTuple_New(2); - PyTuple_SetItem(size, 0, PyFloat_FromDouble((double)w / dpi)); - PyTuple_SetItem(size, 1, PyFloat_FromDouble((double)h / dpi)); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "figsize", size); - PyDict_SetItemString(kwargs, "dpi", PyLong_FromSize_t(dpi)); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple, kwargs); - - Py_DECREF(kwargs); - - if(!res) throw std::runtime_error("Call to figure_size() failed."); - Py_DECREF(res); -} - -inline void legend() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple); - if(!res) throw std::runtime_error("Call to legend() failed."); - - Py_DECREF(res); -} - -inline void legend(const std::map& keywords) -{ - detail::_interpreter::get(); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple, kwargs); - if(!res) throw std::runtime_error("Call to legend() failed."); - - Py_DECREF(kwargs); - Py_DECREF(res); -} - -template -inline void set_aspect(Numeric ratio) -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(ratio)); - PyObject* kwargs = PyDict_New(); - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *set_aspect = PyObject_GetAttrString(ax, "set_aspect"); - if (!set_aspect) throw std::runtime_error("Attribute set_aspect not found."); - Py_INCREF(set_aspect); - - PyObject *res = PyObject_Call(set_aspect, args, kwargs); - if (!res) throw std::runtime_error("Call to set_aspect() failed."); - Py_DECREF(set_aspect); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); -} - -inline void set_aspect_equal() -{ - // expect ratio == "equal". Leaving error handling to matplotlib. - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyString_FromString("equal")); - PyObject* kwargs = PyDict_New(); - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *set_aspect = PyObject_GetAttrString(ax, "set_aspect"); - if (!set_aspect) throw std::runtime_error("Attribute set_aspect not found."); - Py_INCREF(set_aspect); - - PyObject *res = PyObject_Call(set_aspect, args, kwargs); - if (!res) throw std::runtime_error("Call to set_aspect() failed."); - Py_DECREF(set_aspect); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); -} - -template -void ylim(Numeric left, Numeric right) -{ - detail::_interpreter::get(); - - PyObject* list = PyList_New(2); - PyList_SetItem(list, 0, PyFloat_FromDouble(left)); - PyList_SetItem(list, 1, PyFloat_FromDouble(right)); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, list); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); - if(!res) throw std::runtime_error("Call to ylim() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -template -void xlim(Numeric left, Numeric right) -{ - detail::_interpreter::get(); - - PyObject* list = PyList_New(2); - PyList_SetItem(list, 0, PyFloat_FromDouble(left)); - PyList_SetItem(list, 1, PyFloat_FromDouble(right)); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, list); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); - if(!res) throw std::runtime_error("Call to xlim() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - -inline std::array xlim() -{ - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); - - if(!res) throw std::runtime_error("Call to xlim() failed."); - - Py_DECREF(res); - - PyObject* left = PyTuple_GetItem(res,0); - PyObject* right = PyTuple_GetItem(res,1); - return { PyFloat_AsDouble(left), PyFloat_AsDouble(right) }; -} - - -inline std::array ylim() -{ - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); - - if(!res) throw std::runtime_error("Call to ylim() failed."); - - Py_DECREF(res); - - PyObject* left = PyTuple_GetItem(res,0); - PyObject* right = PyTuple_GetItem(res,1); - return { PyFloat_AsDouble(left), PyFloat_AsDouble(right) }; -} - -template -inline void xticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) -{ - assert(labels.size() == 0 || ticks.size() == labels.size()); - - detail::_interpreter::get(); - - // using numpy array - PyObject* ticksarray = detail::get_array(ticks); - - PyObject* args; - if(labels.size() == 0) { - // construct positional args - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, ticksarray); - } else { - // make tuple of tick labels - PyObject* labelstuple = PyTuple_New(labels.size()); - for (size_t i = 0; i < labels.size(); i++) - PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); - - // construct positional args - args = PyTuple_New(2); - PyTuple_SetItem(args, 0, ticksarray); - PyTuple_SetItem(args, 1, labelstuple); - } - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xticks, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(!res) throw std::runtime_error("Call to xticks() failed"); - - Py_DECREF(res); -} - -template -inline void xticks(const std::vector &ticks, const std::map& keywords) -{ - xticks(ticks, {}, keywords); -} - -template -inline void yticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) -{ - assert(labels.size() == 0 || ticks.size() == labels.size()); - - detail::_interpreter::get(); - - // using numpy array - PyObject* ticksarray = detail::get_array(ticks); - - PyObject* args; - if(labels.size() == 0) { - // construct positional args - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, ticksarray); - } else { - // make tuple of tick labels - PyObject* labelstuple = PyTuple_New(labels.size()); - for (size_t i = 0; i < labels.size(); i++) - PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); - - // construct positional args - args = PyTuple_New(2); - PyTuple_SetItem(args, 0, ticksarray); - PyTuple_SetItem(args, 1, labelstuple); - } - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_yticks, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(!res) throw std::runtime_error("Call to yticks() failed"); - - Py_DECREF(res); -} - -template -inline void yticks(const std::vector &ticks, const std::map& keywords) -{ - yticks(ticks, {}, keywords); -} - -template inline void margins(Numeric margin) -{ - // construct positional args - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin)); - - PyObject* res = - PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); - if (!res) - throw std::runtime_error("Call to margins() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -template inline void margins(Numeric margin_x, Numeric margin_y) -{ - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin_x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(margin_y)); - - PyObject* res = - PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); - if (!res) - throw std::runtime_error("Call to margins() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - -inline void tick_params(const std::map& keywords, const std::string axis = "both") -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args; - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyString_FromString(axis.c_str())); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_tick_params, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (!res) throw std::runtime_error("Call to tick_params() failed"); - - Py_DECREF(res); -} - inline void subplot(long nrows, long ncols, long plot_number) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyLong_FromLong(nrows)); - PyTuple_SetItem(args, 1, PyLong_FromLong(ncols)); - PyTuple_SetItem(args, 2, PyLong_FromLong(plot_number)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot, args); - if(!res) throw std::runtime_error("Call to subplot() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - - - -inline void subplot2grid(long nrows, long ncols, long rowid=0, long colid=0, long rowspan=1, long colspan=1) -{ - detail::_interpreter::get(); - - PyObject* shape = PyTuple_New(2); - PyTuple_SetItem(shape, 0, PyLong_FromLong(nrows)); - PyTuple_SetItem(shape, 1, PyLong_FromLong(ncols)); - - PyObject* loc = PyTuple_New(2); - PyTuple_SetItem(loc, 0, PyLong_FromLong(rowid)); - PyTuple_SetItem(loc, 1, PyLong_FromLong(colid)); - - PyObject* args = PyTuple_New(4); - PyTuple_SetItem(args, 0, shape); - PyTuple_SetItem(args, 1, loc); - PyTuple_SetItem(args, 2, PyLong_FromLong(rowspan)); - PyTuple_SetItem(args, 3, PyLong_FromLong(colspan)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot2grid, args); - if(!res) throw std::runtime_error("Call to subplot2grid() failed."); - - Py_DECREF(shape); - Py_DECREF(loc); - Py_DECREF(args); - Py_DECREF(res); -} - -inline void title(const std::string &titlestr, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pytitlestr = PyString_FromString(titlestr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pytitlestr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_title, args, kwargs); - if(!res) throw std::runtime_error("Call to title() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void suptitle(const std::string &suptitlestr, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pysuptitlestr = PyString_FromString(suptitlestr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pysuptitlestr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_suptitle, args, kwargs); - if(!res) throw std::runtime_error("Call to suptitle() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void axis(const std::string &axisstr) -{ - detail::_interpreter::get(); - - PyObject* str = PyString_FromString(axisstr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, str); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_axis, args); - if(!res) throw std::runtime_error("Call to title() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void axhline(double y, double xmin = 0., double xmax = 1., const std::map& keywords = std::map()) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(y)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(xmin)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(xmax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axhline, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void axvline(double x, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(ymin)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvline, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void axvspan(double xmin, double xmax, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) -{ - // construct positional args - PyObject* args = PyTuple_New(4); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(xmin)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(xmax)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymin)); - PyTuple_SetItem(args, 3, PyFloat_FromDouble(ymax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - if (it->first == "linewidth" || it->first == "alpha") { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(std::stod(it->second))); - } else { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvspan, args, kwargs); - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void xlabel(const std::string &str, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xlabel, args, kwargs); - if(!res) throw std::runtime_error("Call to xlabel() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void ylabel(const std::string &str, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_ylabel, args, kwargs); - if(!res) throw std::runtime_error("Call to ylabel() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void set_zlabel(const std::string &str, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *zlabel = PyObject_GetAttrString(ax, "set_zlabel"); - if (!zlabel) throw std::runtime_error("Attribute set_zlabel not found."); - Py_INCREF(zlabel); - - PyObject *res = PyObject_Call(zlabel, args, kwargs); - if (!res) throw std::runtime_error("Call to set_zlabel() failed."); - Py_DECREF(zlabel); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -inline void grid(bool flag) -{ - detail::_interpreter::get(); - - PyObject* pyflag = flag ? Py_True : Py_False; - Py_INCREF(pyflag); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pyflag); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_grid, args); - if(!res) throw std::runtime_error("Call to grid() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void show(const bool block = true) -{ - detail::_interpreter::get(); - - PyObject* res; - if(block) - { - res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_show, - detail::_interpreter::get().s_python_empty_tuple); - } - else - { - PyObject *kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "block", Py_False); - res = PyObject_Call( detail::_interpreter::get().s_python_function_show, detail::_interpreter::get().s_python_empty_tuple, kwargs); - Py_DECREF(kwargs); - } - - - if (!res) throw std::runtime_error("Call to show() failed."); - - Py_DECREF(res); -} - -inline void close() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_close, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to close() failed."); - - Py_DECREF(res); -} - -inline void xkcd() { - detail::_interpreter::get(); - - PyObject* res; - PyObject *kwargs = PyDict_New(); - - res = PyObject_Call(detail::_interpreter::get().s_python_function_xkcd, - detail::_interpreter::get().s_python_empty_tuple, kwargs); - - Py_DECREF(kwargs); - - if (!res) - throw std::runtime_error("Call to show() failed."); - - Py_DECREF(res); -} - -inline void draw() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_draw, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to draw() failed."); - - Py_DECREF(res); -} - -template -inline void pause(Numeric interval) -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(interval)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_pause, args); - if(!res) throw std::runtime_error("Call to pause() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void save(const std::string& filename, const int dpi=0) -{ - detail::_interpreter::get(); - - PyObject* pyfilename = PyString_FromString(filename.c_str()); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pyfilename); - - PyObject* kwargs = PyDict_New(); - - if(dpi > 0) - { - PyDict_SetItemString(kwargs, "dpi", PyLong_FromLong(dpi)); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_save, args, kwargs); - if (!res) throw std::runtime_error("Call to save() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void rcparams(const std::map& keywords = {}) { - detail::_interpreter::get(); - PyObject* args = PyTuple_New(0); - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - if ("text.usetex" == it->first) - PyDict_SetItemString(kwargs, it->first.c_str(), PyLong_FromLong(std::stoi(it->second.c_str()))); - else PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject * update = PyObject_GetAttrString(detail::_interpreter::get().s_python_function_rcparams, "update"); - PyObject * res = PyObject_Call(update, args, kwargs); - if(!res) throw std::runtime_error("Call to rcParams.update() failed."); - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(update); - Py_DECREF(res); -} - -inline void clf() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_clf, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to clf() failed."); - - Py_DECREF(res); -} - -inline void cla() { - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_cla, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) - throw std::runtime_error("Call to cla() failed."); - - Py_DECREF(res); -} - -inline void ion() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_ion, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to ion() failed."); - - Py_DECREF(res); -} - -inline std::vector> ginput(const int numClicks = 1, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(numClicks)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_ginput, args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(args); - if (!res) throw std::runtime_error("Call to ginput() failed."); - - const size_t len = PyList_Size(res); - std::vector> out; - out.reserve(len); - for (size_t i = 0; i < len; i++) { - PyObject *current = PyList_GetItem(res, i); - std::array position; - position[0] = PyFloat_AsDouble(PyTuple_GetItem(current, 0)); - position[1] = PyFloat_AsDouble(PyTuple_GetItem(current, 1)); - out.push_back(position); - } - Py_DECREF(res); - - return out; -} - -// Actually, is there any reason not to call this automatically for every plot? -inline void tight_layout() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_tight_layout, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to tight_layout() failed."); - - Py_DECREF(res); -} - -// Support for variadic plot() and initializer lists: - -namespace detail { - -template -using is_function = typename std::is_function>>::type; - -template -struct is_callable_impl; - -template -struct is_callable_impl -{ - typedef is_function type; -}; // a non-object is callable iff it is a function - -template -struct is_callable_impl -{ - struct Fallback { void operator()(); }; - struct Derived : T, Fallback { }; - - template struct Check; - - template - static std::true_type test( ... ); // use a variadic function to make sure (1) it accepts everything and (2) its always the worst match - - template - static std::false_type test( Check* ); - -public: - typedef decltype(test(nullptr)) type; - typedef decltype(&Fallback::operator()) dtype; - static constexpr bool value = type::value; -}; // an object is callable iff it defines operator() - -template -struct is_callable -{ - // dispatch to is_callable_impl or is_callable_impl depending on whether T is of class type or not - typedef typename is_callable_impl::value, T>::type type; -}; - -template -struct plot_impl { }; - -template<> -struct plot_impl -{ - template - bool operator()(const IterableX& x, const IterableY& y, const std::string& format) - { - detail::_interpreter::get(); - - // 2-phase lookup for distance, begin, end - using std::distance; - using std::begin; - using std::end; - - auto xs = distance(begin(x), end(x)); - auto ys = distance(begin(y), end(y)); - assert(xs == ys && "x and y data must have the same number of elements!"); - - PyObject* xlist = PyList_New(xs); - PyObject* ylist = PyList_New(ys); - PyObject* pystring = PyString_FromString(format.c_str()); - - auto itx = begin(x), ity = begin(y); - for(size_t i = 0; i < xs; ++i) { - PyList_SetItem(xlist, i, PyFloat_FromDouble(*itx++)); - PyList_SetItem(ylist, i, PyFloat_FromDouble(*ity++)); - } - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xlist); - PyTuple_SetItem(plot_args, 1, ylist); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; - } -}; - -template<> -struct plot_impl -{ - template - bool operator()(const Iterable& ticks, const Callable& f, const std::string& format) - { - if(begin(ticks) == end(ticks)) return true; - - // We could use additional meta-programming to deduce the correct element type of y, - // but all values have to be convertible to double anyways - std::vector y; - for(auto x : ticks) y.push_back(f(x)); - return plot_impl()(ticks,y,format); - } -}; - -} // end namespace detail - -// recursion stop for the above -template -bool plot() { return true; } - -template -bool plot(const A& a, const B& b, const std::string& format, Args... args) -{ - return detail::plot_impl::type>()(a,b,format) && plot(args...); -} - -/* - * This group of plot() functions is needed to support initializer lists, i.e. calling - * plot( {1,2,3,4} ) - */ -inline bool plot(const std::vector& x, const std::vector& y, const std::string& format = "") { - return plot(x,y,format); -} - -inline bool plot(const std::vector& y, const std::string& format = "") { - return plot(y,format); -} - -inline bool plot(const std::vector& x, const std::vector& y, const std::map& keywords) { - return plot(x,y,keywords); -} - -/* - * This class allows dynamic plots, ie changing the plotted data without clearing and re-plotting - */ -class Plot -{ -public: - // default initialization with plot label, some data and format - template - Plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") { - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* kwargs = PyDict_New(); - if(name != "") - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - - if(res) - { - line= PyList_GetItem(res, 0); - - if(line) - set_data_fct = PyObject_GetAttrString(line,"set_data"); - else - Py_DECREF(line); - Py_DECREF(res); - } - } - - // shorter initialization with name or format only - // basically calls line, = plot([], []) - Plot(const std::string& name = "", const std::string& format = "") - : Plot(name, std::vector(), std::vector(), format) {} - - template - bool update(const std::vector& x, const std::vector& y) { - assert(x.size() == y.size()); - if(set_data_fct) - { - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_CallObject(set_data_fct, plot_args); - if (res) Py_DECREF(res); - return res; - } - return false; - } - - // clears the plot but keep it available - bool clear() { - return update(std::vector(), std::vector()); - } - - // definitely remove this line - void remove() { - if(line) - { - auto remove_fct = PyObject_GetAttrString(line,"remove"); - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(remove_fct, args); - if (res) Py_DECREF(res); - } - decref(); - } - - ~Plot() { - decref(); - } -private: - - void decref() { - if(line) - Py_DECREF(line); - if(set_data_fct) - Py_DECREF(set_data_fct); - } - - - PyObject* line = nullptr; - PyObject* set_data_fct = nullptr; -}; - -} // end namespace matplotlibcpp \ No newline at end of file diff --git a/cmvr-es/devices/README.md b/cmvr-es/devices/README.md index aaf43066..3668f6b9 100644 --- a/cmvr-es/devices/README.md +++ b/cmvr-es/devices/README.md @@ -36,13 +36,13 @@ config/cmvr_es.pb.txt | 大类 | 抽象接口 | 类别工厂 | 当前可选后端 | | --- | --- | --- | --- | | Camera | [`camera/abstract_camera.h`](camera/abstract_camera.h) | [`camera/camera_factory.h`](camera/camera_factory.h) | UVC、RealSense、Hikvision | -| AGV | [`agv/abstract_agv.h`](agv/abstract_agv.h) | [`agv/agv_factory.h`](agv/agv_factory.h) | MyAgv、SRC1100 | -| RobotArm | [`arm/robot_arm.h`](arm/robot_arm.h) | [`arm/robot_arm_factory.h`](arm/robot_arm_factory.h) | MotorRobotArm、AUBO、Huayan | +| AGV | [`agv/abstract_agv.h`](agv/abstract_agv.h) | [`agv/agv_factory.h`](agv/agv_factory.h) | MyAgv、SEER Robokit | +| RobotArm | [`arm/robot_arm.h`](arm/robot_arm.h) | [`arm/robot_arm_factory.h`](arm/robot_arm_factory.h) | MotorRobotArm、[AUBO](arm/aubo_arm/README.md)、Huayan、UME | | DexHand | [`dexhand/abstract_dexhand.h`](dexhand/abstract_dexhand.h) | [`dexhand/dexhand_factory.h`](dexhand/dexhand_factory.h) | RH56DFTP、PX6AXGen3 | | Microphone | [`microphone/abstract_microphone.h`](microphone/abstract_microphone.h) | [`microphone/microphone_factory.h`](microphone/microphone_factory.h) | FFmpeg | | Speaker | [`speaker/abstract_speaker.h`](speaker/abstract_speaker.h) | [`speaker/speaker_factory.h`](speaker/speaker_factory.h) | FFmpeg | | BioHead | [`biohead/abstract_biohead.h`](biohead/abstract_biohead.h) | DeviceFactory 直接创建 | BioHeadRobot | -| MotorSystem | `motor/motor_system/` | DeviceFactory 直接创建 | CAN/MuJoCo motor group | +| MotorSystem | [`motor/`](motor/README.md) | DeviceFactory 直接创建 | CAN、MuJoCo、EtherCAT | 代码目录存在不等于已经接入配置创建链: @@ -222,7 +222,7 @@ CameraDeviceConfig / AGVDeviceConfig / ... 的外层 id ## 摄像头与麦克风实时流 -设备实现抽象流接口后,由 [`../manager/media_source_hub/`](../manager/media_source_hub/) 适配给 gRPC 和 QUIC,不应在设备后端实现两套协议代码。 +设备实现抽象流接口后,由 [`../manager/media_source_manager/`](../manager/media_source_manager/) 适配给 gRPC 和 QUIC,不应在设备后端实现两套协议代码。 当前 Hub 轨道: @@ -312,7 +312,7 @@ adapter 检测到描述变化后创建新 descriptor,设备后端不要自行 - 满队列覆盖旧数据是实时媒体的预期行为; - `waitEncodedFrame()` 必须有有限 timeout,不能永久阻塞。 -MediaSourceHub Subscription 同样是单消费者对象,不同协议或客户端必须各自订阅。 +MediaSourceManager Subscription 同样是单消费者对象,不同协议或客户端必须各自订阅。 发布后的 `MediaFrame`、`TrackDescriptor` 和 payload 不可再修改。 @@ -334,19 +334,17 @@ MediaSourceHub Subscription 同样是单消费者对象,不同协议或客户 无硬件参考测试: - [`camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp`](camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp) -- [`../manager/media_source_hub/tests/media_source_hub_test.cpp`](../manager/media_source_hub/tests/media_source_hub_test.cpp) ```bash cmake -S . -B build \ -DCMVR_ARCH=x86 \ - -DBUILD_TESTING=ON \ - -DCMVR_MEDIA_SOURCE_HUB_BUILD_TESTS=ON + -DBUILD_TESTING=ON cmake --build build -j"$(nproc)" ctest \ --test-dir build \ - -R 'hikvision_camera_callback_test|media_source_hub_test' \ + -R '^hikvision_camera_callback_test$' \ --output-on-failure ``` diff --git a/cmvr-es/devices/agv/abstract_agv.h b/cmvr-es/devices/agv/abstract_agv.h index b8ad4a61..042bdc0c 100644 --- a/cmvr-es/devices/agv/abstract_agv.h +++ b/cmvr-es/devices/agv/abstract_agv.h @@ -15,6 +15,12 @@ namespace cmvr::device { +enum class AgvActionKind { + NavigateToPose, + NavigateToStation, + FollowPath, +}; + /** * @brief AGV/移动底盘设备抽象基类。 * @@ -29,9 +35,19 @@ public: DeviceKind kind() const noexcept override { return DeviceKind::AGV; } /** - * @brief 获取 AGV 运行状态快照。 + * @brief Whether this backend provides terminal-state and stopped-motion + * confirmation plus bounded cancellation suitable for synchronous + * Action execution. */ - virtual AgvRuntimeState runtimeState() const { return {}; } + virtual bool supportsSynchronousAction(AgvActionKind) const noexcept + { + return false; + } + + /** + * @brief 获取 AGV 运行状态快照。 + */ + virtual AgvRuntimeState runtimeState() const { return {}; } /** * @brief 获取当前导航任务状态。 @@ -54,6 +70,13 @@ public: return AgvResult::failure(AgvErrorCode::UnsupportedCommand, "clearFault not implemented"); } + + virtual AgvResult relocalize(const math::Pose2d& pose) + { + (void)pose; + return AgvResult::failure(AgvErrorCode::UnsupportedCommand,"relocalize not implemented"); + } + /** * @brief 发起到世界/地图位姿的导航任务。 */ @@ -85,11 +108,40 @@ public: /** * @brief 发起显式站点到站点路径导航任务。 */ - virtual AgvResult followPath(const std::vector& path) + virtual AgvResult followPath( + const std::vector& path) { (void)path; return AgvResult::failure(AgvErrorCode::UnsupportedCommand, "followPath not implemented"); } + + + + /** + * @brief 按指定速度执行固定距离平移。 + * + * 返回成功表示控制器已经接受命令,不表示运动已经完成。 + */ + virtual AgvResult translate(const AgvTranslation& translation) + { + (void)translation; + return AgvResult::failure( + AgvErrorCode::UnsupportedCommand, + "translate not implemented"); + } + + /** + * @brief 发起显式站点到站点路径导航任务,并指定同步/异步选项。 + * + * 保留单参数虚函数以兼容已有派生类;旧实现会由本重载转发。 + */ + virtual AgvResult followPath( + const std::vector& path, + const AgvMotionOptions& options) + { + (void)options; + return followPath(path); + } /** * @brief 暂停当前导航任务,如果设备支持。 @@ -138,6 +190,19 @@ public: return setVelocity(AgvVelocity{}); } + /** + * @brief 确认 AGV 已进入可安全释放控制权的停止状态。 + * + * 该接口只在导航任务已终止且底盘速度经过连续采样确认为零后返回 + * 成功;仅收到取消、停止或零速度命令的应答不构成成功。 + */ + virtual AgvResult confirmMotionStopped() + { + return AgvResult::failure( + AgvErrorCode::UnsupportedCommand, + "confirmMotionStopped not implemented"); + } + /** * @brief 查询 AGV 可用地图名称列表。 */ diff --git a/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt b/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt new file mode 100644 index 00000000..2dd0307f --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt @@ -0,0 +1,29 @@ +add_library(seer_robokit_agv SHARED + src/seer_robokit_agv.cpp + src/seer_robokit_transport.cpp + src/seer_robokit_control.cpp + src/seer_robokit_status.cpp + src/seer_robokit_navigation.cpp + src/seer_robokit_navigation_wait.cpp + src/seer_robokit_map.cpp + include/seer_robokit_agv.h + include/seer_robokit_protocol.h + include/seer_robokit_utils.h + include/seer_robokit_navigation_utils.h + include/seer_robokit_pgv_utils.h +) + +target_include_directories(seer_robokit_agv + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/cmvr-es +) + +target_link_libraries(seer_robokit_agv + PUBLIC + cmvr_es::proto + jsoncpp +) + +add_library(cmvr_es::device::seer_robokit_agv ALIAS seer_robokit_agv) +install(TARGETS seer_robokit_agv LIBRARY DESTINATION lib) diff --git a/cmvr-es/devices/agv/seer_robokit/README.md b/cmvr-es/devices/agv/seer_robokit/README.md new file mode 100644 index 00000000..dc20dfd1 --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/README.md @@ -0,0 +1,375 @@ +# 仙工 SEER Robokit AGV 适配器 + +`SeerRobokitAgv` 将仙工 SEER Robokit TCP/IP API 适配为 CMVR 的通用 +`AbstractAGV`/`cmvr.api.AgvService`。厂商命令号、端口、抢占控制权、状态轮询、 +地图格式转换和错误码解析都封装在本目录内。 + +本项目现场使用的控制器型号仍是 SRC1100,所以设备实例 ID 保持为 +`src1100`;它只用于配置关联和 gRPC 路由,不再作为驱动实现名称。后端配置字段 +使用 `seer_robokit_agv`,目录、类、库和测试统一使用 `seer_robokit` / +`SeerRobokitAgv` 命名。 + +从旧版本升级时,外部部署配置必须同步使用 `seer_robokit_agv { ... }`,并把 +配置路径更新为 `devices/agv/seer_robokit.pb.txt`;设备实例 ID 保持不变。程序、 +外部配置和部署脚本需要原子升级,不能把旧字段或旧路径与新二进制混用。 + +返回 [Devices 模块指南](../../README.md) 或 [项目总览](../../../../README.md)。 + +## 代码与配置 + +所有驱动头文件统一放在 `include/`,实现文件统一放在 `src/`;测试源码独立放在 +`tests/`。除 `seer_robokit_agv.h` 外,其余头文件均为驱动内部实现细节。 + +- 公共类声明:[`include/seer_robokit_agv.h`](include/seer_robokit_agv.h) +- 导航轮询工具: + [`include/seer_robokit_navigation_utils.h`](include/seer_robokit_navigation_utils.h) +- PGV 参数转换: + [`include/seer_robokit_pgv_utils.h`](include/seer_robokit_pgv_utils.h) +- 协议常量:[`include/seer_robokit_protocol.h`](include/seer_robokit_protocol.h) +- 通用解析工具:[`include/seer_robokit_utils.h`](include/seer_robokit_utils.h) +- 生命周期和连接:[`src/seer_robokit_agv.cpp`](src/seer_robokit_agv.cpp) +- TCP 帧与收发:[`src/seer_robokit_transport.cpp`](src/seer_robokit_transport.cpp) +- 控制权与受控命令:[`src/seer_robokit_control.cpp`](src/seer_robokit_control.cpp) +- 状态与推送缓存:[`src/seer_robokit_status.cpp`](src/seer_robokit_status.cpp) +- 导航命令:[`src/seer_robokit_navigation.cpp`](src/seer_robokit_navigation.cpp) +- 阻塞等待与停车确认: + [`src/seer_robokit_navigation_wait.cpp`](src/seer_robokit_navigation_wait.cpp) +- 地图和建图:[`src/seer_robokit_map.cpp`](src/seer_robokit_map.cpp) +- 设备配置: + [`../../../config/devices/agv/seer_robokit.pb.txt`](../../../config/devices/agv/seer_robokit.pb.txt) +- DeviceManager 配置: + [`../../../config/manager/device_manager.pb.txt`](../../../config/manager/device_manager.pb.txt) +- gRPC API: + [`../../../../protos/cmvr/api/agv_service.proto`](../../../../protos/cmvr/api/agv_service.proto)、 + [`../../../../protos/cmvr/api/agv_command.proto`](../../../../protos/cmvr/api/agv_command.proto)、 + [`../../../../protos/cmvr/api/agv_utils.proto`](../../../../protos/cmvr/api/agv_utils.proto) + +## 配置和启动 + +现场配置至少需要修改控制器 IP;端口通常保持仙工默认值: + +```textproto +agv { + agvs { + id: "src1100" + seer_robokit_agv { + ip: "192.168.192.5" + port_status: 19204 + port_control: 19205 + port_nav: 19206 + port_config: 19207 + port_other: 19210 + port_push: 19301 + recv_timeout_ms: 1000 + control_nick_name: "cmvr-es" + enable_state_push: true + state_push_interval_ms: 200 + enable_map_update: true + map_update_interval_ms: 1000 + map_update_history_size: 8 + } + } +} +``` + +还要在 `device_manager.pb.txt` 中确认同一个设备 id,并在完成现场安全检查后把 +`enable` 改为 `true`。源码默认配置故意保持关闭。 + +```textproto +devices { + id: "src1100" + type: DEVICE_TYPE_AGV + config_file: "devices/agv/seer_robokit.pb.txt" + enable: true +} +``` + +构建、安装并启动: + +```bash +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j2 +cmake --install build +./output/bin/cmvr_es +``` + +`output/bin/cmvr_es` 默认读取 `output/bin/config/`。修改源码配置后需要重新安装, +或通过程序支持的外部配置入口启动,不能只修改源码文件后继续使用旧的 +`output/` 配置。 + +## 控制器端口和命令 + +| 端口 | 主要用途 | 当前使用的命令 | +| --- | --- | --- | +| `19204` | 状态、站点、地图和建图文件 | `1004`、`1007`、`1020`、`1101`、`1110`、`1300`、`1301`、`1780`、`1800` | +| `19205` | 底盘控制 | `2000`、`2010`、`2022` | +| `19206` | 导航任务 | `3001`、`3002`、`3003`、`3051`、`3066`、`3067` | +| `19207` | 控制权、清错、地图上传下载 | `4005`、`4009`、`4010`、`4011` | +| `19210` | 开始/停止建图 | `6100`、`6101` | +| `19301` | 机器人状态推送 | `9300`/`19300` 配置,`19301` 推送 | + +所有会改变机器人或控制器状态的调用都在 SEER Robokit 子类内部先通过 `4005` +抢权,负载为稳定的 `nick_name`,成功后才发送实际命令。普通命令集中走 +`sendControlledCommand_`;`emergencyStop` 为保证 `2000` 和导航取消之间不被 +插入其他命令,会在同一个控制序列锁内只抢一次权。只读查询不抢权。不要在 +gRPC 客户端另做一套租约逻辑。 + +## gRPC 接口概览 + +默认示例端点为 `127.0.0.1:50052`;远程部署时替换为 CMVR 服务所在主机, +不是 SEER Robokit 原生 TCP 端口。 + +| gRPC 方法 | SEER Robokit 行为 | 说明 | +| --- | --- | --- | +| `getRuntimeState` | 推送缓存,缺失时查询 `1004/1007/1300` | 只读 | +| `getNavigationStatus` | 跟踪任务查询 `1110`,无精确上下文时回退 `1020` | 只读;同步等待另用 `1101` 确认停车 | +| `emergencyStop` | `2000`,再执行 `3003` 或 `3067` | 软件停止,不替代硬件急停 | +| `clearFault` | `4009` | 抢权后发送无请求体命令,清除可恢复故障 | +| `navigateToPose` | `3051` + `freeGo` | 地图绝对位姿,仅双轮差速底盘 | +| `navigateToStation` | `3051` | 站点路径导航;PGV 二次定位也使用此方法 | +| `followPath` | `3066` | 仙工“指定路径导航”,与 `3051` 不同 | +| `pauseNavigation` / `resumeNavigation` | `3001` / `3002` | 导航控制 | +| `cancelNavigation` | `3003`,路径队列使用 `3067` | 取消当前跟踪任务 | +| `setVelocity` / `stopVelocityControl` | `2010` | 车体速度;停止时发送全零速度 | +| `listMaps` / `listStations` | `1300` / `1301` | 只读 | +| `switchMap` | `2022` | 会改变定位所用地图 | +| `uploadMap` / `downloadMap` | `4010` / `4011` | 上传会抢权,下载只读 | +| `startMapping` / `stopMapping` | `6100` / `6101` | 建图控制 | +| `streamMap` | `1780/1800` 加内部解析和缓存 | 对外发送统一 2D/3D 地图,不暴露 `.smap` 原始格式 | + +查询运行状态: + +```bash +grpcurl -plaintext \ + -d '{"header":{"deviceId":"src1100"}}' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/getRuntimeState +``` + +查询导航状态: + +```bash +grpcurl -plaintext \ + -d '{"header":{"deviceId":"src1100"}}' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/getNavigationStatus +``` + +列出地图和当前地图站点: + +```bash +grpcurl -plaintext \ + -d '{"header":{"deviceId":"src1100"}}' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/listMaps + +grpcurl -plaintext \ + -d '{"header":{"deviceId":"src1100"}}' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/listStations +``` + +## 导航的同步语义 + +`navigateToPose`、`navigateToStation` 和 `followPath` 默认同步阻塞。控制器接受 +命令后,适配器继续轮询精确任务状态,并结合 `1101` 状态确认底盘已经停车; +到达、失败、取消、遇障停止或超时后才返回。`waitTimeoutMs` 为 `0` 时使用 +适配器默认值,当前为 10 分钟;`pollIntervalMs` 为 `0` 时当前使用 200 ms。 + +连续观察到障碍阻挡且底盘已经停止后,适配器会主动取消该导航;清理结果不明确 +时还可能发送软件停止。任务不会在障碍消失后由本次调用自动恢复。等待超时、 +RPC cancel 和 deadline 到期也会进入安全取消及停车确认,因此函数返回时间可能 +晚于最初发现障碍或取消请求的时刻。 + +调用方的 gRPC deadline 必须大于预计行程时间和 `waitTimeoutMs`。RPC 被取消或 +deadline 到期时,适配器会进入安全取消/停车确认流程。显式设置 +`"asynchronous":true` 后不会等待任务终态:站点导航和指定路径导航在控制器 +接受后返回;自由导航仍会做最长约 1.5 秒的启动确认。异步成功不代表已经到点。 + +`AgvMotionOptions` 中,SEER Robokit 的 `3051` 导航当前支持: + +| gRPC 字段 | 控制器字段 | 单位 | +| --- | --- | --- | +| `maxSpeed` | `max_speed` | m/s | +| `maxAngularSpeed` | `max_wspeed` | rad/s | +| `maxAcceleration` | `max_acc` | m/s² | +| `maxAngularAcceleration` | `max_wacc` | rad/s² | +| `reachDistance` | `reach_dist` | m | +| `reachAngle` | `reach_angle` | rad | + +`asynchronous`、`waitTimeoutMs` 和 `pollIntervalMs` 由适配器本地执行。 +`speedRatio` 当前没有对应的 SEER Robokit 序列化字段。`followPath` 的运动选项当前只 +控制同步/异步等待、超时和轮询;在没有确认 `3066` 的速度字段前,不会猜测性地 +写入每个路径段。 + +## 固定路径导航的 PGV 二次定位 + +仙工文档 [“路径导航 / 2. 固定路径导航 PGV 二次定位调整”](https://seer-group.feishu.cn/wiki/Q26SwaNoGisuLWk2vCxcPfVWn2e) +说明 PGV 参数是 `3051 / robot_task_gotarget_req` 的顶层可选字段。因此在 CMVR +中应调用 `navigateToStation`,不是 `followPath`。后者对应另一条 +`3066 / 指定路径导航` 协议,现有仙工资料和仓库历史都没有证明 `3066` 支持 +PGV 字段。 + +PGV 参数通过 `adapterParams.values` 传入。protobuf map 的值是字符串, +SEER Robokit 适配器会在任何状态查询、抢权和运动命令之前完成校验,再转换为控制器 +要求的 JSON `bool`/`number`: + +| `adapterParams.values` 键 | 输出 JSON 类型 | 含义 | +| --- | --- | --- | +| `use_pgv` | `bool` | 使用上视 PGV | +| `use_down_pgv` | `bool` | 使用下视 PGV | +| `pgv_adjust_dist` | `number` | 最大调整半径,必须为有限非负数;用于仙工第 3/4 种调整方式 | +| `pgv_adjust_cx` | `number` | 调整范围圆心在二维码坐标系下的 X 偏移;用于第 4 种方式 | +| `pgv_adjust_cy` | `number` | 调整范围圆心在二维码坐标系下的 Y 偏移;用于第 4 种方式 | +| `pgv_x_adjust` | `number` | 仅调整小车 X 方向误差;用于第 2 种方式 | + +所有数字都必须是完整、有限的数字字符串;偏移量允许正负。适配器不臆造 +调整半径上限,也不假定上视和下视一定互斥,这些约束应由实际 PGV 安装、标定和 +当前控制器版本确定。显式的 `"false"` 和 `"0"` 仍会作为原生布尔值和数值 +发给控制器;没有给出的字段不会发送。第 2/3/4 种方式由控制器和站点配置决定, +本接口只传递与所选方式匹配的调整参数。 + +一旦请求中出现任意 PGV 键,适配器只允许同时出现 `source_id`、`task_id` 和 +上述 PGV 字段;`operation`、`jack_height`、脚本名或未知扩展字段都会在状态 +查询和抢权前被拒绝,避免一次 PGV 导航意外夹带顶升、货叉、IO 或脚本动作。 +没有 PGV 键的既有站点导航扩展语义保持不变。 + +上视 PGV 示例。该命令会让机器人导航到 `AP1`,只能在确认地图、站点、PGV +标定、行驶区域和急停人员后执行: + +```bash +grpcurl -plaintext \ + -d '{ + "header":{"deviceId":"src1100"}, + "stationId":"AP1", + "options":{ + "maxSpeed":0.15, + "maxAcceleration":0.15, + "asynchronous":false, + "waitTimeoutMs":300000, + "pollIntervalMs":200 + }, + "adapterParams":{"values":{ + "use_pgv":"true", + "pgv_adjust_dist":"0.3", + "pgv_adjust_cx":"-0.3", + "pgv_adjust_cy":"0" + }} + }' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/navigateToStation +``` + +下视 PGV 使用同一接口,把 `use_down_pgv` 设为字符串 `"true"`;其他调整 +字段是否需要传入取决于现场定位方案。如果控制器版本要求明确起点,可在同一个 +map 中增加 `"source_id":"实际起点站点"`;默认起点为 `SELF_POSITION`。 + +仙工在线文档当前有两处拼写不一致: + +- 代码块出现了损坏字段 `pgv_adjustuse_pgv_dist`;适配器会拒绝它,正确字段是 + `pgv_adjust_dist`; +- 表格写成 `pgv_ajdust_cy`,而示例和仓库旧版序列化代码使用 + `pgv_adjust_cy`。适配器兼容接收前者,但只向控制器输出规范字段 + `pgv_adjust_cy`;两个拼写同时出现会因歧义被拒绝。 + +C++ 调用同样复用通用扩展参数: + +```cpp +cmvr::device::AgvMotionOptions options; +options.max_speed = 0.15; +options.max_acceleration = 0.15; + +cmvr::device::AgvAdapterParams adapter; +adapter.values["use_pgv"] = "true"; +adapter.values["pgv_adjust_dist"] = "0.3"; +adapter.values["pgv_adjust_cx"] = "-0.3"; +adapter.values["pgv_adjust_cy"] = "0"; + +const auto result = agv.navigateToStation("AP1", options, adapter); +``` + +## 其他导航和控制示例 + +自由导航使用地图绝对坐标,不是“相对当前位置移动多少米”。示例只展示请求 +结构,发送前必须读取当前位姿并确认目标在同一地图的安全区域: + +```bash +grpcurl -plaintext \ + -d '{ + "header":{"deviceId":"src1100"}, + "pose":{"x":1.0,"y":0.0,"theta":0.0}, + "options":{"maxSpeed":0.15,"maxAcceleration":0.15} + }' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/navigateToPose +``` + +显式站点路径使用 `3066`: + +```bash +grpcurl -plaintext \ + -d '{ + "header":{"deviceId":"src1100"}, + "path":[ + {"sourceStation":"LM1","targetStation":"LM2"}, + {"sourceStation":"LM2","targetStation":"AP1"} + ] + }' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/followPath +``` + +暂停、继续和取消的请求体直接是 `CommandHeader.Request`,没有外层 `header`: + +```bash +grpcurl -plaintext -d '{"deviceId":"src1100"}' \ + 127.0.0.1:50052 cmvr.api.AgvService/pauseNavigation + +grpcurl -plaintext -d '{"deviceId":"src1100"}' \ + 127.0.0.1:50052 cmvr.api.AgvService/resumeNavigation + +grpcurl -plaintext -d '{"deviceId":"src1100"}' \ + 127.0.0.1:50052 cmvr.api.AgvService/cancelNavigation +``` + +差速底盘的 `vy` 应保持 `0`。低层速度控制不等价于导航,并可能与已有任务 +冲突;只应在专门的速度控制测试流程中使用: + +```bash +grpcurl -plaintext \ + -d '{"header":{"deviceId":"src1100"},"velocity":{"vx":0.05,"vy":0,"wz":0}}' \ + 127.0.0.1:50052 \ + cmvr.api.AgvService/setVelocity + +grpcurl -plaintext -d '{"deviceId":"src1100"}' \ + 127.0.0.1:50052 cmvr.api.AgvService/stopVelocityControl +``` + +## 错误返回 + +控制器响应中的非零 `ret_code` 和 `err_msg` 会保留在 `AgvResult.message`,并由 +gRPC 同时写入 transport status message 和反馈头的 `errorMessage`。非 OK RPC +下,标准客户端通常不会交付响应体,因此跨客户端应以 transport status message +为准,不要依赖反馈头仍然可见。例如: + +```text +SEER Robokit command failed: ret_code=43051, err_msg=planner_rejected_pose +``` + +控制器仅返回“已接收”不等于导航完成;同步接口仍要等待精确任务终态和停车 +确认。若发送后连接中断且控制器是否执行已无法确定,错误会明确提示 outcome +unknown,调用方不能自动重发运动命令,应先查询状态并取消或停止。 + +## 安全边界 + +- 仙工文档明确把 `3051` 定位为任务链或验证测试等单车场景接口;不要把它当作 + 多车调度接口,否则可能出现路径/速度不连续等危险行为。 +- `emergencyStop` 是控制器软件停止,不是功能安全急停;真实系统必须保留可达的 + 硬件急停、安全激光、碰撞条和独立安全链。 +- 首次 PGV 测试应在低速、空载、隔离区域进行,并先核对二维码坐标系、传感器 + 上/下视方向、调整半径和中心偏移的标定值。 +- PGV 同步成功目前能证明精确 `3051` 任务进入终态,并连续确认两次零速度; + 仙工文档没有明确 `Completed` 是否一定覆盖 PGV 二次调整的全部阶段,仍需实机 + 验证后才能据此联动机械臂。异步成功更不代表 PGV 调整完成。 +- 地图切换、地图上传和开始建图会改变控制器状态,也会先抢占控制权;不要和 + 现场调度系统并行操作。 diff --git a/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_agv.h b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_agv.h new file mode 100644 index 00000000..6a61abd4 --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_agv.h @@ -0,0 +1,367 @@ +#ifndef CMVR_ES_SEER_ROBOKIT_AGV_H +#define CMVR_ES_SEER_ROBOKIT_AGV_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cmvr/config/agv_config/agv_config.pb.h" +#include "devices/agv/abstract_agv.h" + +namespace cmvr::device { + +class SeerRobokitAgvTestPeer; + +class SeerRobokitAgv final : public AbstractAGV { +public: + explicit SeerRobokitAgv(const config::SeerRobokitAgvConfig& cfg); + ~SeerRobokitAgv() override; + + std::string typeName() const override { return "SeerRobokitAgv"; } + + bool supportsSynchronousAction(AgvActionKind kind) const noexcept override + { + switch (kind) { + case AgvActionKind::NavigateToPose: + case AgvActionKind::NavigateToStation: + case AgvActionKind::FollowPath: + return true; + } + return false; + } + + bool init() override; + bool start() override; + bool stop() override; + bool update() override; + + AgvRuntimeState runtimeState() const override; + AgvNavigationStatus navigationStatus() const override; + + AgvResult emergencyStop() override; + AgvResult clearFault() override; + AgvResult relocalize(const math::Pose2d& pose) override; + + + AgvResult navigateToPose( + const math::Pose2d& pose, + const AgvMotionOptions& options = {}, + const AgvAdapterParams& adapter_params = AgvAdapterParams{}) override; + AgvResult navigateToStation( + const std::string& station_id, + const AgvMotionOptions& options = {}, + const AgvAdapterParams& adapter_params = AgvAdapterParams{}) override; + AgvResult followPath( + const std::vector& path) override; + AgvResult followPath( + const std::vector& path, + const AgvMotionOptions& options) override; + AgvResult translate(const AgvTranslation& translation) override; + AgvResult pauseNavigation() override; + AgvResult resumeNavigation() override; + AgvResult cancelNavigation() override; + + AgvResult setVelocity(const AgvVelocity& velocity) override; + AgvResult confirmMotionStopped() override; + + AgvResult listMaps(std::vector& maps) const override; + AgvResult listStations(std::vector& stations) const override; + AgvResult switchMap(const std::string& map_name) override; + AgvResult uploadMap(const std::string& map_name, const std::string& content) override; + AgvResult downloadMap(const std::string& map_name, std::string& content) const override; + AgvResult startMapping(const AgvMappingOptions& options = {}) override; + AgvResult getMappingData(int start_index, AgvMappingData& data) const override; + AgvResult getUnifiedMapUpdate( + std::uint64_t after_sequence, + const AgvMapStreamOptions& options, + AgvUnifiedMapUpdate& update) const override; + AgvResult stopMapping() override; + + + +private: + friend class SeerRobokitAgvTestPeer; + + struct Ports { + int status{19204}; + int control{19205}; + int navigation{19206}; + int config{19207}; + int other{19210}; + int push{19301}; + }; + + struct PoseTaskStatus { + bool found{false}; + int state{0}; + int type{0}; + bool type_present{false}; + + double progress{0.0}; + bool progress_present{false}; + + double remaining_distance{0.0}; + bool distance_present{false}; + + std::string closest_target; + std::string source_name; + std::string target_name; + std::string detail; + }; + struct NavigationSnapshot { + int task_status{0}; + int task_type{0}; + bool task_status_present{false}; + bool task_type_present{false}; + bool blocked{false}; + bool blocked_present{false}; + int block_reason{-1}; + std::string block_reason_raw; + bool velocity_present{false}; + double vx{0.0}; + double vy{0.0}; + double w{0.0}; + bool emergency{false}; + std::string target_id; + std::string active_faults; + bool only_recoverable_blocking_faults{false}; + std::string detail; + }; + + enum class CommandTransmissionState { + NotSent, + PossiblySent, + }; + + struct TrackedNavigationContext { + std::string token; + std::vector task_ids; + AgvTaskType type{AgvTaskType::None}; + std::string target_id; + std::vector target_ids; + std::uint64_t navigation_generation{0}; + std::chrono::steady_clock::time_point accepted_at{}; + bool synchronous_wait{false}; + }; + + struct PoseTaskContext { + std::string task_id; + math::Pose2d target{}; + double reach_distance{0.0}; + double reach_angle{0.0}; + std::uint64_t navigation_generation{0}; + std::uint64_t controller_fault_sequence_at_start{0}; + std::uint64_t control_attempt_sequence_at_start{0}; + std::uint64_t controller_fault_channel_epoch_at_start{0}; + }; + + AgvResult connect_(); + AgvResult disconnect_(); + AgvResult emergencyStopTrackedNavigation_( + const TrackedNavigationContext* expected_navigation); + AgvResult connectSocket_(int& sock, int port); + AgvResult ensureOtherSocket_(); + void closeSocket_(int& sock) const; + bool connected_() const; + + AgvResult acquireControl_() const; + AgvResult confirmPoseNavigationStarted_( + const PoseTaskContext& context, + bool accept_paused, + const AgvMotionOptions& options) const; + AgvResult waitForPoseNavigationTerminal_( + const PoseTaskContext& pose_context, + const TrackedNavigationContext& navigation_context, + const AgvMotionOptions& options); + AgvResult waitForTrackedNavigationTerminal_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options); + AgvResult queryNavigationSnapshot_(NavigationSnapshot& snapshot) const; + AgvResult cancelTrackedNavigation_( + const TrackedNavigationContext& context, + std::uint64_t& accepted_generation); + AgvResult waitForCanceledTaskToStop_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options, + const std::string& reason, + bool require_global_stopped = false); + AgvResult failAndCancelTrackedNavigation_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options, + AgvErrorCode error_code, + const std::string& reason); + AgvResult queryPoseTaskStatus_( + const std::string& task_id, + PoseTaskStatus& status) const; + AgvResult queryTaskStatuses_( + const std::vector& task_ids, + std::vector& statuses) const; + bool poseTargetReached_( + const PoseTaskContext& context, + std::string& detail) const; + std::string cachedControllerFaultDetail_( + std::uint64_t after_sequence = 0, + int wait_ms = 0, + std::uint64_t* associated_control_attempt = nullptr) const; + int controllerFaultCaptureGraceMs_() const; + int controllerFaultStateMaxAgeMs_() const; + std::string freeNavigationFaultStateUnavailableDetail_() const; + void rememberPoseTask_(const PoseTaskContext& context) const; + void advancePoseTaskGeneration_( + std::uint64_t navigation_generation, + std::uint64_t control_attempt_sequence) const; + void advancePoseTaskControlAttempt_( + std::uint64_t control_attempt_sequence) const; + void clearPoseTask_(std::uint64_t navigation_generation) const; + void clearPoseTaskIfTaskId_(const std::string& task_id) const; + bool currentPoseTask_(PoseTaskContext& context) const; + void rememberTrackedNavigation_( + const TrackedNavigationContext& context) const; + void advanceTrackedNavigationGeneration_( + std::uint64_t navigation_generation) const; + void clearTrackedNavigation_(std::uint64_t navigation_generation) const; + void clearTrackedNavigationIfToken_(const std::string& token) const; + bool currentTrackedNavigation_( + TrackedNavigationContext& context) const; + AgvResult sendControlledCommand_(int sock, + std::uint16_t command, + const Json::Value& payload, + Json::Value* response, + std::uint64_t* accepted_navigation_generation = nullptr, + std::uint64_t* controller_fault_sequence_at_attempt = nullptr, + std::uint64_t* control_attempt_sequence = nullptr, + PoseTaskContext* pose_context_to_publish = nullptr, + bool reject_if_active_controller_fault = false, + TrackedNavigationContext* navigation_context_to_publish = nullptr, + bool preserve_tracked_navigation = false, + const std::string* expected_navigation_token = nullptr, + const std::function* cancellation_requested = nullptr, + const TrackedNavigationContext* expected_active_navigation = nullptr) const; + AgvResult sendCommand_(int sock, + std::uint16_t command, + const Json::Value& payload, + Json::Value* response, + CommandTransmissionState* transmission_state = nullptr) const; + AgvResult sendCommandRaw_(int sock, + std::uint16_t command, + const Json::Value& payload, + std::string* response_payload, + CommandTransmissionState* transmission_state = nullptr) const; + AgvResult sendCommandNoResponse_(int sock, std::uint16_t command, const Json::Value& payload) const; + AgvResult configurePush_(); + void startPushThread_(); + void stopPushThread_(); + void pushLoop_(); + void invalidateControllerFaultState_(); + AgvRuntimeState queryRuntimeState_() const; + void updateCachedRuntimeState_(const Json::Value& payload); + void startMapUpdateThread_(); + void stopMapUpdateThread_(); + void mapUpdateLoop_(); + AgvResult refreshMapCacheOnce_(const AgvMapStreamOptions& options) const; + AgvResult parseMapFileToUpdates_( + const std::string& file_name, + const std::string& content, + const AgvMapStreamOptions& options, + std::vector& updates) const; + AgvResult parseSeerRobokitMapArchive_( + const std::string& file_name, + const std::string& content, + const AgvMapStreamOptions& options, + std::vector& updates) const; + AgvResult parseSeerRobokitMap2D_( + const std::string& file_name, + const std::string& content, + const AgvMapStreamOptions& options, + AgvUnifiedMapUpdate& update) const; + AgvResult parseSeerRobokitMap3D_( + const std::string& file_name, + const std::string& content, + const AgvMapStreamOptions& options, + AgvUnifiedMapUpdate& update) const; + void cacheMapUpdates_(std::vector updates) const; + bool findCachedMapUpdate_( + std::uint64_t after_sequence, + const AgvMapStreamOptions& options, + AgvUnifiedMapUpdate& update) const; + bool mapUpdateMatches_( + const AgvUnifiedMapUpdate& update, + const AgvMapStreamOptions& options) const; + + static std::vector buildFrame_(std::uint16_t command, const std::string& payload); + static std::string toJsonString_(const Json::Value& value); + static bool parseJson_(const std::string& input, Json::Value& output, std::string& error); + static std::string extractJson_(const std::string& raw); + static AgvResult receiveFrame_(int sock, std::uint16_t& command, std::string& payload); + static void applyMotionOptions_( + Json::Value& payload, + const AgvMotionOptions& options, + bool include_reach_options = true); + static void applyAdapterParams_(Json::Value& payload, const AgvAdapterParams& params); + static AgvResult resultFromResponse_(const Json::Value& response); + + config::SeerRobokitAgvConfig config_; + std::string ip_; + std::string control_nick_name_; + int recv_timeout_ms_{1000}; + Ports ports_; + bool state_push_enabled_{false}; + bool map_update_enabled_{false}; + int map_update_interval_ms_{1000}; + std::size_t map_update_history_size_{8}; + + mutable std::mutex mutex_; + mutable std::mutex status_io_mutex_; + mutable std::mutex control_sequence_mutex_; + mutable std::atomic navigation_generation_{0}; + mutable std::atomic pose_task_sequence_{0}; + mutable std::atomic control_attempt_sequence_{0}; + mutable std::atomic controller_fault_channel_epoch_{0}; + mutable std::mutex pose_task_mutex_; + mutable PoseTaskContext pose_task_context_; + mutable std::mutex tracked_navigation_mutex_; + mutable TrackedNavigationContext tracked_navigation_context_; + mutable int sock_status_{-1}; + mutable int sock_control_{-1}; + mutable int sock_navigation_{-1}; + mutable int sock_config_{-1}; + mutable int sock_other_{-1}; + mutable int sock_push_{-1}; + std::string last_error_; + + std::atomic push_running_{false}; + std::thread push_thread_; + mutable std::mutex runtime_state_mutex_; + mutable std::condition_variable runtime_state_cv_; + AgvRuntimeState cached_runtime_state_; + bool cached_runtime_state_valid_{false}; + std::uint64_t controller_fault_sequence_{0}; + bool controller_fault_state_observed_{false}; + std::chrono::steady_clock::time_point controller_fault_state_observed_at_{}; + std::string active_controller_fault_detail_; + double last_controller_fault_timestamp_{0.0}; + std::string last_controller_fault_detail_; + std::uint64_t last_controller_fault_control_attempt_{0}; + + mutable std::atomic map_update_running_{false}; + mutable std::thread map_update_thread_; + mutable std::mutex map_update_mutex_; + mutable std::condition_variable map_update_cv_; + mutable std::deque cached_map_updates_; + mutable std::uint64_t map_sequence_{0}; + mutable int next_mapping_index_{0}; + mutable std::size_t last_map_content_hash_{0}; + mutable std::string map_session_id_; +}; + +} // namespace cmvr::device + +#endif // CMVR_ES_SEER_ROBOKIT_AGV_H diff --git a/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_navigation_utils.h b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_navigation_utils.h new file mode 100644 index 00000000..acd47b30 --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_navigation_utils.h @@ -0,0 +1,303 @@ +#ifndef CMVR_ES_SEER_ROBOKIT_NAVIGATION_UTILS_H +#define CMVR_ES_SEER_ROBOKIT_NAVIGATION_UTILS_H + +#include +#include +#include +#include +#include +#include +#include + +#include "devices/agv/abstract_agv.h" + +namespace cmvr::device::seer_robokit::navigation { + +constexpr auto kPoseNavigationStartTimeout = std::chrono::milliseconds(1500); +constexpr auto kPoseNavigationPollInterval = std::chrono::milliseconds(50); +constexpr int kPoseNavigationRequiredRunningSamples = 2; +constexpr auto kDefaultNavigationWaitTimeout = + std::chrono::milliseconds(600000); +constexpr auto kDefaultNavigationBlockedTimeout = + std::chrono::milliseconds(60000); +constexpr auto kDefaultNavigationPollInterval = + std::chrono::milliseconds(200); +constexpr auto kMaximumNavigationPollInterval = + std::chrono::milliseconds(5000); +constexpr auto kNavigationCancellationCheckInterval = + std::chrono::milliseconds(50); +constexpr auto kNavigationCancelPollInterval = + std::chrono::milliseconds(100); +constexpr auto kNavigationCancelConfirmationTimeout = + std::chrono::milliseconds(3000); +constexpr int kRequiredCompletedStopSamples = 2; +constexpr double kNavigationStopVelocityTolerance = 0.005; +constexpr int kRobotBlockedFaultCode = 52200; +constexpr int kMinimumControllerFaultCaptureGraceMs = 250; +constexpr int kMaximumControllerFaultCaptureGraceMs = 5000; +constexpr int kDefaultControllerFaultPushIntervalMs = 1000; +constexpr int kControllerFaultPushJitterMs = 100; +constexpr int kMinimumControllerFaultStateMaxAgeMs = 2000; +constexpr int kControllerFaultStateMaxAgeIntervals = 5; +constexpr double kDefaultPoseReachDistance = 0.05; +constexpr double kDefaultPoseReachAngle = 0.10; +constexpr double kTwoPi = 6.28318530717958647692; + +static inline bool exactTaskStateIsActive(const int state) +{ + return state >= 1 && state <= 3; +} + +static inline bool exactTaskStateIsKnownTerminal(const int state) +{ + return state >= 4 && state <= 7; +} + +static inline bool globalTaskStateIsKnownTerminal(const int state) +{ + return state == 0 || exactTaskStateIsKnownTerminal(state); +} + +// Some SRC firmware versions report station navigation as task type 3. +// Exact task ids and target ids remain the primary ownership evidence. +static inline bool exactTrackedNavigationTaskTypeMatches( + const AgvTaskType expected_type, + const int actual_type) +{ + switch (expected_type) { + case AgvTaskType::NavigateToPose: + return actual_type == 1; + case AgvTaskType::NavigateToStation: + case AgvTaskType::FollowPath: + return actual_type == 2 || actual_type == 3; + default: + return false; + } +} + +static inline bool globalNavigationTaskTypeMatches( + const AgvTaskType expected_type, + const int actual_type) +{ + switch (expected_type) { + case AgvTaskType::NavigateToPose: + return actual_type == 1; + case AgvTaskType::NavigateToStation: + return actual_type == 2 || actual_type == 3; + case AgvTaskType::FollowPath: + return actual_type == 3; + default: + return false; + } +} + +static inline double angleDistance(const double lhs, const double rhs) +{ + return std::abs(std::remainder(lhs - rhs, kTwoPi)); +} + +static inline AgvResult withUnknownControllerOutcome(AgvResult result) +{ + const auto code = result.ok() ? AgvErrorCode::CommandFailed : result.code; + std::string detail = result.message.empty() ? "unknown transport or protocol error" : result.message; + detail += + "; SEER Robokit controller outcome is unknown after the command attempt; " + "the command may already have taken effect; do not issue another motion " + "command automatically; query status and cancel or stop first"; + return AgvResult::failure(code, detail); +} + +static inline std::string makePoseTaskId( + const std::string& device_id, + const std::uint64_t task_sequence) +{ + const auto timestamp = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + const std::string prefix = device_id.empty() ? "cmvr-es" : device_id; + return prefix + "_pose_" + std::to_string(timestamp) + + "_" + std::to_string(task_sequence); +} + +static inline std::string makeNavigationTaskId( + const std::string& device_id, + const char* kind, + const std::uint64_t task_sequence) +{ + const auto timestamp = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + const std::string prefix = device_id.empty() ? "cmvr-es" : device_id; + return prefix + "_" + kind + "_" + std::to_string(timestamp) + + "_" + std::to_string(task_sequence); +} + +static inline const char* blockReasonName(const int reason) +{ + switch (reason) { + case 0: + return "ultrasonic"; + case 1: + return "laser"; + case 2: + return "fallingdown"; + case 3: + return "collision"; + case 4: + return "infrared"; + case 5: + return "locked"; + default: + return "unknown"; + } +} + +static inline std::string invalidMotionOption(const AgvMotionOptions& options) +{ + const auto non_negative_error = [](const double value, const char* field) { + if (!std::isfinite(value)) { + return std::string(field) + " must be finite"; + } + if (value < 0.0) { + return std::string(field) + " must be non-negative"; + } + return std::string{}; + }; + + if (auto error = non_negative_error(options.max_speed, "max_speed"); + !error.empty()) return error; + if (auto error = non_negative_error( + options.max_angular_speed, + "max_angular_speed"); + !error.empty()) return error; + if (auto error = non_negative_error( + options.max_acceleration, + "max_acceleration"); + !error.empty()) return error; + if (auto error = non_negative_error( + options.max_angular_acceleration, + "max_angular_acceleration"); + !error.empty()) return error; + if (auto error = non_negative_error( + options.reach_distance, + "reach_distance"); + !error.empty()) return error; + if (auto error = non_negative_error(options.reach_angle, "reach_angle"); + !error.empty()) return error; + if (auto error = non_negative_error(options.speed_ratio, "speed_ratio"); + !error.empty()) return error; + if (options.wait_timeout_ms < 0) { + return "wait_timeout_ms must be non-negative"; + } + if (options.blocked_timeout_ms < 0) { + return "blocked_timeout_ms must be non-negative"; + } + if (options.poll_interval_ms < 0) { + return "poll_interval_ms must be non-negative"; + } + if (options.poll_interval_ms + > kMaximumNavigationPollInterval.count()) { + return "poll_interval_ms must not exceed " + + std::to_string(kMaximumNavigationPollInterval.count()); + } + if (options.wait_timeout_ms > 0 + && options.poll_interval_ms > options.wait_timeout_ms) { + return "poll_interval_ms must not exceed wait_timeout_ms"; + } + return {}; +} + +static inline std::chrono::milliseconds navigationWaitTimeout( + const AgvMotionOptions& options) +{ + return options.wait_timeout_ms > 0 + ? std::chrono::milliseconds(options.wait_timeout_ms) + : kDefaultNavigationWaitTimeout; +} + +static inline std::chrono::milliseconds navigationBlockedTimeout( + const AgvMotionOptions& options) +{ + return options.blocked_timeout_ms > 0 + ? std::chrono::milliseconds(options.blocked_timeout_ms) + : kDefaultNavigationBlockedTimeout; +} + +static inline std::chrono::milliseconds navigationPollInterval( + const AgvMotionOptions& options) +{ + if (options.poll_interval_ms <= 0) { + return kDefaultNavigationPollInterval; + } + return std::chrono::milliseconds( + std::max(options.poll_interval_ms, 20)); +} + +static inline bool navigationCancellationRequested(const AgvMotionOptions& options) +{ + return options.cancellation_requested + && options.cancellation_requested(); +} + +static inline void sleepForNavigationPoll( + const std::chrono::milliseconds poll_interval, + const std::chrono::steady_clock::time_point overall_deadline, + const AgvMotionOptions& options) +{ + const auto poll_deadline = std::min( + overall_deadline, + std::chrono::steady_clock::now() + poll_interval); + while (std::chrono::steady_clock::now() < poll_deadline + && !navigationCancellationRequested(options)) { + const auto remaining = std::chrono::duration_cast( + poll_deadline - std::chrono::steady_clock::now()); + if (remaining <= std::chrono::milliseconds::zero()) { + break; + } + std::this_thread::sleep_for(std::min( + kNavigationCancellationCheckInterval, + remaining)); + } +} + +template +static inline bool navigationStopped(const Snapshot& snapshot) +{ + return snapshot.velocity_present + && std::abs(snapshot.vx) <= kNavigationStopVelocityTolerance + && std::abs(snapshot.vy) <= kNavigationStopVelocityTolerance + && std::abs(snapshot.w) <= kNavigationStopVelocityTolerance; +} + +static inline AgvResult reconciledNavigationResult( + const AgvResult& command_result, + AgvResult terminal_result) +{ + if (command_result.ok()) { + return terminal_result; + } + if (terminal_result.ok()) { + terminal_result.message = + "SEER Robokit navigation completed after an indeterminate command " + "acknowledgment; initial_detail=" + command_result.message; + return terminal_result; + } + terminal_result.message = + "SEER Robokit navigation command acknowledgment was indeterminate: " + + command_result.message + "; status reconciliation: " + + terminal_result.message; + return terminal_result; +} + +static inline bool parseFiniteDouble(const std::string& value, double& parsed) +{ + std::size_t consumed = 0; + try { + parsed = std::stod(value, &consumed); + } catch (...) { + return false; + } + return consumed == value.size() && std::isfinite(parsed); +} + +} // namespace cmvr::device::seer_robokit::navigation + +#endif // CMVR_ES_SEER_ROBOKIT_NAVIGATION_UTILS_H diff --git a/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_protocol.h b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_protocol.h new file mode 100644 index 00000000..e49cba5c --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/include/seer_robokit_protocol.h @@ -0,0 +1,41 @@ +#ifndef CMVR_ES_SEER_ROBOKIT_PROTOCOL_H +#define CMVR_ES_SEER_ROBOKIT_PROTOCOL_H + +#include + +namespace cmvr::device::seer_robokit::protocol { + +constexpr std::uint16_t kRobotStatusLoc = 1004; +constexpr std::uint16_t kRobotStatusBattery = 1007; +constexpr std::uint16_t kRobotStatusAll2 = 1101; +constexpr std::uint16_t kRobotStatusTask = 1020; +constexpr std::uint16_t kRobotStatusTaskPackage = 1110; +constexpr std::uint16_t kRobotStatusMap = 1300; +constexpr std::uint16_t kRobotStatusStation = 1301; +constexpr std::uint16_t kRobotStatusMappingFileList = 1780; +constexpr std::uint16_t kRobotStatusDownloadFile = 1800; +constexpr std::uint16_t kRobotControlStop = 2000; +constexpr std::uint16_t kRobotControlReloc = 2002; +constexpr std::uint16_t kRobotControlMotion = 2010; +constexpr std::uint16_t kRobotControlLoadMap = 2022; +constexpr std::uint16_t kRobotTaskPause = 3001; +constexpr std::uint16_t kRobotTaskResume = 3002; +constexpr std::uint16_t kRobotTaskCancel = 3003; +constexpr std::uint16_t kRobotTaskGoTarget = 3051; +constexpr std::uint16_t kRobotTaskTranslate = 3055; +constexpr std::uint16_t kRobotTaskGoTargetList = 3066; +constexpr std::uint16_t kRobotTaskClearTargetList = 3067; +constexpr std::uint16_t kRobotConfigLock = 4005; +constexpr std::uint16_t kRobotConfigClearFault = 4009; +constexpr std::uint16_t kRobotConfigUploadMap = 4010; +constexpr std::uint16_t kRobotConfigDownloadMap = 4011; +constexpr std::uint16_t kRobotOtherStartMapping = 6100; +constexpr std::uint16_t kRobotOtherStopMapping = 6101; +constexpr std::uint16_t kRobotPushConfigReq = 9300; +constexpr std::uint16_t kRobotPushConfigRes = 19300; +constexpr std::uint16_t kRobotPush = 19301; +constexpr std::uint32_t kMaxFramePayloadBytes = 512U * 1024U * 1024U; + +} // namespace cmvr::device::seer_robokit::protocol + +#endif // CMVR_ES_SEER_ROBOKIT_PROTOCOL_H diff --git a/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_control.cpp b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_control.cpp new file mode 100644 index 00000000..4f0fad3c --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_control.cpp @@ -0,0 +1,375 @@ +#include "seer_robokit_agv.h" +#include "seer_robokit_navigation_utils.h" +#include "seer_robokit_protocol.h" +#include "seer_robokit_utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::device { + +using namespace seer_robokit::navigation; +using namespace seer_robokit::protocol; +using namespace seer_robokit::detail; + +AgvResult SeerRobokitAgv::acquireControl_() const +{ + Json::Value payload(Json::objectValue); + jsonMember(payload, "nick_name") = control_nick_name_; + + Json::Value response; + auto result = sendCommand_(sock_config_, kRobotConfigLock, payload, &response); + return result.ok() ? resultFromResponse_(response) : result; +} + +AgvResult SeerRobokitAgv::sendControlledCommand_( + const int sock, + const std::uint16_t command, + const Json::Value& payload, + Json::Value* response, + std::uint64_t* accepted_navigation_generation, + std::uint64_t* controller_fault_sequence_at_attempt, + std::uint64_t* control_attempt_sequence, + PoseTaskContext* pose_context_to_publish, + const bool reject_if_active_controller_fault, + TrackedNavigationContext* navigation_context_to_publish, + const bool preserve_tracked_navigation, + const std::string* expected_navigation_token, + const std::function* cancellation_requested, + const TrackedNavigationContext* expected_active_navigation) const +{ + const auto canceled_before_send = [cancellation_requested]() { + return cancellation_requested + && *cancellation_requested + && (*cancellation_requested)(); + }; + if (canceled_before_send()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit command was not sent because the caller canceled the " + "operation before control authority was acquired"); + } + + const auto expected_context_is_current = + [this, expected_active_navigation]() { + if (!expected_active_navigation) { + return true; + } + TrackedNavigationContext active_context; + return currentTrackedNavigation_(active_context) + && active_context.token + == expected_active_navigation->token + && active_context.navigation_generation + == expected_active_navigation->navigation_generation + && active_context.type + == expected_active_navigation->type + && navigation_generation_.load(std::memory_order_relaxed) + == expected_active_navigation->navigation_generation; + }; + + // Conditional cancel ownership checks are deliberately performed without + // the control sequencing mutex. A slow 1110/1101 response must never + // prevent emergencyStop() from acquiring authority and sending 2000. + // The exact local token/generation/type is revalidated under the control + // lock both before and after authority acquisition below. + if (expected_active_navigation) { + if (!expected_context_is_current()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit did not start conditional navigation cancel " + "preflight because the tracked task was already replaced or " + "ended"); + } + + std::vector statuses; + const auto exact_result = queryTaskStatuses_( + expected_active_navigation->task_ids, + statuses); + if (!exact_result.ok()) { + return AgvResult::failure( + exact_result.code, + "SEER Robokit did not send the conditional navigation cancel " + "because exact task ownership preflight failed: " + + exact_result.message); + } + const bool all_exact_tasks_terminal = !statuses.empty() + && std::all_of( + statuses.begin(), + statuses.end(), + [](const PoseTaskStatus& status) { + return status.found + && exactTaskStateIsKnownTerminal(status.state); + }); + if (all_exact_tasks_terminal) { + return AgvResult::success(); + } + + const bool exact_task_still_active = std::any_of( + statuses.begin(), + statuses.end(), + [](const PoseTaskStatus& status) { + return status.found + && exactTaskStateIsActive(status.state); + }); + + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit did not send the conditional navigation cancel " + "because 1101 ownership preflight was unavailable: " + + snapshot_result.message); + } + const bool global_active = + exactTaskStateIsActive(snapshot.task_status); + const bool global_type_matches = + globalNavigationTaskTypeMatches( + expected_active_navigation->type, + snapshot.task_type); + const bool target_conflicts = global_active + && !snapshot.target_id.empty() + && !expected_active_navigation->target_ids.empty() + && std::find( + expected_active_navigation->target_ids.begin(), + expected_active_navigation->target_ids.end(), + snapshot.target_id) + == expected_active_navigation->target_ids.end(); + if (global_active + && (!global_type_matches + || target_conflicts)) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit did not send the conditional navigation cancel " + "because 1101 reports another active task: " + + snapshot.detail); + } + + if (!exact_task_still_active) { + const bool clearing_path_queue = + expected_active_navigation->type + == AgvTaskType::FollowPath; + const bool terminal_target_matches = + expected_active_navigation->type + != AgvTaskType::NavigateToStation + || (!snapshot.target_id.empty() + && snapshot.target_id + == expected_active_navigation->target_id); + if (globalTaskStateIsKnownTerminal(snapshot.task_status) + && snapshot.task_status != 0 + && !clearing_path_queue + && global_type_matches + && terminal_target_matches) { + return AgvResult::success(); + } + } + } + + // Keep the permission acquisition and the following write ordered with + // respect to other control RPCs in this process. Channel I/O serialization + // is separate, so this must remain a distinct lock. + std::lock_guard sequence_lock(control_sequence_mutex_); + if (expected_navigation_token) { + TrackedNavigationContext active_context; + const bool has_active_context = + currentTrackedNavigation_(active_context); + const bool expected_context_matches = expected_active_navigation + ? (has_active_context + && active_context.token + == expected_active_navigation->token + && active_context.navigation_generation + == expected_active_navigation->navigation_generation + && active_context.type + == expected_active_navigation->type + && navigation_generation_.load(std::memory_order_relaxed) + == expected_active_navigation->navigation_generation) + : (has_active_context + && active_context.token == *expected_navigation_token); + if (!expected_context_matches) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit did not send the conditional navigation cancel " + "because the tracked task was already replaced or ended; " + "expected_token=" + *expected_navigation_token + + (active_context.token.empty() + ? std::string(", active_token=") + : ", active_token=" + active_context.token)); + } + } + const auto attempt_sequence = + control_attempt_sequence_.fetch_add( + 1, + std::memory_order_relaxed) + 1; + if (control_attempt_sequence) { + *control_attempt_sequence = attempt_sequence; + } + if (pose_context_to_publish) { + pose_context_to_publish->control_attempt_sequence_at_start = + attempt_sequence; + } + + const auto authority = acquireControl_(); + if (!authority.ok()) { + const std::string detail = authority.message.empty() ? "unknown error" : authority.message; + return AgvResult::failure( + authority.code, + "SEER Robokit acquire control authority failed: " + detail); + } + if (expected_active_navigation && !expected_context_is_current()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit did not send the conditional navigation cancel because " + "the tracked token, generation, or type changed while control " + "authority was being acquired"); + } + if (canceled_before_send()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit command was not sent because the caller canceled the " + "operation while control authority was being acquired"); + } + std::string controller_fault_gate_error; + if (controller_fault_sequence_at_attempt + || pose_context_to_publish + || reject_if_active_controller_fault) { + std::lock_guard lock(runtime_state_mutex_); + if (controller_fault_sequence_at_attempt) { + *controller_fault_sequence_at_attempt = + controller_fault_sequence_; + } + if (pose_context_to_publish) { + pose_context_to_publish->controller_fault_sequence_at_start = + controller_fault_sequence_; + pose_context_to_publish + ->controller_fault_channel_epoch_at_start = + controller_fault_channel_epoch_.load( + std::memory_order_relaxed); + } + if (reject_if_active_controller_fault) { + if (!state_push_enabled_) { + controller_fault_gate_error = + "controller fault state is unavailable because state push " + "is disabled"; + } else if (!active_controller_fault_detail_.empty()) { + controller_fault_gate_error = + "the controller reported a fault or invalid fault state: " + + active_controller_fault_detail_; + } else if (!controller_fault_state_observed_) { + controller_fault_gate_error = + "no state push containing fatals/errors has been observed"; + } else { + const auto fault_state_age = + std::chrono::duration_cast( + std::chrono::steady_clock::now() + - controller_fault_state_observed_at_) + .count(); + if (fault_state_age > controllerFaultStateMaxAgeMs_()) { + controller_fault_gate_error = + "the most recent fatals/errors state push is stale " + "(age_ms=" + std::to_string(fault_state_age) + + ", max_age_ms=" + + std::to_string(controllerFaultStateMaxAgeMs_()) + + ")"; + } + } + } + } + if (!controller_fault_gate_error.empty()) { + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation command was not sent because " + + controller_fault_gate_error); + } + if (canceled_before_send()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit command was not sent because the caller canceled the " + "operation before the controller command write"); + } + if (canceled_before_send()) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit command was not sent because the caller canceled the " + "operation immediately before the controller command write"); + } + const auto publish_navigation_generation = + [this, + accepted_navigation_generation, + pose_context_to_publish, + navigation_context_to_publish, + preserve_tracked_navigation]() { + const auto generation = + navigation_generation_.fetch_add( + 1, + std::memory_order_relaxed) + 1; + *accepted_navigation_generation = generation; + if (pose_context_to_publish) { + pose_context_to_publish->navigation_generation = generation; + rememberPoseTask_(*pose_context_to_publish); + } + if (navigation_context_to_publish) { + navigation_context_to_publish->navigation_generation = + generation; + navigation_context_to_publish->accepted_at = + std::chrono::steady_clock::now(); + rememberTrackedNavigation_( + *navigation_context_to_publish); + } else if (preserve_tracked_navigation) { + advanceTrackedNavigationGeneration_(generation); + } else { + clearTrackedNavigation_(generation); + } + }; + CommandTransmissionState transmission_state = + CommandTransmissionState::NotSent; + auto result = sendCommand_( + sock, + command, + payload, + response, + &transmission_state); + if (!result.ok()) { + if (accepted_navigation_generation + && transmission_state + == CommandTransmissionState::PossiblySent) { + // Once the control write has been attempted, a timeout, disconnect, + // wrong response opcode, or malformed JSON cannot prove rejection: + // the controller may already have executed the command. + publish_navigation_generation(); + return withUnknownControllerOutcome(std::move(result)); + } + return result; + } + if (!accepted_navigation_generation) { + return result; + } + if (!response) { + publish_navigation_generation(); + return withUnknownControllerOutcome(AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit cannot confirm navigation command without a response")); + } + if (!hasNumericControllerRetCode(*response)) { + publish_navigation_generation(); + return withUnknownControllerOutcome(resultFromResponse_(*response)); + } + result = resultFromResponse_(*response); + if (!result.ok()) { + return result; + } + + // Advance only after the controller accepted the command, and do it before + // releasing control_sequence_mutex_. This prevents a failed cancel/pause or + // failed authority acquisition from falsely reporting a pose task canceled, + // while preserving the controller's actual command order under concurrency. + publish_navigation_generation(); + return result; +} + +} // namespace cmvr::device diff --git a/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation.cpp b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation.cpp new file mode 100644 index 00000000..57ca85ef --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation.cpp @@ -0,0 +1,1543 @@ +#include "seer_robokit_agv.h" +#include "seer_robokit_navigation_utils.h" +#include "seer_robokit_pgv_utils.h" +#include "seer_robokit_protocol.h" +#include "seer_robokit_utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::device { + +using namespace seer_robokit::navigation; +using namespace seer_robokit::protocol; +using namespace seer_robokit::detail; + +AgvResult SeerRobokitAgv::emergencyStop() +{ + return emergencyStopTrackedNavigation_(nullptr); +} + +AgvResult SeerRobokitAgv::emergencyStopTrackedNavigation_( + const TrackedNavigationContext* expected_navigation) +{ + // This is a controller-level software stop, not a substitute for the + // physical emergency-stop circuit. Keep both stop commands under one + // authority acquisition so no other command from this process can + // interleave between them. + std::lock_guard sequence_lock(control_sequence_mutex_); + TrackedNavigationContext tracked_navigation; + const bool has_tracked_navigation = + currentTrackedNavigation_(tracked_navigation); + if (expected_navigation) { + const bool same_navigation_identity = has_tracked_navigation + && tracked_navigation.token == expected_navigation->token + && tracked_navigation.type == expected_navigation->type + && tracked_navigation.task_ids == expected_navigation->task_ids + && tracked_navigation.target_id == expected_navigation->target_id + && tracked_navigation.target_ids + == expected_navigation->target_ids; + if (!same_navigation_identity) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit did not issue the tracked fail-safe software stop " + "because the navigation identity was replaced before the " + "control lock was acquired"); + } + } + const bool clearing_path_queue = has_tracked_navigation + && tracked_navigation.type == AgvTaskType::FollowPath; + const bool preserve_synchronous_wait = has_tracked_navigation + && tracked_navigation.synchronous_wait; + const auto navigation_stop_command = clearing_path_queue + ? kRobotTaskClearTargetList + : kRobotTaskCancel; + const auto stop_attempt_sequence = + control_attempt_sequence_.fetch_add( + 1, + std::memory_order_relaxed) + 1; + + const auto authority = acquireControl_(); + if (!authority.ok()) { + const std::string detail = authority.message.empty() ? "unknown error" : authority.message; + return AgvResult::failure( + authority.code, + "SEER Robokit acquire control authority failed: " + detail); + } + + struct StopOutcome { + AgvResult result; + bool controller_outcome_unknown{false}; + }; + const auto send_stop = [this](const int sock, const std::uint16_t command) { + Json::Value response; + auto result = sendCommand_( + sock, + command, + Json::Value(Json::objectValue), + &response); + if (!result.ok()) { + return StopOutcome{ + withUnknownControllerOutcome(std::move(result)), + true}; + } + if (!hasNumericControllerRetCode(response)) { + return StopOutcome{ + withUnknownControllerOutcome(resultFromResponse_(response)), + true}; + } + return StopOutcome{resultFromResponse_(response), false}; + }; + + bool generation_advanced = false; + const auto advance_generation_if_needed = [this, &generation_advanced]( + const StopOutcome& outcome) { + if (!generation_advanced + && (outcome.result.ok() || outcome.controller_outcome_unknown)) { + // Publish immediately after the first accepted or indeterminate stop + // outcome. Waiting for the second stop response would leave a window + // in which pose-start confirmation could incorrectly return success. + navigation_generation_.fetch_add(1, std::memory_order_relaxed); + generation_advanced = true; + } + }; + + const auto motion_stop = send_stop(sock_control_, kRobotControlStop); + advance_generation_if_needed(motion_stop); + const auto navigation_cancel = send_stop( + sock_navigation_, + navigation_stop_command); + advance_generation_if_needed(navigation_cancel); + if (generation_advanced) { + const auto stop_generation = + navigation_generation_.load(std::memory_order_relaxed); + if (preserve_synchronous_wait) { + advancePoseTaskGeneration_( + stop_generation, + stop_attempt_sequence); + advanceTrackedNavigationGeneration_(stop_generation); + } else { + clearPoseTask_(stop_generation); + clearTrackedNavigation_(stop_generation); + } + } + + if (!motion_stop.result.ok()) { + const std::string detail = motion_stop.result.message.empty() + ? "unknown error" + : motion_stop.result.message; + if (!navigation_cancel.result.ok()) { + const std::string cancel_detail = navigation_cancel.result.message.empty() + ? "unknown error" + : navigation_cancel.result.message; + return AgvResult::failure( + motion_stop.result.code, + "SEER Robokit software stop failed: control stop: " + detail + + "; cancel navigation: " + cancel_detail); + } + return AgvResult::failure( + motion_stop.result.code, + "SEER Robokit software stop failed: control stop: " + detail); + } + if (!navigation_cancel.result.ok()) { + const std::string detail = navigation_cancel.result.message.empty() + ? "unknown error" + : navigation_cancel.result.message; + return AgvResult::failure( + navigation_cancel.result.code, + "SEER Robokit software stop failed: cancel navigation: " + detail); + } + return AgvResult::success(); +} + +AgvResult SeerRobokitAgv::clearFault() +{ + Json::Value response; + auto result = sendControlledCommand_( + sock_config_, + kRobotConfigClearFault, + Json::Value(Json::objectValue), + &response); + return result.ok() ? resultFromResponse_(response) : result; +} + +AgvResult SeerRobokitAgv::relocalize(const math::Pose2d& pose) +{ + if (!std::isfinite(pose.x) + || !std::isfinite(pose.y) + || !std::isfinite(pose.theta)) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit relocalization pose x, y, and theta must be finite"); + } + + Json::Value payload(Json::objectValue); + jsonMember(payload, "x") = pose.x; + jsonMember(payload, "y") = pose.y; + jsonMember(payload, "angle") = pose.theta; + + Json::Value response; + std::uint64_t accepted_generation = 0; + auto result = sendControlledCommand_( + sock_control_, + kRobotControlReloc, + payload, + &response, + &accepted_generation); + + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + return result; +} + + + + + +AgvResult SeerRobokitAgv::navigateToPose( + const math::Pose2d& pose, + const AgvMotionOptions& options, + const AgvAdapterParams& adapter_params) +{ + if (!std::isfinite(pose.x) + || !std::isfinite(pose.y) + || !std::isfinite(pose.theta)) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit free-navigation pose x, y, and theta must be finite"); + } + if (const std::string error = invalidMotionOption(options); + !error.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit free-navigation motion option " + error); + } + if (navigationCancellationRequested(options)) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit free-navigation command was not sent because the caller " + "had already canceled the operation"); + } + // This SEER Robokit firmware exposes arbitrary-pose navigation through the + // vendor-specific freeGo extension of API 3051. The empty target id and + // GotoSpecifiedPose skill are part of the controller payload that was + // validated on the differential-drive chassis. + std::string source_id = adapter_params.getString("source_id").value_or("SELF_POSITION"); + if (source_id.empty()) { + source_id = "SELF_POSITION"; + } + if (source_id != "SELF_POSITION") { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit free navigation source_id must be SELF_POSITION"); + } + const std::string requested_target_id = + adapter_params.getString("target_id").value_or(""); + if (!requested_target_id.empty() + && requested_target_id != "SELF_POSITION") { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit free navigation target_id must be empty or SELF_POSITION so a " + "malformed freeGo request cannot fall back to station navigation"); + } + const std::string target_id; + + std::string skill_name = + adapter_params.getString("skill_name").value_or("GotoSpecifiedPose"); + if (skill_name.empty()) { + skill_name = "GotoSpecifiedPose"; + } + if (skill_name != "GotoSpecifiedPose") { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit free navigation skill_name must be GotoSpecifiedPose"); + } + if (!options.asynchronous) { + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit free-navigation command was not sent because the " + "required 1101 safety/status preflight failed: " + + snapshot_result.message); + } + if (snapshot.blocked || snapshot.emergency + || !snapshot.active_faults.empty()) { + return AgvResult::failure( + snapshot.emergency + ? AgvErrorCode::EmergencyStopped + : AgvErrorCode::Fault, + "SEER Robokit free-navigation command was not sent because the " + "controller is not safe to start: " + snapshot.detail); + } + } + + const auto task_sequence = + pose_task_sequence_.fetch_add(1, std::memory_order_relaxed) + 1; + std::string task_id_prefix = + adapter_params.getString("task_id").value_or(id_); + if (task_id_prefix.empty()) { + task_id_prefix = id_; + } + const std::string task_id = + makePoseTaskId(task_id_prefix, task_sequence); + + Json::Value payload(Json::objectValue); + jsonMember(payload, "source_id") = source_id; + jsonMember(payload, "id") = target_id; + jsonMember(payload, "task_id") = task_id; + jsonMember(payload, "skill_name") = skill_name; + + auto& free_go = jsonMember(payload, "freeGo"); + jsonMember(free_go, "x") = pose.x; + jsonMember(free_go, "y") = pose.y; + jsonMember(free_go, "theta") = pose.theta; + + // Only strongly typed motion fields and the string whitelist above are + // accepted here. Generic adapter passthrough could inject unrelated 3051 + // operations such as lift, fork, script, or digital-I/O actions. + applyMotionOptions_(payload, options); + + PoseTaskContext context; + context.task_id = task_id; + context.target = pose; + context.reach_distance = options.reach_distance > 0.0 + ? options.reach_distance + : kDefaultPoseReachDistance; + context.reach_angle = options.reach_angle > 0.0 + ? options.reach_angle + : kDefaultPoseReachAngle; + TrackedNavigationContext navigation_context; + navigation_context.token = task_id; + navigation_context.task_ids = {task_id}; + navigation_context.type = AgvTaskType::NavigateToPose; + navigation_context.synchronous_wait = !options.asynchronous; + + Json::Value response; + std::uint64_t navigation_generation = 0; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskGoTarget, + payload, + &response, + &navigation_generation, + nullptr, + nullptr, + &context, + true, + &navigation_context, + false, + nullptr, + &options.cancellation_requested); + const AgvResult command_result = result; + const bool reconcile_indeterminate_command = !result.ok() + && navigation_generation != 0 + && !options.asynchronous; + if (!result.ok() && !reconcile_indeterminate_command) { + return result; + } + result = confirmPoseNavigationStarted_( + context, + !options.asynchronous, + options); + if (!result.ok()) { + TrackedNavigationContext active_navigation; + const bool same_token_still_current = + currentTrackedNavigation_(active_navigation) + && active_navigation.token == navigation_context.token; + if (!same_token_still_current) { + // A pause, resume, explicit cancel, emergency stop, or replacement + // navigation has already ordered the controller state after this + // command. Never let the older confirmation path issue another + // global cancellation against that newer state. + return reconciledNavigationResult( + command_result, + std::move(result)); + } + if (active_navigation.navigation_generation + != navigation_context.navigation_generation + || navigation_generation_.load(std::memory_order_relaxed) + != navigation_context.navigation_generation) { + // A cancel/stop/pause command preserved this exact token but + // advanced its control epoch. A synchronous caller must reconcile + // the exact task and two zero-velocity samples instead of issuing + // a late second cancel. Preserve the established asynchronous + // contract: start confirmation returns superseded immediately. + if (options.asynchronous) { + return reconciledNavigationResult( + command_result, + std::move(result)); + } + return reconciledNavigationResult( + command_result, + waitForPoseNavigationTerminal_( + context, + active_navigation, + options)); + } + auto failure = failAndCancelTrackedNavigation_( + navigation_context, + options, + result.code, + "SEER Robokit free-navigation start confirmation failed after the " + "controller accepted the command: " + + result.message); + return reconciledNavigationResult(command_result, std::move(failure)); + } + if (options.asynchronous) { + return result; + } + TrackedNavigationContext terminal_navigation_context = + navigation_context; + TrackedNavigationContext latest_navigation_context; + if (currentTrackedNavigation_(latest_navigation_context) + && latest_navigation_context.token == navigation_context.token) { + terminal_navigation_context = latest_navigation_context; + } + return reconciledNavigationResult( + command_result, + waitForPoseNavigationTerminal_( + context, + terminal_navigation_context, + options)); +} + +AgvResult SeerRobokitAgv::navigateToStation( + const std::string& station_id, + const AgvMotionOptions& options, + const AgvAdapterParams& adapter_params) +{ + if (station_id.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit station-navigation station_id must not be empty"); + } + if (const std::string error = invalidMotionOption(options); + !error.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit station-navigation motion option " + error); + } + if (navigationCancellationRequested(options)) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit station-navigation command was not sent because the " + "caller had already canceled the operation"); + } + if (const auto jack_height = adapter_params.getString("jack_height")) { + double parsed_jack_height = 0.0; + if (!parseFiniteDouble(*jack_height, parsed_jack_height)) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit station-navigation adapter jack_height must be a " + "complete finite number"); + } + } + + Json::Value payload(Json::objectValue); + if (const auto error = seer_robokit::pgv::applyPgvAdjustmentParams( + payload, + adapter_params); + !error.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit station-navigation PGV adapter parameter " + error); + } + if (!options.asynchronous) { + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit station-navigation command was not sent because " + "the required 1101 safety/status preflight failed: " + + snapshot_result.message); + } + if (snapshot.blocked || snapshot.emergency + || !snapshot.active_faults.empty()) { + return AgvResult::failure( + snapshot.emergency + ? AgvErrorCode::EmergencyStopped + : AgvErrorCode::Fault, + "SEER Robokit station-navigation command was not sent because " + "the controller is not safe to start: " + snapshot.detail); + } + } + + jsonMember(payload, "source_id") = adapter_params.getString("source_id").value_or("SELF_POSITION"); + jsonMember(payload, "id") = station_id; + applyAdapterParams_(payload, adapter_params); + const auto task_sequence = + pose_task_sequence_.fetch_add(1, std::memory_order_relaxed) + 1; + std::string task_id_prefix = + adapter_params.getString("task_id").value_or(id_); + if (task_id_prefix.empty()) { + task_id_prefix = id_; + } + const std::string task_id = makeNavigationTaskId( + task_id_prefix, + "station", + task_sequence); + // Always replace a caller-supplied reusable id with a unique id derived + // from it so 1110 cannot report a stale completion from an older request. + jsonMember(payload, "task_id") = task_id; + // Canonical typed motion options must win over string-valued adapter + // extensions so the SRC controller receives JSON numbers. + applyMotionOptions_(payload, options); + Json::Value response; + std::uint64_t accepted_generation = 0; + TrackedNavigationContext navigation_context; + navigation_context.token = task_id; + navigation_context.task_ids = {task_id}; + navigation_context.type = AgvTaskType::NavigateToStation; + navigation_context.target_id = station_id; + navigation_context.target_ids = {station_id}; + navigation_context.synchronous_wait = !options.asynchronous; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskGoTarget, + payload, + &response, + &accepted_generation, + nullptr, + nullptr, + nullptr, + false, + &navigation_context, + false, + nullptr, + &options.cancellation_requested); + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + const AgvResult command_result = result; + const bool reconcile_indeterminate_command = !result.ok() + && accepted_generation != 0 + && !options.asynchronous; + if ((!result.ok() && !reconcile_indeterminate_command) + || options.asynchronous) { + return result; + } + return reconciledNavigationResult( + command_result, + waitForTrackedNavigationTerminal_( + navigation_context, + options)); +} + +AgvResult SeerRobokitAgv::followPath( + const std::vector& path) +{ + return followPath(path, AgvMotionOptions{}); +} + +AgvResult SeerRobokitAgv::followPath( + const std::vector& path, + const AgvMotionOptions& options) +{ + if (path.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit path navigation requires at least one segment"); + } + if (const std::string error = invalidMotionOption(options); + !error.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit path-navigation motion option " + error); + } + if (navigationCancellationRequested(options)) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit path-navigation command was not sent because the caller " + "had already canceled the operation"); + } + for (const auto& segment : path) { + if (segment.source_station.empty() + || segment.target_station.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit path-navigation source and target station ids " + "must not be empty"); + } + } + if (!options.asynchronous) { + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit path-navigation command was not sent because the " + "required 1101 safety/status preflight failed: " + + snapshot_result.message); + } + if (snapshot.blocked || snapshot.emergency + || !snapshot.active_faults.empty()) { + return AgvResult::failure( + snapshot.emergency + ? AgvErrorCode::EmergencyStopped + : AgvErrorCode::Fault, + "SEER Robokit path-navigation command was not sent because the " + "controller is not safe to start: " + snapshot.detail); + } + } + + const auto task_sequence = + pose_task_sequence_.fetch_add(1, std::memory_order_relaxed) + 1; + const std::string batch_id = makeNavigationTaskId( + id_, + "path", + task_sequence); + Json::Value payload(Json::objectValue); + Json::Value tasks(Json::arrayValue); + std::vector task_ids; + task_ids.reserve(path.size()); + std::size_t index = 0; + for (const auto& segment : path) { + Json::Value task(Json::objectValue); + const std::string task_id = + batch_id + "_segment_" + std::to_string(index++); + jsonMember(task, "task_id") = task_id; + jsonMember(task, "source_id") = segment.source_station; + jsonMember(task, "id") = segment.target_station; + tasks.append(task); + task_ids.push_back(task_id); + } + jsonMember(payload, "move_task_list") = tasks; + Json::Value response; + std::uint64_t accepted_generation = 0; + TrackedNavigationContext navigation_context; + navigation_context.token = batch_id; + navigation_context.task_ids = task_ids; + navigation_context.type = AgvTaskType::FollowPath; + navigation_context.target_id = path.back().target_station; + navigation_context.target_ids.reserve(path.size()); + for (const auto& segment : path) { + navigation_context.target_ids.push_back(segment.target_station); + } + navigation_context.synchronous_wait = !options.asynchronous; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskGoTargetList, + payload, + &response, + &accepted_generation, + nullptr, + nullptr, + nullptr, + false, + &navigation_context, + false, + nullptr, + &options.cancellation_requested); + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + const AgvResult command_result = result; + const bool reconcile_indeterminate_command = !result.ok() + && accepted_generation != 0 + && !options.asynchronous; + if ((!result.ok() && !reconcile_indeterminate_command) + || options.asynchronous) { + return result; + } + return reconciledNavigationResult( + command_result, + waitForTrackedNavigationTerminal_( + navigation_context, + options)); +} + + +AgvResult SeerRobokitAgv::translate( + const AgvTranslation& translation) +{ + if (!std::isfinite(translation.distance) + || !std::isfinite(translation.vx) + || !std::isfinite(translation.vy)) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit translation distance, vx, and vy must be finite"); + } + if (translation.distance <= 0.0) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit translation distance must be greater than zero"); + } + if (translation.vx == 0.0 && translation.vy == 0.0) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit translation requires a non-zero vx or vy"); + } + + int mode = 0; + switch (translation.mode) { + case AgvTranslationMode::Odometry: + mode = 0; + break; + case AgvTranslationMode::Localization: + mode = 1; + break; + default: + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit translation mode must be odometry or localization"); + } + + Json::Value payload(Json::objectValue); + jsonMember(payload, "dist") = translation.distance; + jsonMember(payload, "vx") = translation.vx; + jsonMember(payload, "vy") = translation.vy; + jsonMember(payload, "mode") = mode; + + Json::Value response; + std::uint64_t accepted_generation = 0; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskTranslate, + payload, + &response, + &accepted_generation); + + // API 3055 does not expose a task id. Do not publish a fake tracked task, + // but invalidate navigation state if the command may have been accepted. + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + return result; +} + + + + +AgvResult SeerRobokitAgv::pauseNavigation() +{ + Json::Value response; + std::uint64_t accepted_generation = 0; + std::uint64_t control_attempt_sequence = 0; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskPause, + Json::Value(Json::objectValue), + &response, + &accepted_generation, + nullptr, + &control_attempt_sequence, + nullptr, + false, + nullptr, + true); + if (accepted_generation != 0) { + advancePoseTaskGeneration_( + accepted_generation, + control_attempt_sequence); + } + return result; +} + +AgvResult SeerRobokitAgv::resumeNavigation() +{ + Json::Value response; + std::uint64_t accepted_generation = 0; + std::uint64_t control_attempt_sequence = 0; + auto result = sendControlledCommand_( + sock_navigation_, + kRobotTaskResume, + Json::Value(Json::objectValue), + &response, + &accepted_generation, + nullptr, + &control_attempt_sequence, + nullptr, + false, + nullptr, + true); + if (accepted_generation != 0) { + advancePoseTaskGeneration_( + accepted_generation, + control_attempt_sequence); + } + return result; +} + +AgvResult SeerRobokitAgv::cancelNavigation() +{ + Json::Value response; + std::uint64_t accepted_generation = 0; + std::uint64_t control_attempt_sequence = 0; + TrackedNavigationContext tracked_navigation; + const bool has_tracked_navigation = + currentTrackedNavigation_(tracked_navigation); + const auto cancel_command = has_tracked_navigation + && tracked_navigation.type == AgvTaskType::FollowPath + ? kRobotTaskClearTargetList + : kRobotTaskCancel; + auto result = sendControlledCommand_( + sock_navigation_, + cancel_command, + Json::Value(Json::objectValue), + &response, + &accepted_generation, + nullptr, + &control_attempt_sequence, + nullptr, + false, + nullptr, + true, + has_tracked_navigation ? &tracked_navigation.token : nullptr, + nullptr, + has_tracked_navigation ? &tracked_navigation : nullptr); + if (accepted_generation != 0) { + advancePoseTaskGeneration_( + accepted_generation, + control_attempt_sequence); + } + return result; +} + +AgvResult SeerRobokitAgv::setVelocity(const AgvVelocity& velocity) +{ + if (!std::isfinite(velocity.vx) + || !std::isfinite(velocity.vy) + || !std::isfinite(velocity.wz)) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit velocity vx, vy, and wz must be finite"); + } + + Json::Value payload(Json::objectValue); + jsonMember(payload, "vx") = velocity.vx; + jsonMember(payload, "vy") = velocity.vy; + jsonMember(payload, "w") = velocity.wz; + Json::Value response; + const bool stop_velocity = + velocity.vx == 0.0 && velocity.vy == 0.0 && velocity.wz == 0.0; + if (stop_velocity) { + std::uint64_t control_attempt_sequence = 0; + auto result = sendControlledCommand_( + sock_control_, + kRobotControlMotion, + payload, + &response, + nullptr, + nullptr, + &control_attempt_sequence); + result = result.ok() ? resultFromResponse_(response) : result; + if (result.ok()) { + advancePoseTaskControlAttempt_(control_attempt_sequence); + } + return result; + } + + std::uint64_t accepted_generation = 0; + auto result = sendControlledCommand_( + sock_control_, + kRobotControlMotion, + payload, + &response, + &accepted_generation); + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + return result; +} + +void SeerRobokitAgv::rememberPoseTask_(const PoseTaskContext& context) const +{ + std::lock_guard lock(pose_task_mutex_); + if (context.navigation_generation + < pose_task_context_.navigation_generation) { + return; + } + pose_task_context_ = context; +} + +void SeerRobokitAgv::advancePoseTaskGeneration_( + const std::uint64_t navigation_generation, + const std::uint64_t control_attempt_sequence) const +{ + std::lock_guard lock(pose_task_mutex_); + if (navigation_generation + < pose_task_context_.navigation_generation) { + return; + } + pose_task_context_.navigation_generation = navigation_generation; + pose_task_context_.control_attempt_sequence_at_start = + control_attempt_sequence; +} + +void SeerRobokitAgv::advancePoseTaskControlAttempt_( + const std::uint64_t control_attempt_sequence) const +{ + std::lock_guard lock(pose_task_mutex_); + if (pose_task_context_.task_id.empty() + || control_attempt_sequence + < pose_task_context_.control_attempt_sequence_at_start) { + return; + } + pose_task_context_.control_attempt_sequence_at_start = + control_attempt_sequence; +} + +void SeerRobokitAgv::clearPoseTask_( + const std::uint64_t navigation_generation) const +{ + std::lock_guard lock(pose_task_mutex_); + if (navigation_generation < pose_task_context_.navigation_generation) { + return; + } + pose_task_context_ = PoseTaskContext{}; + pose_task_context_.navigation_generation = navigation_generation; +} + +void SeerRobokitAgv::clearPoseTaskIfTaskId_(const std::string& task_id) const +{ + std::lock_guard lock(pose_task_mutex_); + if (pose_task_context_.task_id != task_id) { + return; + } + const auto generation = pose_task_context_.navigation_generation; + pose_task_context_ = PoseTaskContext{}; + pose_task_context_.navigation_generation = generation; +} + +bool SeerRobokitAgv::currentPoseTask_(PoseTaskContext& context) const +{ + std::lock_guard lock(pose_task_mutex_); + if (pose_task_context_.task_id.empty()) { + return false; + } + context = pose_task_context_; + return true; +} + +void SeerRobokitAgv::rememberTrackedNavigation_( + const TrackedNavigationContext& context) const +{ + std::lock_guard lock(tracked_navigation_mutex_); + if (context.navigation_generation + < tracked_navigation_context_.navigation_generation) { + return; + } + tracked_navigation_context_ = context; +} + +void SeerRobokitAgv::advanceTrackedNavigationGeneration_( + const std::uint64_t navigation_generation) const +{ + std::lock_guard lock(tracked_navigation_mutex_); + if (navigation_generation + < tracked_navigation_context_.navigation_generation) { + return; + } + tracked_navigation_context_.navigation_generation = + navigation_generation; +} + +void SeerRobokitAgv::clearTrackedNavigation_( + const std::uint64_t navigation_generation) const +{ + std::lock_guard lock(tracked_navigation_mutex_); + if (navigation_generation + < tracked_navigation_context_.navigation_generation) { + return; + } + tracked_navigation_context_ = TrackedNavigationContext{}; + tracked_navigation_context_.navigation_generation = + navigation_generation; +} + +void SeerRobokitAgv::clearTrackedNavigationIfToken_( + const std::string& token) const +{ + std::lock_guard lock(tracked_navigation_mutex_); + if (tracked_navigation_context_.token != token) { + return; + } + const auto generation = + tracked_navigation_context_.navigation_generation; + tracked_navigation_context_ = TrackedNavigationContext{}; + tracked_navigation_context_.navigation_generation = generation; +} + +bool SeerRobokitAgv::currentTrackedNavigation_( + TrackedNavigationContext& context) const +{ + std::lock_guard lock(tracked_navigation_mutex_); + if (tracked_navigation_context_.token.empty()) { + return false; + } + context = tracked_navigation_context_; + return true; +} + +std::string SeerRobokitAgv::cachedControllerFaultDetail_( + const std::uint64_t after_sequence, + const int wait_ms, + std::uint64_t* associated_control_attempt) const +{ + std::unique_lock lock(runtime_state_mutex_); + const auto has_matching_fault = [this, after_sequence]() { + return !last_controller_fault_detail_.empty() + && controller_fault_sequence_ > after_sequence; + }; + if (!has_matching_fault() + && wait_ms > 0 + && state_push_enabled_) { + runtime_state_cv_.wait_for( + lock, + std::chrono::milliseconds(wait_ms), + has_matching_fault); + } + if (!has_matching_fault()) { + return {}; + } + if (associated_control_attempt) { + *associated_control_attempt = + last_controller_fault_control_attempt_; + } + return "cached_controller_fault_at=" + + std::to_string(last_controller_fault_timestamp_) + + ", " + last_controller_fault_detail_; +} + +int SeerRobokitAgv::controllerFaultCaptureGraceMs_() const +{ + const int configured_interval = config_.state_push_interval_ms(); + const int effective_interval = configured_interval > 0 + ? configured_interval + : kDefaultControllerFaultPushIntervalMs; + const auto configured_grace = + static_cast(effective_interval) + + kControllerFaultPushJitterMs; + return static_cast(std::min( + std::max( + configured_grace, + static_cast(kMinimumControllerFaultCaptureGraceMs)), + static_cast(kMaximumControllerFaultCaptureGraceMs))); +} + +int SeerRobokitAgv::controllerFaultStateMaxAgeMs_() const +{ + const int configured_interval = config_.state_push_interval_ms(); + const int effective_interval = configured_interval > 0 + ? std::min( + configured_interval, + kMaximumControllerFaultCaptureGraceMs + - kControllerFaultPushJitterMs) + : kDefaultControllerFaultPushIntervalMs; + const auto max_age = + static_cast(effective_interval) + * kControllerFaultStateMaxAgeIntervals + + kControllerFaultPushJitterMs; + return static_cast(std::max( + max_age, + static_cast(kMinimumControllerFaultStateMaxAgeMs))); +} + +std::string SeerRobokitAgv::freeNavigationFaultStateUnavailableDetail_() const +{ + std::lock_guard lock(runtime_state_mutex_); + if (!state_push_enabled_) { + return "controller fault state is unavailable because state push is " + "disabled"; + } + // A newly reported active fault is handled through the sequenced fault + // cache, including its raw fatals/errors payload. Do not replace that + // diagnostic with the less specific "incomplete push" message. + if (!active_controller_fault_detail_.empty()) { + return {}; + } + if (!controller_fault_state_observed_) { + return "no complete state push containing fatals/errors is currently " + "available"; + } + const auto fault_state_age = + std::chrono::duration_cast( + std::chrono::steady_clock::now() + - controller_fault_state_observed_at_) + .count(); + const int max_age_ms = controllerFaultStateMaxAgeMs_(); + if (fault_state_age > max_age_ms) { + return "the most recent fatals/errors state push is stale (age_ms=" + + std::to_string(fault_state_age) + + ", max_age_ms=" + std::to_string(max_age_ms) + ")"; + } + return {}; +} + +AgvResult SeerRobokitAgv::queryPoseTaskStatus_( + const std::string& task_id, + PoseTaskStatus& status) const +{ + std::vector statuses; + const auto result = queryTaskStatuses_({task_id}, statuses); + if (!result.ok()) { + status = PoseTaskStatus{}; + return result; + } + status = std::move(statuses.front()); + return result; +} + +AgvResult SeerRobokitAgv::queryTaskStatuses_( + const std::vector& requested_task_ids, + std::vector& statuses) const +{ + statuses.assign(requested_task_ids.size(), PoseTaskStatus{}); + if (requested_task_ids.empty()) { + return AgvResult::failure( + AgvErrorCode::InvalidArgument, + "SEER Robokit 1110 task status query requires at least one task id"); + } + + Json::Value payload(Json::objectValue); + Json::Value task_ids(Json::arrayValue); + for (const auto& task_id : requested_task_ids) { + task_ids.append(task_id); + } + jsonMember(payload, "task_ids") = std::move(task_ids); + + Json::Value response; + auto result = sendCommand_( + sock_status_, + kRobotStatusTaskPackage, + payload, + &response); + if (!result.ok()) { + return result; + } + result = resultFromResponse_(response); + if (!result.ok()) { + return result; + } + + const auto* package = jsonFind(response, "task_status_package"); + double progress = 0.0; + bool progress_present = false; + double remaining_distance = 0.0; + bool distance_present = false; + std::string closest_target; + std::string source_name; + std::string target_name; + + if (package) { + if (const auto* value = jsonFind(*package, "percentage"); + value && value->isNumeric()) { + progress = value->asDouble(); + progress_present = std::isfinite(progress); + } + if (const auto* value = jsonFind(*package, "distance"); + value && value->isNumeric()) { + remaining_distance = value->asDouble(); + distance_present = std::isfinite(remaining_distance); + } + if (const auto* value = jsonFind(*package, "closest_target"); + value && value->isString()) { + closest_target = value->asString(); + } + if (const auto* value = jsonFind(*package, "source_name"); + value && value->isString()) { + source_name = value->asString(); + } + if (const auto* value = jsonFind(*package, "target_name"); + value && value->isString()) { + target_name = value->asString(); + } + } + if (package) { + if (const auto* status_list = jsonFind(*package, "task_status_list"); + status_list && status_list->isArray()) { + for (const auto& item : *status_list) { + const std::string returned_task_id = + jsonGet(item, "task_id", "").asString(); + const auto requested = std::find( + requested_task_ids.begin(), + requested_task_ids.end(), + returned_task_id); + if (requested == requested_task_ids.end()) { + continue; + } + const auto index = static_cast( + std::distance(requested_task_ids.begin(), requested)); + auto& status = statuses[index]; + status.found = true; + status.state = jsonGet(item, "status", 0).asInt(); + if (const auto* type = jsonFind(item, "type"); + type && type->isNumeric()) { + status.type = type->asInt(); + status.type_present = true; + } + } + } + } + + std::ostringstream common_detail; + if (const auto* ret_code = jsonFind(response, "ret_code")) { + common_detail << ", status_query_ret_code=" + << jsonValueToString(*ret_code); + } + const auto append_field = [&common_detail]( + const Json::Value& object, + const char* key, + const char* label) { + const auto* value = jsonFind(object, key); + if (!value || value->isNull()) { + return; + } + const std::string text = jsonValueToString(*value); + if (!text.empty()) { + common_detail << ", " << label << "=" << text; + } + }; + if (package) { + append_field(*package, "info", "info"); + append_field(*package, "closest_target", "closest_target"); + append_field(*package, "source_name", "source_name"); + append_field(*package, "target_name", "target_name"); + append_field(*package, "percentage", "percentage"); + append_field(*package, "distance", "distance"); + } + append_field(response, "create_on", "create_on"); + append_field(response, "err_msg", "status_query_err_msg"); + + for (std::size_t index = 0; index < requested_task_ids.size(); ++index) { + auto& status = statuses[index]; + status.progress = progress; + status.progress_present = progress_present; + status.remaining_distance = remaining_distance; + status.distance_present = distance_present; + status.closest_target = closest_target; + status.source_name = source_name; + status.target_name = target_name; + std::ostringstream detail; + detail << "task_id=" << requested_task_ids[index]; + if (status.found) { + detail << ", task_status=" << status.state; + if (status.type_present) { + detail << ", task_type=" << status.type; + } else { + detail << ", task_type="; + } + } else { + detail << " not present in task_status_package"; + } + detail << common_detail.str(); + status.detail = detail.str(); + } + return AgvResult::success(); +} + +AgvResult SeerRobokitAgv::queryNavigationSnapshot_( + NavigationSnapshot& snapshot) const +{ + snapshot = NavigationSnapshot{}; + + Json::Value response; + auto result = sendCommand_( + sock_status_, + kRobotStatusAll2, + Json::Value(Json::objectValue), + &response); + if (!result.ok()) { + return result; + } + result = resultFromResponse_(response); + if (!result.ok()) { + return result; + } + + const auto* task_status = jsonFind(response, "task_status"); + const auto* task_type = jsonFind(response, "task_type"); + const auto* blocked = jsonFind(response, "blocked"); + const auto* vx = jsonFind(response, "vx"); + const auto* vy = jsonFind(response, "vy"); + const auto* w = jsonFind(response, "w"); + if (!w) { + w = jsonFind(response, "wz"); + } + + if (!task_status || !task_status->isNumeric() + || !task_type || !task_type->isNumeric()) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit 1101 navigation snapshot did not contain numeric " + "task_status/task_type"); + } + if (!blocked || !(blocked->isBool() || blocked->isNumeric())) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit 1101 navigation snapshot did not contain blocked"); + } + if (!vx || !vx->isNumeric() + || !vy || !vy->isNumeric() + || !w || !w->isNumeric()) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit 1101 navigation snapshot did not contain numeric " + "vx/vy/w required to confirm that navigation has stopped"); + } + + snapshot.task_status = task_status->asInt(); + snapshot.task_type = task_type->asInt(); + snapshot.task_status_present = true; + snapshot.task_type_present = true; + snapshot.blocked = blocked->asBool(); + snapshot.blocked_present = true; + snapshot.vx = vx->asDouble(); + snapshot.vy = vy->asDouble(); + snapshot.w = w->asDouble(); + snapshot.velocity_present = + std::isfinite(snapshot.vx) + && std::isfinite(snapshot.vy) + && std::isfinite(snapshot.w); + if (!snapshot.velocity_present) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit 1101 navigation snapshot contained non-finite vx/vy/w"); + } + + if (const auto* reason = jsonFind(response, "block_reason"); + reason && !reason->isNull()) { + snapshot.block_reason_raw = jsonValueToString(*reason); + if (reason->isNumeric()) { + snapshot.block_reason = reason->asInt(); + } + } + if (const auto* target_id = jsonFind(response, "target_id"); + target_id && target_id->isString()) { + snapshot.target_id = target_id->asString(); + } + if (const auto* emergency = jsonFind(response, "emergency"); + emergency && (emergency->isBool() || emergency->isNumeric())) { + snapshot.emergency = emergency->asBool(); + } + + std::ostringstream faults; + bool found_fault = false; + bool only_recoverable_blocking_faults = true; + const auto append_faults = [ + &response, + &faults, + &found_fault, + &only_recoverable_blocking_faults]( + const char* key, + const bool may_be_recoverable_blocking_fault) { + const auto* value = jsonFind(response, key); + if (!value) { + return; + } + const bool malformed = !value->isArray(); + if (!malformed && value->empty()) { + return; + } + found_fault = true; + bool recoverable_blocking_fault = + may_be_recoverable_blocking_fault && !malformed; + if (recoverable_blocking_fault) { + for (const auto& fault : *value) { + if (!fault.isObject()) { + recoverable_blocking_fault = false; + break; + } + const auto* code = jsonFind(fault, "code"); + if (!code || !code->isNumeric() + || code->asInt() != kRobotBlockedFaultCode) { + recoverable_blocking_fault = false; + break; + } + } + } + if (!recoverable_blocking_fault) { + only_recoverable_blocking_faults = false; + } + if (faults.tellp() > 0) { + faults << ", "; + } + faults << key << "=" + << (value->isNull() + ? std::string("null") + : jsonValueToString(*value)); + if (malformed) { + faults << "(malformed; expected array)"; + } + }; + append_faults("fatals", false); + append_faults("errors", true); + snapshot.active_faults = faults.str(); + snapshot.only_recoverable_blocking_faults = + found_fault && only_recoverable_blocking_faults; + + std::ostringstream detail; + detail << "1101 task_status=" << snapshot.task_status + << ", task_type=" << snapshot.task_type + << ", blocked=" << (snapshot.blocked ? "true" : "false") + << ", velocity=(" << snapshot.vx << "," << snapshot.vy + << "," << snapshot.w << ")"; + if (!snapshot.target_id.empty()) { + detail << ", target_id=" << snapshot.target_id; + } + if (!snapshot.block_reason_raw.empty()) { + detail << ", block_reason=" << snapshot.block_reason_raw; + if (snapshot.block_reason >= 0) { + detail << "(" << blockReasonName(snapshot.block_reason) << ")"; + } + } + const auto append_detail_field = [&response, &detail](const char* key) { + const auto* value = jsonFind(response, key); + if (!value || value->isNull()) { + return; + } + const std::string text = jsonValueToString(*value); + if (!text.empty()) { + detail << ", " << key << "=" << text; + } + }; + append_detail_field("block_x"); + append_detail_field("block_y"); + append_detail_field("block_di"); + append_detail_field("block_ultrasonic_id"); + append_detail_field("move_status_info"); + append_detail_field("err_msg"); + append_detail_field("warnings"); + if (!snapshot.active_faults.empty()) { + detail << ", " << snapshot.active_faults; + } + if (snapshot.emergency) { + detail << ", emergency=true"; + } + snapshot.detail = detail.str(); + return AgvResult::success(); +} + +bool SeerRobokitAgv::poseTargetReached_( + const PoseTaskContext& context, + std::string& detail) const +{ + math::Pose2d current_pose; + bool current_pose_available = false; + std::string pose_source; + std::string query_error; + + Json::Value response; + auto result = sendCommand_( + sock_status_, + kRobotStatusLoc, + Json::Value(Json::objectValue), + &response); + if (result.ok()) { + result = resultFromResponse_(response); + } + const auto* x = jsonFind(response, "x"); + const auto* y = jsonFind(response, "y"); + const auto* angle = jsonFind(response, "angle"); + if (result.ok() + && x && x->isNumeric() + && y && y->isNumeric() + && angle && angle->isNumeric()) { + current_pose.x = x->asDouble(); + current_pose.y = y->asDouble(); + current_pose.theta = angle->asDouble(); + if (std::isfinite(current_pose.x) + && std::isfinite(current_pose.y) + && std::isfinite(current_pose.theta)) { + current_pose_available = true; + pose_source = "controller_1004"; + } else { + query_error = "SEER Robokit 1004 response contained non-finite x/y/angle"; + } + } else if (!result.ok()) { + query_error = result.message; + } else { + query_error = + "SEER Robokit 1004 response did not contain numeric x/y/angle"; + } + + if (!current_pose_available) { + detail = "target pose could not be verified"; + if (!query_error.empty()) { + detail += ": " + query_error; + } + return false; + } + + const double distance_error = std::hypot( + current_pose.x - context.target.x, + current_pose.y - context.target.y); + const double angle_error = angleDistance( + current_pose.theta, + context.target.theta); + std::ostringstream description; + description << "pose_source=" << pose_source + << ", current_pose=(" << current_pose.x + << "," << current_pose.y + << "," << current_pose.theta + << "), target_pose=(" << context.target.x + << "," << context.target.y + << "," << context.target.theta + << "), distance_error=" << distance_error + << ", distance_tolerance=" << context.reach_distance + << ", angle_error=" << angle_error + << ", angle_tolerance=" << context.reach_angle; + if (!query_error.empty()) { + description << ", 1004_query_error=" << query_error; + } + detail = description.str(); + return distance_error <= context.reach_distance + && angle_error <= context.reach_angle; +} + +void SeerRobokitAgv::applyMotionOptions_( + Json::Value& payload, + const AgvMotionOptions& options, + const bool include_reach_options) +{ + if (options.max_speed > 0.0) jsonMember(payload, "max_speed") = options.max_speed; + if (options.max_angular_speed > 0.0) jsonMember(payload, "max_wspeed") = options.max_angular_speed; + if (options.max_acceleration > 0.0) jsonMember(payload, "max_acc") = options.max_acceleration; + if (options.max_angular_acceleration > 0.0) jsonMember(payload, "max_wacc") = options.max_angular_acceleration; + if (include_reach_options) { + if (options.reach_distance > 0.0) jsonMember(payload, "reach_dist") = options.reach_distance; + if (options.reach_angle > 0.0) jsonMember(payload, "reach_angle") = options.reach_angle; + } +} + +void SeerRobokitAgv::applyAdapterParams_(Json::Value& payload, const AgvAdapterParams& params) +{ + for (const auto& [key, value] : params.values) { + if (seer_robokit::pgv::isPgvAdjustmentKey(key) + || key.rfind("port_", 0) == 0 + || key == "target_id" + || key == "id" + || key == "x" + || key == "y" + || key == "angle" + || key == "freeGo" + || key == "max_speed" + || key == "max_wspeed" + || key == "max_acc" + || key == "max_wacc" + || key == "reach_dist" + || key == "reach_angle" + || key == "jack_height") { + continue; + } + jsonMember(payload, key) = value; + } + if (const auto jack_height = params.getDouble("jack_height")) { + jsonMember(payload, "jack_height") = *jack_height; + } +} + +} // namespace cmvr::device diff --git a/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation_wait.cpp b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation_wait.cpp new file mode 100644 index 00000000..5e8dbaab --- /dev/null +++ b/cmvr-es/devices/agv/seer_robokit/src/seer_robokit_navigation_wait.cpp @@ -0,0 +1,1745 @@ +#include "seer_robokit_agv.h" +#include "seer_robokit_navigation_utils.h" +#include "seer_robokit_protocol.h" +#include "seer_robokit_utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::device { + +using namespace seer_robokit::navigation; +using namespace seer_robokit::protocol; +using namespace seer_robokit::detail; + +AgvResult SeerRobokitAgv::confirmPoseNavigationStarted_( + const PoseTaskContext& context, + const bool accept_paused, + const AgvMotionOptions& options) const +{ + const auto deadline = std::chrono::steady_clock::now() + kPoseNavigationStartTimeout; + std::string last_status = "no task status received"; + int consecutive_running_samples = 0; + bool matching_task_observed = false; + int last_matching_state = 0; + bool last_poll_matched = false; + bool running_stability_window_active = false; + std::chrono::steady_clock::time_point running_stable_at{}; + const auto running_stability_window = std::chrono::milliseconds( + controllerFaultCaptureGraceMs_()); + const auto hard_deadline = deadline + running_stability_window; + + const auto superseded = [this, &context, accept_paused]() { + if (!accept_paused) { + return navigation_generation_.load(std::memory_order_relaxed) + != context.navigation_generation; + } + TrackedNavigationContext active_context; + return !currentTrackedNavigation_(active_context) + || active_context.token != context.task_id; + }; + const auto superseded_result = []() { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit free-navigation start confirmation was superseded by " + "another accepted navigation, velocity, pause, or stop command; " + "the controller task state is unknown, so do not retry automatically " + "before querying or canceling navigation"); + }; + const auto fault_monitoring_unavailable = + [this, &context]() { + if (controller_fault_channel_epoch_.load( + std::memory_order_relaxed) + != context.controller_fault_channel_epoch_at_start) { + return std::string( + "the controller fault push channel changed or was " + "invalidated after the free-navigation command was " + "accepted"); + } + return freeNavigationFaultStateUnavailableDetail_(); + }; + const auto fault_monitoring_unavailable_result = + [](const std::string& detail) { + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit accepted the free-navigation command, but controller " + "fault monitoring became unavailable during start " + "confirmation: " + detail + + "; the task state is unsafe to accept, so query the " + "controller and cancel or stop before another motion " + "command"); + }; + const auto fault_attribution_is_ambiguous = + [&context](const std::uint64_t associated_control_attempt) { + return associated_control_attempt != 0 + && associated_control_attempt + != context.control_attempt_sequence_at_start; + }; + const auto ambiguous_fault_result = + [](const std::string& task_detail, const std::string& fault) { + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit reported a controller fault after another control " + "command attempt had begun; the fault " + "cannot be attributed to the tracked free-navigation task: " + + task_detail + ", " + fault + + "; query navigation status and cancel or stop before " + "another motion command"); + }; + const auto supersededWithFault = [&]() { + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + 0, + &fault_control_attempt); + if (!fault.empty() + && fault_attribution_is_ambiguous(fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return superseded_result(); + }; + + while (true) { + if (navigationCancellationRequested(options)) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit free-navigation start confirmation was canceled by " + "the caller"); + } + if (superseded()) { + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + 0, + &fault_control_attempt); + if (!fault.empty() + && fault_attribution_is_ambiguous( + fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return supersededWithFault(); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + + PoseTaskStatus task_status; + const auto query_result = queryPoseTaskStatus_( + context.task_id, + task_status); + if (!query_result.ok()) { + const std::string detail = query_result.message.empty() + ? "unknown error" + : query_result.message; + return AgvResult::failure( + query_result.code, + "SEER Robokit accepted the free-navigation command, but task start " + "could not be verified: " + detail + + "; do not retry automatically before checking or canceling navigation"); + } + + if (superseded()) { + return supersededWithFault(); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + + last_status = task_status.detail; + const bool task_present = + task_status.found && task_status.state != 404; + last_poll_matched = task_present; + if (task_present) { + matching_task_observed = true; + last_matching_state = task_status.state; + if (task_status.type_present && task_status.type != 1) { + return AgvResult::failure( + AgvErrorCode::TaskRejected, + "SEER Robokit created an unexpected task type for free navigation: " + + last_status); + } + + if (task_status.state == 2) { + const auto now = std::chrono::steady_clock::now(); + if (!running_stability_window_active) { + running_stability_window_active = true; + running_stable_at = now + running_stability_window; + } + ++consecutive_running_samples; + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + 0, + &fault_control_attempt); + if (!fault.empty()) { + if (superseded()) { + return supersededWithFault(); + } + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation task reached Running state, " + "but the controller reported a new fault during start " + "confirmation: " + last_status + ", " + fault + + "; do not retry automatically; cancel or stop the " + "task before another motion command"); + } + if (consecutive_running_samples + >= kPoseNavigationRequiredRunningSamples + && now >= running_stable_at) { + if (superseded()) { + return supersededWithFault(); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result( + unavailable); + } + return AgvResult::success(); + } + } else { + consecutive_running_samples = 0; + running_stability_window_active = false; + } + + if (task_status.state == 3) { + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + controllerFaultCaptureGraceMs_(), + &fault_control_attempt); + if (superseded()) { + return supersededWithFault(); + } + if (!fault.empty()) { + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation task was established but " + "paused while the controller reported a new fault: " + + last_status + ", " + fault + + "; do not retry automatically before querying or " + "canceling it"); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + if (accept_paused) { + return AgvResult::success(); + } + return AgvResult::failure( + AgvErrorCode::TaskRejected, + "SEER Robokit free-navigation task was established but is paused: " + + last_status + + "; do not retry automatically before querying or canceling it"); + } + if (task_status.state == 4) { + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + controllerFaultCaptureGraceMs_(), + &fault_control_attempt); + if (superseded()) { + return supersededWithFault(); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + if (!fault.empty()) { + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation task reported Completed, but " + "the controller reported a new fault during completion " + "confirmation: " + last_status + ", " + fault + + "; do not retry automatically; cancel or stop " + "the task before another motion command"); + } + if (accept_paused) { + // Synchronous callers perform the authoritative pose + // check only after two zero-velocity 1101 samples. A + // Completed task may still be decelerating here. + return AgvResult::success(); + } + std::string pose_detail; + const bool target_reached = + poseTargetReached_(context, pose_detail); + if (superseded()) { + return supersededWithFault(); + } + std::uint64_t post_pose_fault_control_attempt = 0; + const std::string post_pose_fault = + cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + 0, + &post_pose_fault_control_attempt); + if (!post_pose_fault.empty()) { + if (fault_attribution_is_ambiguous( + post_pose_fault_control_attempt)) { + return ambiguous_fault_result( + last_status, + post_pose_fault); + } + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation task reported Completed, but " + "the controller reported a new fault during target " + "verification: " + last_status + ", " + + post_pose_fault + + "; do not retry automatically; cancel or stop " + "the task before another motion command"); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + if (target_reached) { + return AgvResult::success(); + } + return AgvResult::failure( + AgvErrorCode::TaskRejected, + "SEER Robokit free-navigation task completed before a stable running " + "state, but the requested target was not reached: " + + last_status + ", " + pose_detail + + "; check the freeGo payload and controller alarms before retrying"); + } + if (task_status.state == 5 + || task_status.state == 6 + || task_status.state == 7) { + std::string detail = last_status; + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + controllerFaultCaptureGraceMs_(), + &fault_control_attempt); + if (superseded()) { + return supersededWithFault(); + } + if (!fault.empty()) { + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + detail += + ", controller_fault_attribution=ambiguous because " + "the fault was observed after another control " + "command attempt had begun"; + } + detail += ", " + fault; + } + return AgvResult::failure( + task_status.state == 5 || task_status.state == 7 + ? AgvErrorCode::TaskFailed + : AgvErrorCode::TaskCanceled, + task_status.state == 5 || task_status.state == 7 + ? "SEER Robokit free-navigation task failed: " + detail + : "SEER Robokit free-navigation task was canceled: " + detail); + } + if (task_status.state < 1 || task_status.state > 7) { + return AgvResult::failure( + AgvErrorCode::TaskFailed, + "SEER Robokit free-navigation task reported an unsupported " + "terminal or vendor-specific status: " + last_status); + } + } else { + consecutive_running_samples = 0; + running_stability_window_active = false; + } + + const auto now = std::chrono::steady_clock::now(); + if (now >= hard_deadline + || (now >= deadline && !running_stability_window_active)) { + break; + } + sleepForNavigationPoll( + kPoseNavigationPollInterval, + hard_deadline, + options); + } + + if (matching_task_observed + && last_poll_matched + && last_matching_state == 1) { + // A matching Waiting task has been accepted by the controller and may + // legitimately remain queued. Returning a rejection here would invite + // a duplicate command while the original task can still start later. + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + controllerFaultCaptureGraceMs_(), + &fault_control_attempt); + if (superseded()) { + return supersededWithFault(); + } + if (const std::string unavailable = + fault_monitoring_unavailable(); + !unavailable.empty()) { + return fault_monitoring_unavailable_result(unavailable); + } + if (!fault.empty()) { + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + return ambiguous_fault_result(last_status, fault); + } + return AgvResult::failure( + AgvErrorCode::Fault, + "SEER Robokit free-navigation task was accepted and remains active, " + "but the controller reported a new fault: " + + last_status + ", " + fault + + "; the task may still start later, so do not retry " + "automatically; cancel or stop it before another motion command"); + } + return AgvResult::success(); + } + + std::string detail = last_status; + std::uint64_t fault_control_attempt = 0; + const std::string fault = cachedControllerFaultDetail_( + context.controller_fault_sequence_at_start, + 0, + &fault_control_attempt); + if (superseded()) { + return supersededWithFault(); + } + if (!fault.empty()) { + if (fault_attribution_is_ambiguous( + fault_control_attempt)) { + detail += + ", controller_fault_attribution=ambiguous because the fault " + "was observed after another control command attempt had begun"; + } + detail += ", " + fault; + } + return AgvResult::failure( + AgvErrorCode::TaskRejected, + "SEER Robokit accepted the free-navigation command, but no stable matching " + "pose task was established within " + + std::to_string(kPoseNavigationStartTimeout.count()) + + " ms; last " + detail + + "; do not retry automatically before checking or canceling navigation"); +} + +AgvResult SeerRobokitAgv::cancelTrackedNavigation_( + const TrackedNavigationContext& context, + std::uint64_t& accepted_generation) +{ + accepted_generation = 0; + Json::Value response; + const auto cancel_command = context.type == AgvTaskType::FollowPath + ? kRobotTaskClearTargetList + : kRobotTaskCancel; + auto result = sendControlledCommand_( + sock_navigation_, + cancel_command, + Json::Value(Json::objectValue), + &response, + &accepted_generation, + nullptr, + nullptr, + nullptr, + false, + nullptr, + true, + &context.token, + nullptr, + &context); + if (accepted_generation != 0) { + clearPoseTask_(accepted_generation); + } + return result; +} + +AgvResult SeerRobokitAgv::confirmMotionStopped() +{ + TrackedNavigationContext tracked_navigation; + if (currentTrackedNavigation_(tracked_navigation)) { + return waitForCanceledTaskToStop_( + tracked_navigation, + AgvMotionOptions{}, + "explicit motion-stop confirmation", + true); + } + + const auto confirmation_window = + kNavigationCancelConfirmationTimeout; + const auto deadline = + std::chrono::steady_clock::now() + confirmation_window; + int stopped_samples = 0; + std::string last_detail = "no 1101 status received"; + while (std::chrono::steady_clock::now() < deadline) { + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit stopped state could not be confirmed with 1101: " + + snapshot_result.message); + } + + last_detail = snapshot.detail; + const bool no_active_navigation = + snapshot.task_status_present && + globalTaskStateIsKnownTerminal(snapshot.task_status); + if (no_active_navigation && navigationStopped(snapshot)) { + ++stopped_samples; + if (stopped_samples >= kRequiredCompletedStopSamples) { + return { + AgvErrorCode::OK, + "no active navigation and two zero-velocity samples were " + "confirmed with 1101"}; + } + } else { + stopped_samples = 0; + } + + const auto now = std::chrono::steady_clock::now(); + if (now < deadline) { + std::this_thread::sleep_for(std::min( + kNavigationCancelPollInterval, + std::chrono::duration_cast( + deadline - now))); + } + } + + return AgvResult::failure( + AgvErrorCode::Timeout, + "SEER Robokit did not confirm an inactive navigation task and two " + "zero-velocity samples within " + + std::to_string(confirmation_window.count()) + + " ms; last_status=" + last_detail); +} + +AgvResult SeerRobokitAgv::waitForCanceledTaskToStop_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options, + const std::string& reason, + const bool require_global_stopped) +{ + if (context.task_ids.empty()) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit cannot confirm cancellation without a tracked task id"); + } + + (void)options; + const auto confirmation_window = kNavigationCancelConfirmationTimeout; + const auto deadline = + std::chrono::steady_clock::now() + confirmation_window; + int stopped_samples = 0; + std::string last_detail = "no post-cancel status received"; + while (std::chrono::steady_clock::now() < deadline) { + std::vector task_statuses; + const auto task_result = queryTaskStatuses_( + context.task_ids, + task_statuses); + if (!task_result.ok()) { + return AgvResult::failure( + task_result.code, + "SEER Robokit navigation cancel was sent, but exact task " + "termination could not be queried: " + task_result.message); + } + + std::ostringstream exact_detail; + bool all_exact_tasks_terminal = !task_statuses.empty(); + bool any_exact_task_active = false; + for (std::size_t index = 0; index < task_statuses.size(); ++index) { + if (index > 0) { + exact_detail << "; "; + } + const auto& status = task_statuses[index]; + exact_detail << status.detail; + if (!status.found + || !exactTaskStateIsKnownTerminal(status.state)) { + all_exact_tasks_terminal = false; + } + if (status.found && exactTaskStateIsActive(status.state)) { + any_exact_task_active = true; + } + } + last_detail = exact_detail.str(); + + TrackedNavigationContext active_context; + const bool another_local_navigation_started = + currentTrackedNavigation_(active_context) + && active_context.token != context.token; + if (all_exact_tasks_terminal && another_local_navigation_started && + !require_global_stopped) { + // A later navigation is allowed to move after this exact task has + // reached a terminal state. Its velocity must not keep the older + // waiter alive or make it cancel the newer task. + for (const auto& task_id : context.task_ids) { + clearPoseTaskIfTaskId_(task_id); + } + return { + AgvErrorCode::OK, + "old exact task ids are terminal; global stopped state was " + "not inspected because a newer local navigation owns 1101"}; + } + if (another_local_navigation_started) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit conditional navigation cancel could not confirm all " + "exact task ids terminal before a newer local navigation " + "started; the newer task was not inspected or canceled; " + + last_detail); + } + + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + return AgvResult::failure( + snapshot_result.code, + "SEER Robokit navigation cancel was sent, but stopped state " + "could not be confirmed with 1101: " + + snapshot_result.message); + } + last_detail += ", " + snapshot.detail; + const bool global_type_matches = + globalNavigationTaskTypeMatches( + context.type, + snapshot.task_type); + const bool global_target_matches = snapshot.target_id.empty() + || context.target_ids.empty() + || std::find( + context.target_ids.begin(), + context.target_ids.end(), + snapshot.target_id) + != context.target_ids.end(); + const bool global_terminal = snapshot.task_status_present && + (snapshot.task_status == 0 + || (exactTaskStateIsKnownTerminal(snapshot.task_status) + && global_type_matches + && global_target_matches)); + const bool task_termination_confirmed = require_global_stopped + ? (!any_exact_task_active && global_terminal) + : (all_exact_tasks_terminal + || (!any_exact_task_active && global_terminal)); + + if (task_termination_confirmed && navigationStopped(snapshot)) { + ++stopped_samples; + if (stopped_samples >= kRequiredCompletedStopSamples) { + for (const auto& task_id : context.task_ids) { + clearPoseTaskIfTaskId_(task_id); + } + clearTrackedNavigationIfToken_(context.token); + return { + AgvErrorCode::OK, + "stopped state was confirmed from task termination and " + "two zero-velocity samples"}; + } + } else { + stopped_samples = 0; + } + const auto now = std::chrono::steady_clock::now(); + if (now < deadline) { + std::this_thread::sleep_for(std::min( + kNavigationCancelPollInterval, + std::chrono::duration_cast( + deadline - now))); + } + } + + return AgvResult::failure( + AgvErrorCode::Timeout, + "SEER Robokit accepted the conditional navigation cancel, but task " + "termination and stopped velocity were not confirmed after " + + std::to_string(confirmation_window.count()) + " ms; reason=" + + reason + ", last_status=" + last_detail + + "; the robot state must be checked before another motion command"); +} + +AgvResult SeerRobokitAgv::failAndCancelTrackedNavigation_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options, + const AgvErrorCode error_code, + const std::string& reason) +{ + const auto same_navigation_identity = []( + const TrackedNavigationContext& lhs, + const TrackedNavigationContext& rhs) { + return lhs.token == rhs.token + && lhs.type == rhs.type + && lhs.task_ids == rhs.task_ids + && lhs.target_id == rhs.target_id + && lhs.target_ids == rhs.target_ids; + }; + + TrackedNavigationContext cancel_context = context; + std::uint64_t cancel_generation = 0; + auto cancel_result = cancelTrackedNavigation_( + cancel_context, + cancel_generation); + + // A public cancel, pause/resume, or emergency stop can advance the control + // generation of this exact logical task while its synchronous waiter is + // handling an error. Refresh only an identical token/type/task/target + // identity; a replacement navigation must remain impossible to cancel. + bool same_task_generation_advanced = false; + for (int refresh_attempt = 0; + !cancel_result.ok() + && cancel_generation == 0 + && cancel_result.code == AgvErrorCode::TaskCanceled + && refresh_attempt < 3; + ++refresh_attempt) { + TrackedNavigationContext latest_context; + if (!currentTrackedNavigation_(latest_context) + || !same_navigation_identity(context, latest_context)) { + break; + } + if (latest_context.navigation_generation + <= cancel_context.navigation_generation) { + // sendControlledCommand_ publishes the global generation just + // before updating the tracked context. Yield across that tiny + // window, but keep the retry bounded. + if (navigation_generation_.load(std::memory_order_relaxed) + > cancel_context.navigation_generation) { + same_task_generation_advanced = true; + std::this_thread::yield(); + continue; + } + break; + } + same_task_generation_advanced = true; + cancel_context = std::move(latest_context); + cancel_generation = 0; + cancel_result = cancelTrackedNavigation_( + cancel_context, + cancel_generation); + } + + bool fail_safe_stop_sent = false; + const auto issue_tracked_fail_safe_stop = [this, + &cancel_context, + &fail_safe_stop_sent]() { + const auto stop_result = + emergencyStopTrackedNavigation_(&cancel_context); + fail_safe_stop_sent = stop_result.ok(); + return stop_result; + }; + + // If 1110/1101 ownership preflight is unavailable, a bare global + // 3003/3067 based only on stale local state could cancel another client's + // task. Escalate explicitly to the controller's software-stop sequence + // (2000 plus the matching navigation cancel), protected by a complete + // navigation-identity check under the control mutex. + const bool ownership_status_unavailable = + cancel_result.code == AgvErrorCode::NotConnected + || cancel_result.code == AgvErrorCode::Timeout + || cancel_result.code == AgvErrorCode::CommandFailed; + if (!cancel_result.ok() && cancel_generation == 0 + && (ownership_status_unavailable || same_task_generation_advanced)) { + const auto stop_result = issue_tracked_fail_safe_stop(); + if (!stop_result.ok()) { + return AgvResult::failure( + error_code, + reason + "; conditional cancel ownership could not be " + "confirmed: " + cancel_result.message + + "; tracked fail-safe software stop/cancel failed: " + + stop_result.message + + "; the stopped state is unconfirmed, so do not retry " + "motion automatically"); + } + } + if (!cancel_result.ok() && cancel_generation == 0 + && !fail_safe_stop_sent) { + return AgvResult::failure( + error_code, + reason + "; conditional cancel was not accepted: " + + cancel_result.message + + "; the original navigation task may still be active or may " + "have been replaced, so do not retry motion automatically"); + } + + auto stopped_result = waitForCanceledTaskToStop_( + cancel_context, + options, + reason); + if (!stopped_result.ok() && !fail_safe_stop_sent) { + // Exact task terminal state is not proof that a differential chassis + // has stopped. If 1101 cannot confirm two zero-velocity samples after + // a normal cancel (or after observing an already-terminal task), issue + // a task-identity-protected software stop before returning an error. + const auto stop_result = issue_tracked_fail_safe_stop(); + if (!stop_result.ok()) { + return AgvResult::failure( + error_code, + reason + "; stopped state could not be confirmed: " + + stopped_result.message + + "; tracked fail-safe software stop/cancel failed: " + + stop_result.message + + "; the stopped state remains unconfirmed, so do not " + "retry motion automatically"); + } + stopped_result = waitForCanceledTaskToStop_( + cancel_context, + options, + reason); + } + if (!stopped_result.ok()) { + const std::string cancel_detail = fail_safe_stop_sent + ? "; tracked fail-safe software stop and navigation cancel were issued" + : (cancel_generation != 0 + ? "; controller accepted conditional cancel" + : (cancel_result.ok() + ? "; exact task was already terminal, so global cancel was not sent" + : "; conditional cancel response was indeterminate: " + + cancel_result.message)); + return AgvResult::failure( + error_code, + reason + cancel_detail + "; stopped state remains unconfirmed: " + + stopped_result.message); + } + + const std::string cancel_detail = fail_safe_stop_sent + ? "; a tracked fail-safe software stop and navigation cancel were issued" + : (cancel_generation != 0 + ? "; the tracked navigation task was conditionally canceled" + : (cancel_result.ok() + ? "; the exact task was already terminal and no global cancel was sent" + : "; cancel response was indeterminate, but the exact task subsequently terminated")); + return AgvResult::failure( + error_code, + reason + cancel_detail + "; " + stopped_result.message); +} + +AgvResult SeerRobokitAgv::waitForTrackedNavigationTerminal_( + const TrackedNavigationContext& context, + const AgvMotionOptions& options) +{ + if (context.task_ids.empty()) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit synchronous navigation has no task id to track"); + } + + const auto poll_interval = navigationPollInterval(options); + const auto deadline = std::chrono::steady_clock::now() + + navigationWaitTimeout(options); + const auto blocked_timeout = navigationBlockedTimeout(options); + const auto accepted_at = context.accepted_at + == std::chrono::steady_clock::time_point{} + ? std::chrono::steady_clock::now() + : context.accepted_at; + const auto start_deadline = accepted_at + kPoseNavigationStartTimeout; + const auto fast_completion_deadline = + start_deadline + kNavigationCancelConfirmationTimeout; + bool any_task_observed = false; + bool final_completion_observed = false; + AgvErrorCode terminal_error = AgvErrorCode::OK; + std::string terminal_reason; + std::chrono::steady_clock::time_point blocked_since; + int terminal_stopped_samples = 0; + int fast_completion_stopped_samples = 0; + std::string last_detail = "no task status received"; + bool superseded_wait_active = false; + std::chrono::steady_clock::time_point superseded_deadline; + + // queryTaskStatuses_ formats these controller package fields into detail. + // Keep the fallback local to this waiter so older PoseTaskStatus callers do + // not acquire station-navigation-specific state. + const auto task_detail_field = []( + const std::string& detail, + const std::string& field) + -> std::string { + const std::string marker = ", " + field + "="; + const auto value_begin = detail.find(marker); + if (value_begin == std::string::npos) { + return {}; + } + const auto begin = value_begin + marker.size(); + const auto end = detail.find(", ", begin); + return detail.substr( + begin, + end == std::string::npos ? std::string::npos : end - begin); + }; + + const auto task_detail_number = [&task_detail_field]( + const std::string& detail, + const std::string& field, + double& value) { + const std::string text = task_detail_field(detail, field); + if (text.empty()) { + return false; + } + char* end = nullptr; + const double parsed = std::strtod(text.c_str(), &end); + if (end == text.c_str() || *end != '\0' || !std::isfinite(parsed)) { + return false; + } + value = parsed; + return true; + }; + + while (std::chrono::steady_clock::now() < deadline) { + TrackedNavigationContext active_context; + const bool still_current = currentTrackedNavigation_(active_context) + && active_context.token == context.token; + if (navigationCancellationRequested(options)) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit synchronous navigation wait was canceled after " + "the tracked task had already been replaced; the newer " + "task was not canceled"); + } + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::TaskCanceled, + "SEER Robokit synchronous navigation wait was canceled by the caller"); + } + + std::vector task_statuses; + const auto task_result = queryTaskStatuses_( + context.task_ids, + task_statuses); + if (!task_result.ok()) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded navigation exact task query failed; " + "the newer task was not canceled: " + task_result.message); + } + return failAndCancelTrackedNavigation_( + context, + options, + task_result.code, + "SEER Robokit synchronous navigation exact task query failed: " + + task_result.message); + } + std::ostringstream exact_detail; + bool any_status_found_now = false; + bool any_exact_active = false; + bool all_exact_terminal_now = !task_statuses.empty(); + for (std::size_t index = 0; index < task_statuses.size(); ++index) { + auto& task_status = task_statuses[index]; + if (index > 0) { + exact_detail << "; "; + } + exact_detail << task_status.detail; + if (!task_status.found || task_status.state == 404) { + all_exact_terminal_now = false; + continue; + } + any_status_found_now = true; + any_task_observed = true; + if (task_status.state >= 1 && task_status.state <= 3) { + any_exact_active = true; + } + if (!exactTaskStateIsKnownTerminal(task_status.state)) { + all_exact_terminal_now = false; + } + if (task_status.type_present) { + const bool expected_type = + exactTrackedNavigationTaskTypeMatches( + context.type, + task_status.type); + if (!expected_type) { + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::TaskRejected, + "SEER Robokit exact task id reported an unexpected task " + "type: " + task_status.detail); + } + } + if (task_status.state == 5 || task_status.state == 7) { + terminal_error = AgvErrorCode::TaskFailed; + terminal_reason = + "SEER Robokit tracked navigation segment failed: " + + task_status.detail; + } else if (task_status.state == 6 + && terminal_error == AgvErrorCode::OK) { + terminal_error = AgvErrorCode::TaskCanceled; + terminal_reason = + "SEER Robokit tracked navigation segment was canceled: " + + task_status.detail; + } else if (task_status.state == 4 + && index + 1 == task_statuses.size()) { + final_completion_observed = true; + } else if (task_status.state < 1 + || task_status.state > 7) { + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::TaskFailed, + "SEER Robokit tracked navigation reported an unsupported " + "terminal or vendor-specific state: " + task_status.detail); + } + } + last_detail = exact_detail.str(); + + TrackedNavigationContext post_query_context; + const bool still_current_after_query = + currentTrackedNavigation_(post_query_context) + && post_query_context.token == context.token; + + const auto establishment_observed_at = + std::chrono::steady_clock::now(); + const bool task_start_timed_out = !any_task_observed + && establishment_observed_at >= start_deadline; + const PoseTaskStatus* missing_exact_status = + task_statuses.size() == 1 ? &task_statuses.front() : nullptr; + double fast_completion_distance = 0.0; + const bool fast_completion_distance_present = missing_exact_status + && task_detail_number( + missing_exact_status->detail, + "distance", + fast_completion_distance); + const bool fast_completion_hint = task_start_timed_out + && context.type == AgvTaskType::NavigateToStation + && missing_exact_status + && missing_exact_status->found + && missing_exact_status->state == 404 + && std::isfinite(missing_exact_status->progress) + && missing_exact_status->progress >= 1.0 + && fast_completion_distance_present + && std::abs(fast_completion_distance) <= 0.01 + && task_detail_field( + missing_exact_status->detail, + "target_name") == context.target_id + && task_detail_field( + missing_exact_status->detail, + "closest_target") == context.target_id; + + if (task_start_timed_out && !fast_completion_hint) { + if (!still_current_after_query) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit navigation was superseded before any exact task " + "id was observed; the newer task was not canceled; " + + last_detail); + } + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::TaskRejected, + "SEER Robokit accepted the navigation command, but its exact task " + "id was not established within " + + std::to_string(kPoseNavigationStartTimeout.count()) + + " ms: " + last_detail); + } + + // Once another local control command has replaced this token, never + // consume global 1101 state (it can belong to the newer command) and + // never issue a global cancel. Exact terminal state is sufficient to + // finish the older waiter; otherwise wait briefly for 1110 to settle. + if (!still_current_after_query) { + if (terminal_error != AgvErrorCode::OK) { + return AgvResult::failure(terminal_error, terminal_reason); + } + if (final_completion_observed) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit navigation final task reported Completed, but a " + "newer local task replaced it before stopped state could " + "be confirmed; the newer task was not canceled"); + } + if (any_task_observed && !any_status_found_now) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit navigation was superseded and its exact task " + "status disappeared; the newer task was not canceled; " + + last_detail); + } + if (!superseded_wait_active) { + superseded_wait_active = true; + superseded_deadline = std::chrono::steady_clock::now() + + kNavigationCancelConfirmationTimeout; + } + if (std::chrono::steady_clock::now() >= superseded_deadline) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded navigation exact task remained " + "non-terminal after the replacement grace window; the " + "newer task was not inspected or canceled; " + last_detail); + } + sleepForNavigationPoll( + poll_interval, + std::min(deadline, superseded_deadline), + options); + continue; + } + + const bool failed_path_may_have_hidden_queued_segments = + terminal_error != AgvErrorCode::OK + && context.type == AgvTaskType::FollowPath + && !all_exact_terminal_now; + if (terminal_error != AgvErrorCode::OK + && (any_exact_active + || failed_path_may_have_hidden_queued_segments)) { + return failAndCancelTrackedNavigation_( + context, + options, + terminal_error, + terminal_reason + + "; another exact path segment is still active or remains " + "hidden in the queued path and must be cleared before " + "any global 1101 attribution; " + + last_detail); + } + + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + if (terminal_error != AgvErrorCode::OK + || final_completion_observed) { + last_detail += ", 1101 detail unavailable: " + + snapshot_result.message; + sleepForNavigationPoll(poll_interval, deadline, options); + continue; + } + return failAndCancelTrackedNavigation_( + context, + options, + snapshot_result.code, + "SEER Robokit synchronous navigation safety snapshot failed: " + + snapshot_result.message); + } + last_detail += ", " + snapshot.detail; + + TrackedNavigationContext post_snapshot_context; + if (!currentTrackedNavigation_(post_snapshot_context) + || post_snapshot_context.token != context.token) { + // A concurrent navigation may have replaced this task while 1101 + // was in flight. Discard that global snapshot because it may + // already describe the replacement. + if (terminal_error != AgvErrorCode::OK) { + return AgvResult::failure(terminal_error, terminal_reason); + } + if (final_completion_observed) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit navigation final task reported Completed, but " + "the 1101 snapshot was superseded before stopped state " + "could be confirmed; the newer task was not canceled"); + } + if (!superseded_wait_active) { + superseded_wait_active = true; + superseded_deadline = std::chrono::steady_clock::now() + + kNavigationCancelConfirmationTimeout; + } + if (std::chrono::steady_clock::now() >= superseded_deadline) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded navigation did not expose an exact " + "terminal state during the replacement grace window; the " + "newer task was not inspected or canceled; " + last_detail); + } + sleepForNavigationPoll( + poll_interval, + std::min(deadline, superseded_deadline), + options); + continue; + } + + const bool global_active = snapshot.task_status >= 1 + && snapshot.task_status <= 3; + // 1110 and 1101 are separate controller publications. During the + // task-establishment window, even a newly visible exact task id can + // be paired with an older global snapshot. Until that window closes, + // use 1101 only for physical safety (faults, emergency, blockage and + // velocity), never for ownership or task-terminal attribution. + const bool global_attribution_ready = any_task_observed + && std::chrono::steady_clock::now() >= start_deadline; + const bool attributed_global_active = global_attribution_ready + && global_active; + const bool global_type_matches = + globalNavigationTaskTypeMatches( + context.type, + snapshot.task_type); + const bool global_target_matches = + context.type == AgvTaskType::NavigateToStation + ? (!snapshot.target_id.empty() + && snapshot.target_id == context.target_id) + : (context.type == AgvTaskType::FollowPath + ? (!snapshot.target_id.empty() + && std::find( + context.target_ids.begin(), + context.target_ids.end(), + snapshot.target_id) + != context.target_ids.end()) + : true); + const bool global_matches_context = global_type_matches + && global_target_matches; + const bool attributed_matching_global_active = + attributed_global_active && global_matches_context; + const bool has_immediate_fault = !snapshot.active_faults.empty() + && !snapshot.only_recoverable_blocking_faults; + if (snapshot.emergency || has_immediate_fault) { + return failAndCancelTrackedNavigation_( + context, + options, + snapshot.emergency + ? AgvErrorCode::EmergencyStopped + : AgvErrorCode::Fault, + "SEER Robokit controller reported a navigation safety fault: " + + last_detail); + } + if (terminal_error == AgvErrorCode::OK + && !any_exact_active + && global_attribution_ready + && global_matches_context + && (snapshot.task_status == 5 + || snapshot.task_status == 7)) { + terminal_error = AgvErrorCode::TaskFailed; + terminal_reason = + "SEER Robokit controller reported navigation failure: " + + last_detail; + } else if (terminal_error == AgvErrorCode::OK + && !any_exact_active + && global_attribution_ready + && global_matches_context + && snapshot.task_status == 6) { + terminal_error = AgvErrorCode::TaskCanceled; + terminal_reason = + "SEER Robokit controller reported navigation cancellation: " + + last_detail; + } + if (terminal_error != AgvErrorCode::OK + && (any_exact_active + || attributed_matching_global_active)) { + return failAndCancelTrackedNavigation_( + context, + options, + terminal_error, + terminal_reason + + "; another segment or the global navigation task is " + "still active and must be canceled before returning; " + + last_detail); + } + + if (fast_completion_hint) { + const bool terminal_snapshot = snapshot.task_status == 0 + || (snapshot.task_status == 4 + && global_type_matches + && (snapshot.target_id.empty() + || snapshot.target_id == context.target_id)); + const bool safe_and_stopped = terminal_snapshot + && !snapshot.blocked + && snapshot.active_faults.empty() + && navigationStopped(snapshot); + if (safe_and_stopped) { + ++fast_completion_stopped_samples; + } else { + fast_completion_stopped_samples = 0; + } + if (fast_completion_stopped_samples + >= kRequiredCompletedStopSamples) { + clearTrackedNavigationIfToken_(context.token); + return AgvResult::success(); + } + if (std::chrono::steady_clock::now() + >= fast_completion_deadline) { + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::TaskRejected, + "SEER Robokit navigation task id remained unavailable and " + "fast-completion verification did not establish a matching " + "terminal stopped state: " + last_detail); + } + sleepForNavigationPoll( + poll_interval, + std::min(deadline, fast_completion_deadline), + options); + continue; + } + + const bool blocked_and_stopped = + snapshot.blocked && navigationStopped(snapshot); + const auto blocked_observed_at = std::chrono::steady_clock::now(); + if (blocked_and_stopped) { + if (blocked_since == std::chrono::steady_clock::time_point{}) { + blocked_since = blocked_observed_at; + } + } else { + blocked_since = {}; + } + if (blocked_since != std::chrono::steady_clock::time_point{} + && blocked_observed_at - blocked_since >= blocked_timeout) { + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::Timeout, + "SEER Robokit navigation remained blocked while stopped for " + + std::to_string(blocked_timeout.count()) + + " ms, reaching the configured blocked timeout: " + + last_detail); + } + + bool terminal_candidate = terminal_error != AgvErrorCode::OK; + if (global_attribution_ready + && final_completion_observed + && !any_exact_active) { + const bool expected_completed_snapshot = + snapshot.task_status == 0 + || (snapshot.task_status == 4 + && global_type_matches + && (context.target_id.empty() + || snapshot.target_id.empty() + || snapshot.target_id == context.target_id)); + if (expected_completed_snapshot) { + terminal_candidate = true; + } + } + if (terminal_candidate && navigationStopped(snapshot)) { + ++terminal_stopped_samples; + } else { + terminal_stopped_samples = 0; + } + if (terminal_stopped_samples >= kRequiredCompletedStopSamples) { + clearTrackedNavigationIfToken_(context.token); + if (terminal_error != AgvErrorCode::OK) { + return AgvResult::failure( + terminal_error, + terminal_reason + "; stopped velocity confirmed; " + + last_detail); + } + return AgvResult::success(); + } + + sleepForNavigationPoll(poll_interval, deadline, options); + } + + TrackedNavigationContext active_context; + if (!currentTrackedNavigation_(active_context) + || active_context.token != context.token) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded navigation did not expose an exact terminal " + "state before the wait timeout; the newer task was not canceled; " + "last_status=" + last_detail); + } + if (terminal_error != AgvErrorCode::OK + || final_completion_observed) { + // A terminal task status is not proof that a differential chassis has + // stopped. Keep ownership and enter the same bounded cancellation / + // stop-confirmation path used by all other unsafe exits. If stopped + // state still cannot be established, tracking remains published so a + // later explicit cancel can use the correct 3003/3067 command. + return failAndCancelTrackedNavigation_( + context, + options, + terminal_error != AgvErrorCode::OK + ? terminal_error + : AgvErrorCode::Timeout, + "SEER Robokit navigation reached a terminal task state, but stopped " + "velocity could not be confirmed before timeout; last_status=" + + last_detail); + } + return failAndCancelTrackedNavigation_( + context, + options, + AgvErrorCode::Timeout, + "SEER Robokit synchronous navigation did not reach a terminal stopped " + "state within " + std::to_string(navigationWaitTimeout(options).count()) + + " ms; last_status=" + last_detail); +} + +AgvResult SeerRobokitAgv::waitForPoseNavigationTerminal_( + const PoseTaskContext& pose_context, + const TrackedNavigationContext& navigation_context, + const AgvMotionOptions& options) +{ + const auto poll_interval = navigationPollInterval(options); + const auto deadline = std::chrono::steady_clock::now() + + navigationWaitTimeout(options); + const auto blocked_timeout = navigationBlockedTimeout(options); + const auto accepted_at = navigation_context.accepted_at + == std::chrono::steady_clock::time_point{} + ? std::chrono::steady_clock::now() + : navigation_context.accepted_at; + const auto global_attribution_deadline = + accepted_at + kPoseNavigationStartTimeout; + bool completion_observed = false; + AgvErrorCode terminal_error = AgvErrorCode::OK; + std::string terminal_reason; + std::chrono::steady_clock::time_point blocked_since; + int terminal_stopped_samples = 0; + std::string last_detail = "free-navigation task start was confirmed"; + bool superseded_wait_active = false; + std::chrono::steady_clock::time_point superseded_deadline; + + while (std::chrono::steady_clock::now() < deadline) { + TrackedNavigationContext active_context; + const bool still_current = currentTrackedNavigation_(active_context) + && active_context.token == navigation_context.token; + if (navigationCancellationRequested(options)) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::TaskCanceled, + "SEER Robokit synchronous free-navigation wait was canceled " + "after its task had been replaced; the newer task was not " + "canceled"); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::TaskCanceled, + "SEER Robokit synchronous free-navigation wait was canceled by " + "the caller"); + } + + PoseTaskStatus exact_status; + const auto exact_result = queryPoseTaskStatus_( + pose_context.task_id, + exact_status); + if (!exact_result.ok()) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free-navigation exact task query " + "failed; the newer task was not canceled: " + + exact_result.message); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + exact_result.code, + "SEER Robokit synchronous free-navigation exact task query " + "failed: " + exact_result.message); + } + last_detail = exact_status.detail; + if (!exact_status.found || exact_status.state == 404) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit free-navigation task was superseded and its " + "exact status disappeared; the newer task was not " + "canceled: " + last_detail); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::CommandFailed, + "SEER Robokit exact free-navigation task disappeared after its " + "start was confirmed: " + last_detail); + } + if (exact_status.type_present && exact_status.type != 1) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free-navigation task id reported an " + "unexpected type; the newer task was not canceled: " + + last_detail); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::TaskRejected, + "SEER Robokit exact free-navigation task reported an unexpected " + "type: " + last_detail); + } + if (exact_status.state == 4 && !completion_observed + && terminal_error == AgvErrorCode::OK) { + // A Completed task can still be decelerating. Defer pose + // acceptance until two stopped 1101 samples have been observed; + // an eager 1004 check here can reject a task that settles inside + // tolerance or accept one that later drifts outside it. + completion_observed = true; + } else if ((exact_status.state == 5 || exact_status.state == 7) + && terminal_error == AgvErrorCode::OK) { + terminal_error = AgvErrorCode::TaskFailed; + terminal_reason = + "SEER Robokit free-navigation task failed: " + last_detail; + } else if (exact_status.state == 6 + && terminal_error == AgvErrorCode::OK) { + terminal_error = AgvErrorCode::TaskCanceled; + terminal_reason = + "SEER Robokit free-navigation task was canceled: " + last_detail; + } else if (exact_status.state < 1 || exact_status.state > 7) { + if (!still_current) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free-navigation task reported an " + "unsupported state; the newer task was not canceled: " + + last_detail); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::TaskFailed, + "SEER Robokit exact free-navigation task reported an unsupported " + "state: " + last_detail); + } + + // Re-read the token after the exact 1110 query. A concurrent + // pose command may have replaced the active context while those I/O + // operations were in flight; global 1101 must never be attributed to + // the older waiter in that case. + TrackedNavigationContext post_query_context; + const bool still_current_after_query = + currentTrackedNavigation_(post_query_context) + && post_query_context.token == navigation_context.token; + if (!still_current_after_query) { + if (terminal_error != AgvErrorCode::OK) { + clearPoseTaskIfTaskId_(pose_context.task_id); + return AgvResult::failure(terminal_error, terminal_reason); + } + if (completion_observed) { + clearPoseTaskIfTaskId_(pose_context.task_id); + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit free-navigation task reported Completed, but a " + "newer local task replaced it before final stopped-pose " + "verification; the newer task was not canceled"); + } + if (!superseded_wait_active) { + superseded_wait_active = true; + superseded_deadline = std::chrono::steady_clock::now() + + kNavigationCancelConfirmationTimeout; + } + if (std::chrono::steady_clock::now() >= superseded_deadline) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free-navigation task remained " + "non-terminal after the replacement grace window; the " + "newer task was not inspected or canceled; " + last_detail); + } + sleepForNavigationPoll( + poll_interval, + std::min(deadline, superseded_deadline), + options); + continue; + } + + NavigationSnapshot snapshot; + const auto snapshot_result = queryNavigationSnapshot_(snapshot); + if (!snapshot_result.ok()) { + if (terminal_error != AgvErrorCode::OK || completion_observed) { + last_detail += ", 1101 detail unavailable: " + + snapshot_result.message; + sleepForNavigationPoll(poll_interval, deadline, options); + continue; + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + snapshot_result.code, + "SEER Robokit synchronous free-navigation safety snapshot " + "failed: " + snapshot_result.message); + } + last_detail += ", " + snapshot.detail; + + TrackedNavigationContext post_snapshot_context; + if (!currentTrackedNavigation_(post_snapshot_context) + || post_snapshot_context.token != navigation_context.token) { + // The snapshot may describe the replacement task; discard it. + if (terminal_error != AgvErrorCode::OK) { + clearPoseTaskIfTaskId_(pose_context.task_id); + return AgvResult::failure(terminal_error, terminal_reason); + } + if (completion_observed) { + clearPoseTaskIfTaskId_(pose_context.task_id); + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit free-navigation task reported Completed, but the " + "1101 snapshot was superseded before final stopped-pose " + "verification; the newer task was not canceled"); + } + if (!superseded_wait_active) { + superseded_wait_active = true; + superseded_deadline = std::chrono::steady_clock::now() + + kNavigationCancelConfirmationTimeout; + } + if (std::chrono::steady_clock::now() >= superseded_deadline) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free navigation did not expose an " + "exact terminal state during the replacement grace " + "window; the newer task was not inspected or canceled; " + + last_detail); + } + sleepForNavigationPoll( + poll_interval, + std::min(deadline, superseded_deadline), + options); + continue; + } + + const bool global_active = exactTaskStateIsActive( + snapshot.task_status); + const bool global_attribution_ready = + std::chrono::steady_clock::now() + >= global_attribution_deadline; + const bool attributed_global_active = global_attribution_ready + && global_active; + const bool attributed_matching_global_active = + attributed_global_active && snapshot.task_type == 1; + + const bool has_immediate_fault = !snapshot.active_faults.empty() + && !snapshot.only_recoverable_blocking_faults; + if (snapshot.emergency || has_immediate_fault) { + return failAndCancelTrackedNavigation_( + navigation_context, + options, + snapshot.emergency + ? AgvErrorCode::EmergencyStopped + : AgvErrorCode::Fault, + "SEER Robokit controller reported a free-navigation safety " + "fault: " + last_detail); + } + + if (terminal_error == AgvErrorCode::OK + && !exactTaskStateIsActive(exact_status.state) + && global_attribution_ready + && snapshot.task_type == 1 + && (snapshot.task_status == 5 + || snapshot.task_status == 7)) { + terminal_error = AgvErrorCode::TaskFailed; + terminal_reason = + "SEER Robokit controller reported free-navigation failure: " + + last_detail; + } else if (terminal_error == AgvErrorCode::OK + && !exactTaskStateIsActive(exact_status.state) + && global_attribution_ready + && snapshot.task_type == 1 + && snapshot.task_status == 6) { + terminal_error = AgvErrorCode::TaskCanceled; + terminal_reason = + "SEER Robokit controller reported free-navigation cancellation: " + + last_detail; + } + if (terminal_error != AgvErrorCode::OK + && (exactTaskStateIsActive(exact_status.state) + || attributed_matching_global_active)) { + return failAndCancelTrackedNavigation_( + navigation_context, + options, + terminal_error, + terminal_reason + + "; the exact or global free-navigation task is still " + "active and must be canceled before returning; " + + last_detail); + } + + const bool blocked_and_stopped = + snapshot.blocked && navigationStopped(snapshot); + const auto blocked_observed_at = std::chrono::steady_clock::now(); + if (blocked_and_stopped) { + if (blocked_since == std::chrono::steady_clock::time_point{}) { + blocked_since = blocked_observed_at; + } + } else { + blocked_since = {}; + } + if (blocked_since != std::chrono::steady_clock::time_point{} + && blocked_observed_at - blocked_since >= blocked_timeout) { + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::Timeout, + "SEER Robokit free navigation remained blocked while stopped for " + + std::to_string(blocked_timeout.count()) + + " ms, reaching the configured blocked timeout: " + + last_detail); + } + + const bool expected_completed_snapshot = global_attribution_ready + && completion_observed + && exact_status.state == 4 + && (snapshot.task_status == 0 + || (snapshot.task_status == 4 + && snapshot.task_type == 1)); + if ((terminal_error != AgvErrorCode::OK + || expected_completed_snapshot) + && navigationStopped(snapshot)) { + ++terminal_stopped_samples; + } else { + terminal_stopped_samples = 0; + } + if (terminal_stopped_samples >= kRequiredCompletedStopSamples) { + if (terminal_error != AgvErrorCode::OK) { + clearPoseTaskIfTaskId_(pose_context.task_id); + clearTrackedNavigationIfToken_(navigation_context.token); + return AgvResult::failure( + terminal_error, + terminal_reason + "; stopped velocity confirmed; " + + last_detail); + } + + std::string final_pose_detail; + const bool final_pose_reached = + poseTargetReached_(pose_context, final_pose_detail); + TrackedNavigationContext post_pose_context; + if (!currentTrackedNavigation_(post_pose_context) + || post_pose_context.token != navigation_context.token) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit free-navigation completion was superseded during " + "the final stopped-pose verification; the newer task was " + "not canceled; " + final_pose_detail); + } + clearPoseTaskIfTaskId_(pose_context.task_id); + clearTrackedNavigationIfToken_(navigation_context.token); + if (!final_pose_reached) { + return AgvResult::failure( + AgvErrorCode::TaskRejected, + "SEER Robokit free-navigation task stopped after reporting " + "Completed, but the final pose was outside the requested " + "tolerance: " + final_pose_detail); + } + return AgvResult::success(); + } + + sleepForNavigationPoll(poll_interval, deadline, options); + } + + TrackedNavigationContext active_context; + if (!currentTrackedNavigation_(active_context) + || active_context.token != navigation_context.token) { + return AgvResult::failure( + AgvErrorCode::CommandFailed, + "SEER Robokit superseded free navigation did not expose an exact " + "terminal state before timeout; the newer task was not canceled; " + "last_status=" + last_detail); + } + if (terminal_error != AgvErrorCode::OK || completion_observed) { + return failAndCancelTrackedNavigation_( + navigation_context, + options, + terminal_error != AgvErrorCode::OK + ? terminal_error + : AgvErrorCode::Timeout, + "SEER Robokit free-navigation task reached a terminal state, but " + "stopped velocity could not be confirmed before timeout; " + "last_status=" + last_detail); + } + return failAndCancelTrackedNavigation_( + navigation_context, + options, + AgvErrorCode::Timeout, + "SEER Robokit synchronous free navigation did not reach its verified " + "target and stop within " + + std::to_string(navigationWaitTimeout(options).count()) + + " ms; last_status=" + last_detail); +} + +} // namespace cmvr::device diff --git a/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt b/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt index d56d09cb..64d4cca8 100644 --- a/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt +++ b/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt @@ -2,6 +2,8 @@ add_library(aubo_arm SHARED aubo_arm.cpp ) +find_package(Threads REQUIRED) + target_include_directories(aubo_arm PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set(AUBO_SDK_ROOT ${CMAKE_SOURCE_DIR}/dependency/${ARCH}/third_party/aubo_sdk/v0.27.1) @@ -71,6 +73,8 @@ target_link_libraries(aubo_arm cmvr_es::proto PRIVATE glog + jsoncpp + Threads::Threads ) add_library(cmvr_es::device::aubo_arm ALIAS aubo_arm) diff --git a/cmvr-es/devices/arm/aubo_arm/README.md b/cmvr-es/devices/arm/aubo_arm/README.md new file mode 100644 index 00000000..fe7e0c5e --- /dev/null +++ b/cmvr-es/devices/arm/aubo_arm/README.md @@ -0,0 +1,139 @@ +# AUBO RobotArm 与控制柜 IO + +`AuboArm` 是 AUBO SDK v0.27.1 的 `RobotArm` 后端。控制柜 Standard 数字 IO +通过设备通用的 `executeJsonCommand` 接口访问,远程调用复用 +`cmvr.api.ArmService/ExecuteJsonCommand`,不经过 `SystemService` 或 +`MotorService`。该 RPC 只路由到 `RobotArm`,不会把 JSON 命令转发给其他设备类型。 +旧的 `cmvr.api.SystemService/ExecuteJsonCommand` 不再注册,调用方必须更新服务路径; +请求和响应消息结构保持不变。 + +返回 [Devices 模块指南](../../README.md) 或 [项目总览](../../../../README.md)。 + +## 代码与配置 + +- 实现:[`aubo_arm.h`](aubo_arm.h)、[`aubo_arm.cpp`](aubo_arm.cpp) +- 设备配置:[`../../../config/devices/arm/aubo_arm.pb.txt`](../../../config/devices/arm/aubo_arm.pb.txt) +- DeviceManager 配置: + [`../../../config/manager/device_manager.pb.txt`](../../../config/manager/device_manager.pb.txt) +- ArmService 实现: + [`../../../service/grpc/server/src/grpc_arm_service.cpp`](../../../service/grpc/server/src/grpc_arm_service.cpp) +- Proto:[`../../../../protos/cmvr/api/arm_service.proto`](../../../../protos/cmvr/api/arm_service.proto) + +仓库配置使用 SDK RPC 端口 `30004`。现场部署必须填写真实控制器地址和凭据, +不要把生产密码提交到默认配置。 + +## 控制柜 Standard 数字 IO + +当前支持: + +| `operation` | 说明 | 必填字段 | +| --- | --- | --- | +| `get_di` | 读取控制柜数字输入 | `index` | +| `get_do` | 读取控制柜数字输出及其 runstate | `index` | +| `set_do` | 设置控制柜数字输出 | `index`、`value` | + +JSON 命令: + +```json +{"command":"cabinet_io","operation":"get_di","index":0} +{"command":"cabinet_io","operation":"get_do","index":0} +{"command":"cabinet_io","operation":"set_do","index":0,"value":true} +``` + +`index` 从 `0` 开始,运行时根据控制器返回的 IO 数量检查范围。 +`set_do.value` 必须是 JSON 布尔值 `true` 或 `false`,不接受 `0/1` 或字符串。 +`set_do` 成功响应中的 `requested_value` 只表示 SDK 已接受请求;确认实际输出时 +必须再调用 `get_do`。 + +读取成功响应示例: + +```json +{ + "success": true, + "command": "cabinet_io", + "operation": "get_di", + "index": 0, + "count": 16, + "value": false +} +``` + +## 通过 gRPC 调用 + +默认 gRPC 端口为 `50052`。读取 DI0: + +```shell +grpcurl -plaintext \ + -d '{ + "header":{"deviceId":"aubo_arm"}, + "requestJson":"{\"command\":\"cabinet_io\",\"operation\":\"get_di\",\"index\":0}" + }' \ + 127.0.0.1:50052 \ + cmvr.api.ArmService/ExecuteJsonCommand +``` + +设置 DO0 为高电平: + +```shell +grpcurl -plaintext \ + -d '{ + "header":{"deviceId":"aubo_arm"}, + "requestJson":"{\"command\":\"cabinet_io\",\"operation\":\"set_do\",\"index\":0,\"value\":true}" + }' \ + 127.0.0.1:50052 \ + cmvr.api.ArmService/ExecuteJsonCommand +``` + +使用源码默认配置时: + +1. 在 `cmvr-es/config/devices/arm/aubo_arm.pb.txt` 填写正确地址和登录信息; +2. 在 `cmvr-es/config/manager/device_manager.pb.txt` 将 `aubo_arm.enable` + 改为 `true`; +3. 重新安装配置并启动安装产物。 + +```shell +cmake --install build +./output/bin/cmvr_es +``` + +`output/bin/cmvr_es` 默认读取 `output/bin/config/`。使用 `--config` 时,应修改 +对应外部配置根。设备未启用或初始化失败时,gRPC 返回 +`Device not found: aubo_arm`。 + +## 安全与语义边界 + +- 后端使用独立 SDK RPC 会话持续读取控制器的 `SafetyModeType`、 + `RobotModeType` 和硬件急停来源;首次有效样本前、监控断线或样本过期时, + 所有 Move、Speed、Servo 和程序启动请求均按不安全状态拒绝; +- 硬件急停会立即使当前运动 generation 失效,并在急停输入有效期间保持锁存。 + AUBO SDK 将示教器/控制柜急停报告为 `RobotEmergencyStop`,将控制器系统急停 + (外部系统急停输入)报告为 `SystemEmergencyStop`;两者在本后端都属于硬件急停。 + 检测到任一硬件急停输入消失且控制器重新报告 `Normal`/`ReducedMode` 后,后端自动 + 执行 `poweron()` 和 `startup()`,恢复到 `Running` 后再完成安全确认并开放新的 gRPC + 控制指令;防护停机和 Safety Fault/Violation 仍保持显式恢复语义; +- `emergencyStop()` 使用独立的 `SoftwareEmergencyStop` 锁存。即使软件急停在真实 + 硬件急停有效期间触发,后续硬件采样也不能覆盖该锁存,释放硬件急停开关不会 + 自动清除软件急停;它只能通过显式安全恢复流程解除; +- 锁存后会终止直接运动与程序、关闭 servo 模式并清理控制器轨迹。硬件急停 + 自动恢复先上电到 `Idle`,在刹车释放前清理 runtime、servo 和轨迹队列,再执行 + `startup()`;到达 `Running` 后还会再次确认 `ExecId == -1`、普通队列和轨迹队列 + 均为空、运行时已停止且机械臂稳定,全部成立后才能解除锁存; +- 当前 AUBO 配置通过 `auto_power_on_after_hardware_estop_release: true` 显式启用自动 + 上电。自动确认失败时继续保持 fail-closed,并允许通过 `torqueOn`/`clearFault`/ + `unlockProtectiveStop` 显式重试;本轮释放期间收到 `stopMotion()` 或 `torqueOff()` + 会取消自动上电,显式停止始终优先; +- 恢复流程只调用 `poweron()` 和 `startup()`,不会调用 `resume`、`arbitraryResume`、 + `startMove`,也不会重新提交急停前的目标、速度、servo 指令或程序; +- AUBO SDK 未在本地文档中保证急停期间 `clearPath` 的可用性,也未说明释放 + 急停开关后的控制器恢复时序。因此自动恢复必须在释放后再次清队列并完成上述 + 安全确认;无法确认时不得解除锁存。“释放开关后零位移”的最终保证仍需真机 + 验证及控制器侧安全配置配合; +- 只访问控制柜 Standard 数字 IO,不访问工具端 IO、可配置 IO 或安全 IO; +- `set_do` 不修改输出 runstate; +- 只有 `StandardOutputRunState::None` 的通道允许写入,否则返回 + `output_managed_by_runstate`; +- 普通访问不会调用会重置全部输出配置的 + `setDigitalOutputRunstateDefault()`; +- 模拟量 IO 涉及 domain、单位和量程,当前 JSON 接口不开放; +- gRPC/JSON 返回成功不代表目标 IO 具备功能安全等级; +- 真实写测试前应确认通道用途、负载、电气隔离、默认电平和控制器程序所有权。 diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_arm.cpp b/cmvr-es/devices/arm/aubo_arm/aubo_arm.cpp index 41dedc9f..3c5b52d0 100644 --- a/cmvr-es/devices/arm/aubo_arm/aubo_arm.cpp +++ b/cmvr-es/devices/arm/aubo_arm/aubo_arm.cpp @@ -1,23 +1,230 @@ #include "devices/arm/aubo_arm/aubo_arm.h" +#include "devices/arm/aubo_arm/aubo_motion_result.h" +#include "devices/arm/aubo_arm/aubo_motion_state.h" +#include "devices/arm/aubo_arm/aubo_safety_state.h" +#include "devices/arm/aubo_arm/aubo_torque_on_result.h" + #include +#include #include +#include +#include #include +#include #include #include +#include #include "common/base/logging/logger.h" +#include "json/json.h" #include "aubo_sdk/rpc.h" namespace cmvr::device { namespace { -struct BusyGuard { - std::atomic& busy; - ~BusyGuard() { busy.store(false); } +bool cancellationRequested( + const std::function& cancellation_requested) noexcept +{ + if (!cancellation_requested) { + return false; + } + try { + return cancellation_requested(); + } catch (...) { + // A broken cancellation source must never permit a queued motion to be + // submitted after its ownership can no longer be established. + return true; + } +} + +class MotionOwnerGuard final { +public: + MotionOwnerGuard( + aubo_internal::MotionState& state, + std::atomic& busy, + const aubo_internal::MotionToken token) + : state_(state), busy_(busy), token_(token) + { + } + + ~MotionOwnerGuard() noexcept + { + try { + if (requires_settlement_ && !settled_) { + state_.failMotion(token_); + } else { + state_.finish(token_, finish_mode_); + } + busy_.store(state_.busy()); + } catch (...) { + // A failed state lock must not terminate an RPC unwind. Preserve + // the conservative externally visible state instead. + busy_.store(true); + } + } + + MotionOwnerGuard(const MotionOwnerGuard&) = delete; + MotionOwnerGuard& operator=(const MotionOwnerGuard&) = delete; + + void requireExplicitSettlement() noexcept + { + requires_settlement_ = true; + } + + void settle() noexcept { settled_ = true; } + + void clearOnFinish() noexcept + { + finish_mode_ = aubo_internal::MotionFinishMode::Clear; + } + + void retainKind() noexcept + { + finish_mode_ = aubo_internal::MotionFinishMode::Retain; + } + +private: + aubo_internal::MotionState& state_; + std::atomic& busy_; + aubo_internal::MotionToken token_; + aubo_internal::MotionFinishMode finish_mode_{ + aubo_internal::MotionFinishMode::RestorePrevious}; + bool requires_settlement_{false}; + bool settled_{false}; }; +class StopStateGuard final { +public: + StopStateGuard( + aubo_internal::MotionState& state, + std::atomic& busy) + : state_(state), busy_(busy) + { + } + + ~StopStateGuard() noexcept + { + if (!completed_) { + try { + state_.failStop(); + } catch (...) { + // Keep the facade fail-closed even if state cleanup fails. + } + busy_.store(true); + } + } + + StopStateGuard(const StopStateGuard&) = delete; + StopStateGuard& operator=(const StopStateGuard&) = delete; + + bool complete() + { + if (!state_.completeStop()) { + return false; + } + busy_.store(false); + completed_ = true; + return true; + } + +private: + aubo_internal::MotionState& state_; + std::atomic& busy_; + bool completed_{false}; +}; + +class SafetyRecoveryGuard final { +public: + SafetyRecoveryGuard( + std::shared_ptr state, + const aubo_internal::RecoveryToken token) + : state_(std::move(state)), token_(token) + { + } + + ~SafetyRecoveryGuard() noexcept + { + if (!completed_ && state_) { + try { + state_->failRecovery(token_); + } catch (...) { + // The safety latch itself remains set on every failure path. + } + } + } + + SafetyRecoveryGuard(const SafetyRecoveryGuard&) = delete; + SafetyRecoveryGuard& operator=(const SafetyRecoveryGuard&) = delete; + + bool complete( + const bool robot_running, + const bool controller_idle, + const bool cancellation_confirmed) + { + if (!state_->completeRecovery( + token_, + robot_running, + controller_idle, + cancellation_confirmed)) { + return false; + } + completed_ = true; + return true; + } + + bool completeHardwareEmergencyStop( + const bool robot_running, + const bool controller_idle, + const bool cancellation_confirmed) + { + if (!state_->completeHardwareEmergencyStopRecovery( + token_, robot_running, controller_idle, + cancellation_confirmed)) { + return false; + } + completed_ = true; + return true; + } + +private: + std::shared_ptr state_; + aubo_internal::RecoveryToken token_; + bool completed_{false}; +}; + +const char* motionStartFailure( + const aubo_internal::MotionStartStatus status) noexcept +{ + switch (status) { + case aubo_internal::MotionStartStatus::Invalid: + return "invalid motion type"; + case aubo_internal::MotionStartStatus::Busy: + return "another motion is active"; + case aubo_internal::MotionStartStatus::Stopping: + return "a stop operation is in progress"; + case aubo_internal::MotionStartStatus::Blocked: + return "the previous stop did not complete; retry stopMotion or reconnect"; + case aubo_internal::MotionStartStatus::Started: + break; + } + return "unknown motion state"; +} + +const char* motionKindName(const aubo_internal::MotionKind kind) noexcept +{ + switch (kind) { + case aubo_internal::MotionKind::Joint: + return "joint"; + case aubo_internal::MotionKind::Linear: + return "linear"; + case aubo_internal::MotionKind::None: + break; + } + return "unknown"; +} + std::vector defaultJointNames(const std::size_t dof) { std::vector names; @@ -40,9 +247,999 @@ std::string vendorBrandName(const config::VendorRobotArmBrand brand) } using arcs::common_interface::RobotModeType; +using arcs::common_interface::RuntimeState; +using arcs::common_interface::SafetyModeType; using arcs::aubo_sdk::RobotInterfacePtr; +RobotInterfacePtr getPrimaryRobotInterface( + const std::shared_ptr& rpc_client, + const std::string& context, + Result& result); + constexpr int kAuboServoMode = 3; +constexpr auto kSafetyPollInterval = std::chrono::milliseconds(50); +constexpr auto kSafetyReconnectInterval = std::chrono::milliseconds(250); +constexpr auto kSafetySampleMaxAge = std::chrono::milliseconds(500); + +std::int64_t monotonicNowNs() noexcept +{ + return std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); +} + +aubo_internal::SafetyCondition safetyConditionFromSdk( + const SafetyModeType mode) noexcept +{ + using Condition = aubo_internal::SafetyCondition; + switch (mode) { + case SafetyModeType::Normal: + return Condition::Normal; + case SafetyModeType::ReducedMode: + return Condition::Reduced; + case SafetyModeType::Recovery: + return Condition::Recovery; + case SafetyModeType::Violation: + return Condition::Violation; + case SafetyModeType::ProtectiveStop: + return Condition::ProtectiveStop; + case SafetyModeType::SafeguardStop: + return Condition::SafeguardStop; + case SafetyModeType::SystemEmergencyStop: + return Condition::SystemEmergencyStop; + case SafetyModeType::RobotEmergencyStop: + return Condition::RobotEmergencyStop; + case SafetyModeType::Fault: + return Condition::Fault; + case SafetyModeType::Undefined: + break; + } + return Condition::Unknown; +} + +const char* safetyConditionName( + const aubo_internal::SafetyCondition condition) noexcept +{ + using Condition = aubo_internal::SafetyCondition; + switch (condition) { + case Condition::Normal: + return "Normal"; + case Condition::Reduced: + return "Reduced"; + case Condition::Recovery: + return "Recovery"; + case Condition::Violation: + return "Violation"; + case Condition::ProtectiveStop: + return "ProtectiveStop"; + case Condition::SafeguardStop: + return "SafeguardStop"; + case Condition::SystemEmergencyStop: + return "SystemEmergencyStop"; + case Condition::RobotEmergencyStop: + return "RobotEmergencyStop"; + case Condition::SoftwareEmergencyStop: + return "SoftwareEmergencyStop"; + case Condition::Fault: + return "Fault"; + case Condition::Unknown: + break; + } + return "Unknown"; +} + +SafetyMode publicSafetyMode( + const aubo_internal::SafetyCondition condition) noexcept +{ + using Condition = aubo_internal::SafetyCondition; + switch (condition) { + case Condition::Normal: + return SafetyMode::Normal; + case Condition::Reduced: + return SafetyMode::Reduced; + case Condition::ProtectiveStop: + return SafetyMode::ProtectiveStop; + case Condition::SafeguardStop: + return SafetyMode::SafeguardStop; + case Condition::SystemEmergencyStop: + return SafetyMode::SystemEmergencyStop; + case Condition::RobotEmergencyStop: + case Condition::SoftwareEmergencyStop: + return SafetyMode::EmergencyStop; + case Condition::Violation: + case Condition::Fault: + return SafetyMode::Fault; + case Condition::Recovery: + case Condition::Unknown: + break; + } + return SafetyMode::Unknown; +} + +RobotMode publicRobotMode(const RobotModeType mode) noexcept +{ + switch (mode) { + case RobotModeType::NoController: + case RobotModeType::Disconnected: + return RobotMode::Disconnected; + case RobotModeType::PowerOff: + case RobotModeType::PowerOffing: + return RobotMode::PowerOff; + case RobotModeType::Running: + return RobotMode::Running; + case RobotModeType::Error: + return RobotMode::Fault; + case RobotModeType::PowerOn: + case RobotModeType::Idle: + case RobotModeType::BrakeReleasing: + case RobotModeType::BackDrive: + return RobotMode::Idle; + case RobotModeType::ConfirmSafety: + case RobotModeType::Booting: + case RobotModeType::Maintaince: + break; + } + return RobotMode::Unknown; +} + +struct AuboSafetyMonitor final { + std::shared_ptr safety_state{ + std::make_shared()}; + std::shared_ptr motion_state; + std::atomic safety_mode{ + static_cast(SafetyModeType::Undefined)}; + std::atomic robot_mode{ + static_cast(RobotModeType::Disconnected)}; + std::atomic runtime_state{ + static_cast(RuntimeState::Stopped)}; + std::atomic emergency_stop_source{-1}; + std::atomic hardware_emergency_stop_latched{false}; + std::atomic automatic_recovery_suppressed{false}; + std::atomic servo_mode_select{0}; + std::atomic last_sample_ns{0}; + std::atomic cancellation_confirmed{true}; + std::atomic runtime_abort_required{false}; + std::atomic servo_disable_required{false}; + std::atomic path_clear_required{false}; + std::atomic stop_requested{false}; + std::mutex wait_mutex; + std::condition_variable wait_cv; + std::mutex termination_mutex; + std::recursive_mutex command_rpc_mutex; + bool auto_power_on_after_hardware_estop_release{false}; + std::function on_hardware_estop_auto_recovered; + std::string arm_id; +}; + +std::shared_ptr makeRpcClient() +{ + return std::shared_ptr( + ::createRpcClient(), + [](arcs::aubo_sdk::RpcClient* client) { + if (client) { + ::destroyRpcClient(client); + } + }); +} + +bool monitorWait( + const std::shared_ptr& monitor, + const std::chrono::milliseconds duration) +{ + std::unique_lock lock(monitor->wait_mutex); + return monitor->wait_cv.wait_for( + lock, + duration, + [&monitor]() { return monitor->stop_requested.load(); }); +} + +void cancelForSafetyTransition( + const std::shared_ptr& monitor) +{ + monitor->cancellation_confirmed.store(false); + if (monitor->runtime_state.load() != + static_cast(RuntimeState::Stopped)) { + monitor->runtime_abort_required.store(true); + } + if (monitor->servo_mode_select.load() != 0) { + monitor->servo_disable_required.store(true); + } + monitor->motion_state->cancelActiveForSafety(); +} + +void publishSafetySample( + const std::shared_ptr& monitor, + const SafetyModeType safety_mode, + const RobotModeType robot_mode, + const RuntimeState runtime_state, + const int emergency_stop_source, + const int servo_mode_select) +{ + const auto previous = monitor->safety_state->snapshot(); + const int previous_runtime_state = monitor->runtime_state.load(); + const int previous_servo_mode = monitor->servo_mode_select.load(); + const auto condition = aubo_internal::effectiveSafetyCondition( + safetyConditionFromSdk(safety_mode), emergency_stop_source); + monitor->safety_state->observe(condition); + const auto current = monitor->safety_state->snapshot(); + + monitor->safety_mode.store(static_cast(safety_mode)); + monitor->robot_mode.store(static_cast(robot_mode)); + monitor->runtime_state.store(static_cast(runtime_state)); + monitor->emergency_stop_source.store(emergency_stop_source); + monitor->servo_mode_select.store(servo_mode_select); + monitor->last_sample_ns.store(monotonicNowNs()); + + if (aubo_internal::isHardwareEmergencyStop(condition)) { + const bool first_sample_for_event = + !monitor->hardware_emergency_stop_latched.exchange(true); + if (first_sample_for_event) { + monitor->automatic_recovery_suppressed.store(false); + } + } else if (!current.latched) { + monitor->hardware_emergency_stop_latched.store(false); + } + + if (previous.observed != condition || + (!previous.latched && current.latched)) { + if (current.latched) { + if (previous_runtime_state != + static_cast(RuntimeState::Stopped) || + runtime_state != RuntimeState::Stopped) { + monitor->runtime_abort_required.store(true); + } + if (previous_servo_mode != 0 || servo_mode_select != 0) { + monitor->servo_disable_required.store(true); + } + cancelForSafetyTransition(monitor); + } + if (current.latched) { + CMVR_LOG(WARNING) + << "[AuboArm] safety state changed, id=" << monitor->arm_id + << ", state=" << safetyConditionName(condition) + << ", latched=true"; + } else { + CMVR_LOG(INFO) + << "[AuboArm] safety state changed, id=" << monitor->arm_id + << ", state=" << safetyConditionName(condition) + << ", latched=false"; + } + } +} + +void refreshSafetySample( + const std::shared_ptr& rpc_client, + const std::shared_ptr& monitor, + const RobotInterfacePtr& robot_interface) +{ + auto robot_state = robot_interface->getRobotState(); + publishSafetySample( + monitor, + robot_state->getSafetyModeType(), + robot_state->getRobotModeType(), + rpc_client->getRuntimeMachine()->getRuntimeState(), + robot_interface->getRobotConfig() + ->getRobotEmergencyStopSource(), + robot_interface->getMotionControl()->getServoModeSelect()); +} + +void publishSafetyUnavailable( + const std::shared_ptr& monitor, + const std::string& reason) +{ + const auto previous = monitor->safety_state->snapshot(); + monitor->safety_state->observe( + aubo_internal::SafetyCondition::Unknown); + monitor->safety_mode.store( + static_cast(SafetyModeType::Undefined)); + monitor->robot_mode.store( + static_cast(RobotModeType::Disconnected)); + monitor->emergency_stop_source.store(-1); + monitor->last_sample_ns.store(0); + if (previous.observed != aubo_internal::SafetyCondition::Unknown || + !previous.latched) { + cancelForSafetyTransition(monitor); + CMVR_LOG(WARNING) + << "[AuboArm] safety monitor unavailable, id=" + << monitor->arm_id << ", reason=" << reason; + } +} + +bool safetySampleFresh( + const std::shared_ptr& monitor) noexcept +{ + const auto sample_ns = monitor->last_sample_ns.load(); + if (sample_ns <= 0) { + return false; + } + const auto age_ns = monotonicNowNs() - sample_ns; + return age_ns >= 0 && + age_ns <= std::chrono::duration_cast( + kSafetySampleMaxAge) + .count(); +} + +bool validateSafetyPermit( + const std::shared_ptr& monitor, + const aubo_internal::SafetyPermit permit) +{ + if (!safetySampleFresh(monitor)) { + publishSafetyUnavailable(monitor, "sample is stale"); + return false; + } + return monitor->emergency_stop_source.load() == 0 && + monitor->robot_mode.load() == + static_cast(RobotModeType::Running) && + monitor->safety_state->validate(permit); +} + +bool enforceControllerTermination( + const std::shared_ptr& rpc_client, + const std::shared_ptr& monitor) +{ + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + std::unique_lock termination_lock(monitor->termination_mutex); + monitor->motion_state->cancelActiveForSafety(); + auto stop_request = monitor->motion_state->beginStop(); + if (!stop_request.started()) { + constexpr auto kExistingStopTimeout = std::chrono::seconds(6); + const auto existing_result = + monitor->motion_state->waitForStopCompletion( + stop_request, + std::chrono::duration_cast( + kExistingStopTimeout)); + if (existing_result == aubo_internal::StopWaitStatus::Timeout) { + monitor->cancellation_confirmed.store(false); + return false; + } + + // A regular stopMotion confirms direct-motion idle, while safety + // termination additionally verifies runtime, servo and controller + // queues. Re-enter the stop state and perform that stronger check. A + // failed existing stop is retried here as well, while MotionState + // remains fail-closed between the two attempts. + monitor->motion_state->cancelActiveForSafety(); + stop_request = monitor->motion_state->beginStop(); + if (!stop_request.started()) { + monitor->cancellation_confirmed.store(false); + return false; + } + } + + const auto fail = [&monitor]() { + monitor->motion_state->failStop(); + monitor->cancellation_confirmed.store(false); + return false; + }; + + try { + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "safety termination", interface_result); + if (!interface_result.ok()) { + return fail(); + } + auto motion_control = robot_interface->getMotionControl(); + auto robot_state = robot_interface->getRobotState(); + auto runtime = rpc_client->getRuntimeMachine(); + + constexpr auto kTerminationTimeout = std::chrono::seconds(2); + constexpr int kStableSamples = 3; + const auto deadline = + std::chrono::steady_clock::now() + kTerminationTimeout; + int stable_samples = 0; + int iteration = 0; + bool typed_stop_acknowledged = + !stop_request.tracked_motion; + while (!monitor->stop_requested.load() && + std::chrono::steady_clock::now() < deadline) { + const int exec_id = motion_control->getExecId(); + const bool steady = robot_state->isSteady(); + int queue_size = motion_control->getQueueSize(); + int trajectory_queue_size = + motion_control->getTrajectoryQueueSize(); + int servo_mode = motion_control->getServoModeSelect(); + auto runtime_state = runtime->getRuntimeState(); + + if (runtime_state != RuntimeState::Stopped) { + monitor->runtime_abort_required.store(true); + } + if (servo_mode != 0) { + monitor->servo_disable_required.store(true); + } + if (queue_size != 0 || trajectory_queue_size != 0) { + monitor->path_clear_required.store(true); + } + + if (monitor->runtime_abort_required.load() && + iteration % 4 == 0 && + runtime->abort() == arcs::common_interface::AUBO_OK) { + monitor->runtime_abort_required.store(false); + } + if (monitor->servo_disable_required.load() && + iteration % 4 == 0 && + motion_control->setServoModeSelect(0) == + arcs::common_interface::AUBO_OK) { + monitor->servo_disable_required.store(false); + } + + const bool controller_moving = exec_id != -1 || !steady; + if ((stop_request.tracked_motion || controller_moving) && + iteration % 4 == 0) { + int stop_ret = arcs::common_interface::AUBO_OK; + if (stop_request.kind == aubo_internal::MotionKind::Joint) { + stop_ret = motion_control->stopJoint(31.0); + } else if (stop_request.kind == + aubo_internal::MotionKind::Linear) { + stop_ret = motion_control->stopLine(10.0, 10.0); + } else { + // RuntimeMachine::abort() is the only typed-independent + // SDK primitive documented to stop arbitrary operation. + monitor->runtime_abort_required.store(true); + stop_ret = runtime->abort(); + if (stop_ret == arcs::common_interface::AUBO_OK) { + monitor->runtime_abort_required.store(false); + } + } + if (stop_request.kind != + aubo_internal::MotionKind::None && + stop_ret == arcs::common_interface::AUBO_OK) { + typed_stop_acknowledged = true; + } + } + + if (monitor->path_clear_required.load() && + iteration % 4 == 0 && + motion_control->clearPath() == + arcs::common_interface::AUBO_OK) { + monitor->path_clear_required.store(false); + } + + queue_size = motion_control->getQueueSize(); + trajectory_queue_size = + motion_control->getTrajectoryQueueSize(); + servo_mode = motion_control->getServoModeSelect(); + runtime_state = runtime->getRuntimeState(); + const bool owner_active = monitor->motion_state->ownerActive( + stop_request.active_token); + const bool idle = + motion_control->getExecId() == -1 && + robot_state->isSteady() && + queue_size == 0 && + trajectory_queue_size == 0 && servo_mode == 0 && + runtime_state == RuntimeState::Stopped && !owner_active && + typed_stop_acknowledged && + !monitor->runtime_abort_required.load() && + !monitor->servo_disable_required.load() && + !monitor->path_clear_required.load() && + aubo_internal::isMotionSafe( + monitor->safety_state->snapshot().observed) && + monitor->emergency_stop_source.load() == 0; + + if (idle) { + if (++stable_samples >= kStableSamples) { + if (!monitor->motion_state->completeStop()) { + return fail(); + } + monitor->servo_mode_select.store(0); + monitor->runtime_state.store( + static_cast(RuntimeState::Stopped)); + monitor->cancellation_confirmed.store(true); + CMVR_LOG(INFO) + << "[AuboArm] safety termination confirmed, id=" + << monitor->arm_id; + return true; + } + } else { + stable_samples = 0; + } + + ++iteration; + if (monitorWait(monitor, kSafetyPollInterval)) { + break; + } + } + } catch (const std::exception& e) { + CMVR_LOG(WARNING) + << "[AuboArm] safety termination attempt failed, id=" + << monitor->arm_id << ", error=" << e.what(); + } + return fail(); +} + +// Powering on to Idle keeps the brakes engaged. This pre-startup phase clears +// the controller queues without completing MotionState, so the retained +// Joint/Linear kind survives until a typed stop is acknowledged in Running. +bool prepareControllerForStartup( + const std::shared_ptr& rpc_client, + const std::shared_ptr& monitor) +{ + std::unique_lock termination_lock(monitor->termination_mutex); + const auto cancellation = + monitor->motion_state->cancelActiveForSafety(); + + try { + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "pre-startup safety cleanup", interface_result); + if (!interface_result.ok()) { + return false; + } + auto motion_control = robot_interface->getMotionControl(); + auto runtime = rpc_client->getRuntimeMachine(); + + constexpr auto kCleanupTimeout = std::chrono::seconds(2); + constexpr int kStableSamples = 3; + const auto deadline = + std::chrono::steady_clock::now() + kCleanupTimeout; + int stable_samples = 0; + int iteration = 0; + while (!monitor->stop_requested.load() && + std::chrono::steady_clock::now() < deadline) { + int queue_size = motion_control->getQueueSize(); + int trajectory_queue_size = + motion_control->getTrajectoryQueueSize(); + int servo_mode = motion_control->getServoModeSelect(); + auto runtime_state = runtime->getRuntimeState(); + + if (runtime_state != RuntimeState::Stopped) { + monitor->runtime_abort_required.store(true); + } + if (servo_mode != 0) { + monitor->servo_disable_required.store(true); + } + if (queue_size != 0 || trajectory_queue_size != 0) { + monitor->path_clear_required.store(true); + } + + if (iteration % 4 == 0) { + if (monitor->runtime_abort_required.load() && + runtime->abort() == arcs::common_interface::AUBO_OK) { + monitor->runtime_abort_required.store(false); + } + if (monitor->servo_disable_required.load() && + motion_control->setServoModeSelect(0) == + arcs::common_interface::AUBO_OK) { + monitor->servo_disable_required.store(false); + } + if (monitor->path_clear_required.load() && + motion_control->clearPath() == + arcs::common_interface::AUBO_OK) { + monitor->path_clear_required.store(false); + } + } + + queue_size = motion_control->getQueueSize(); + trajectory_queue_size = + motion_control->getTrajectoryQueueSize(); + servo_mode = motion_control->getServoModeSelect(); + runtime_state = runtime->getRuntimeState(); + const bool owner_active = + monitor->motion_state->ownerActive( + cancellation.active_token); + const bool queues_cleared = + motion_control->getExecId() == -1 && + queue_size == 0 && trajectory_queue_size == 0 && + servo_mode == 0 && + runtime_state == RuntimeState::Stopped && + !owner_active && + !monitor->runtime_abort_required.load() && + !monitor->servo_disable_required.load() && + !monitor->path_clear_required.load(); + if (queues_cleared) { + if (++stable_samples >= kStableSamples) { + CMVR_LOG(INFO) + << "[AuboArm] pre-startup safety cleanup confirmed, id=" + << monitor->arm_id; + return true; + } + } else { + stable_samples = 0; + } + + ++iteration; + if (monitorWait(monitor, kSafetyPollInterval)) { + break; + } + } + } catch (const std::exception& e) { + CMVR_LOG(WARNING) + << "[AuboArm] pre-startup safety cleanup failed, id=" + << monitor->arm_id << ", error=" << e.what(); + } + return false; +} + +bool controllerStillQuiescent( + const std::shared_ptr& rpc_client, + const RobotInterfacePtr& robot_interface) +{ + auto motion_control = robot_interface->getMotionControl(); + return motion_control->getExecId() == -1 && + motion_control->getQueueSize() == 0 && + motion_control->getTrajectoryQueueSize() == 0 && + robot_interface->getRobotState()->isSteady() && + motion_control->getServoModeSelect() == 0 && + rpc_client->getRuntimeMachine()->getRuntimeState() == + RuntimeState::Stopped; +} + +bool hardwareEmergencyStopRecoveryCurrent( + const std::shared_ptr& monitor, + const aubo_internal::RecoveryToken token) +{ + const auto snapshot = monitor->safety_state->snapshot(); + return token.valid() && !monitor->stop_requested.load() && + !monitor->automatic_recovery_suppressed.load() && + monitor->emergency_stop_source.load() == 0 && snapshot.latched && + snapshot.recovery_in_progress && snapshot.epoch == token.epoch && + !snapshot.software_emergency_stop_latched && + aubo_internal::isHardwareEmergencyStop(snapshot.latched_reason) && + aubo_internal::isMotionSafe(snapshot.observed); +} + +bool waitForHardwareEmergencyStopRecoveryMode( + const RobotInterfacePtr& robot_interface, + const std::shared_ptr& monitor, + const aubo_internal::RecoveryToken token, + const RobotModeType target_mode) +{ + const auto deadline = + std::chrono::steady_clock::now() + std::chrono::seconds(20); + while (std::chrono::steady_clock::now() < deadline) { + if (!hardwareEmergencyStopRecoveryCurrent(monitor, token)) { + return false; + } + if (robot_interface->getRobotState()->getRobotModeType() == + target_mode) { + return true; + } + if (monitorWait(monitor, std::chrono::milliseconds(100))) { + return false; + } + } + return false; +} + +bool autoPowerOnAfterHardwareEmergencyStop( + const std::shared_ptr& rpc_client, + const std::shared_ptr& monitor, + const RobotInterfacePtr& robot_interface) +{ + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + refreshSafetySample(rpc_client, monitor, robot_interface); + const auto snapshot = monitor->safety_state->snapshot(); + if (!aubo_internal::shouldAutoRecoverHardwareEmergencyStop( + snapshot, + monitor->hardware_emergency_stop_latched.load(), + monitor->emergency_stop_source.load(), + monitor->auto_power_on_after_hardware_estop_release, + monitor->automatic_recovery_suppressed.load())) { + return false; + } + + const auto token = monitor->safety_state->beginRecovery(snapshot.epoch); + if (!token.has_value()) { + return false; + } + SafetyRecoveryGuard recovery{monitor->safety_state, *token}; + const auto fail = [&monitor](const std::string& detail) { + CMVR_LOG(WARNING) + << "[AuboArm] hardware emergency-stop automatic power-on " + "failed, id=" + << monitor->arm_id << ", detail=" << detail; + return false; + }; + + try { + cancelForSafetyTransition(monitor); + if (!hardwareEmergencyStopRecoveryCurrent(monitor, *token)) { + return fail("recovery was cancelled before controller setup"); + } + + double mass = 0.0; + std::vector cog(3, 0.0); + std::vector aom(3, 0.0); + std::vector inertia(6, 0.0); + const int payload_ret = robot_interface->getRobotConfig()->setPayload( + mass, cog, aom, inertia); + if (payload_ret != arcs::common_interface::AUBO_OK) { + return fail("setPayload ret=" + std::to_string(payload_ret)); + } + if (!hardwareEmergencyStopRecoveryCurrent(monitor, *token)) { + return fail("recovery was cancelled after payload setup"); + } + + auto current_mode = + robot_interface->getRobotState()->getRobotModeType(); + if (current_mode != RobotModeType::Running && + current_mode != RobotModeType::Idle) { + const int power_on_ret = + robot_interface->getRobotManage()->poweron(); + if (power_on_ret != arcs::common_interface::AUBO_OK) { + return fail("poweron ret=" + std::to_string(power_on_ret)); + } + if (!waitForHardwareEmergencyStopRecoveryMode( + robot_interface, monitor, *token, + RobotModeType::Idle)) { + return fail("Idle was not reached after poweron"); + } + current_mode = RobotModeType::Idle; + } + + refreshSafetySample(rpc_client, monitor, robot_interface); + if (!hardwareEmergencyStopRecoveryCurrent(monitor, *token)) { + return fail("safety state changed before brake release"); + } + + const bool cleanup_ok = current_mode == RobotModeType::Running + ? enforceControllerTermination(rpc_client, monitor) + : prepareControllerForStartup(rpc_client, monitor); + if (!cleanup_ok) { + return fail("old runtime, servo, or path state could not be cleared"); + } + if (!hardwareEmergencyStopRecoveryCurrent(monitor, *token)) { + return fail("safety state changed during pre-startup cleanup"); + } + + if (current_mode != RobotModeType::Running) { + const int startup_ret = + robot_interface->getRobotManage()->startup(); + if (startup_ret != arcs::common_interface::AUBO_OK) { + return fail("startup ret=" + std::to_string(startup_ret)); + } + if (!waitForHardwareEmergencyStopRecoveryMode( + robot_interface, monitor, *token, + RobotModeType::Running)) { + return fail("Running was not reached after startup"); + } + } + + refreshSafetySample(rpc_client, monitor, robot_interface); + if (!hardwareEmergencyStopRecoveryCurrent(monitor, *token) || + monitor->robot_mode.load() != + static_cast(RobotModeType::Running)) { + return fail("controller safety changed during startup"); + } + + // Startup is allowed to energize the arm, but it must not revive an + // old controller operation. Terminate once more in Running mode and + // require a fresh empty/steady observation before reopening commands. + cancelForSafetyTransition(monitor); + if (!enforceControllerTermination(rpc_client, monitor)) { + return fail("post-startup controller quiescence was not confirmed"); + } + refreshSafetySample(rpc_client, monitor, robot_interface); + const bool robot_running = + monitor->robot_mode.load() == + static_cast(RobotModeType::Running); + const bool controller_idle = + robot_running && + hardwareEmergencyStopRecoveryCurrent(monitor, *token) && + controllerStillQuiescent(rpc_client, robot_interface); + if (!recovery.completeHardwareEmergencyStop( + robot_running, + controller_idle, + monitor->cancellation_confirmed.load())) { + return fail("safety epoch changed before recovery commit"); + } + + monitor->hardware_emergency_stop_latched.store(false); + monitor->automatic_recovery_suppressed.store(false); + if (monitor->on_hardware_estop_auto_recovered) { + monitor->on_hardware_estop_auto_recovered(); + } + CMVR_LOG(INFO) + << "[AuboArm] hardware emergency-stop release automatically " + "powered on and enabled, id=" + << monitor->arm_id; + return true; + } catch (const std::exception& error) { + return fail(error.what()); + } catch (...) { + return fail("unknown exception"); + } +} + +void runSafetyMonitor( + const std::shared_ptr& monitor, + const std::string& ip, + const int port, + const std::string& username, + const std::string& password) +{ + while (!monitor->stop_requested.load()) { + auto rpc_client = makeRpcClient(); + try { + if (!rpc_client) { + publishSafetyUnavailable(monitor, "create RPC client failed"); + } else { + rpc_client->setRequestTimeout(250); + const int connect_ret = rpc_client->connect(ip, port); + const int login_ret = connect_ret == 0 + ? rpc_client->login(username, password) + : connect_ret; + if (connect_ret != 0 || login_ret != 0) { + publishSafetyUnavailable( + monitor, + "monitor RPC connect/login failed"); + } else { + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "safety monitor", interface_result); + if (!interface_result.ok()) { + publishSafetyUnavailable( + monitor, interface_result.message); + } else { + while (!monitor->stop_requested.load()) { + refreshSafetySample( + rpc_client, monitor, robot_interface); + + auto safety = monitor->safety_state->snapshot(); + const bool hardware_estop_released = + aubo_internal:: + shouldAutoRecoverHardwareEmergencyStop( + safety, + monitor + ->hardware_emergency_stop_latched + .load(), + monitor->emergency_stop_source.load(), + monitor + ->auto_power_on_after_hardware_estop_release, + monitor + ->automatic_recovery_suppressed + .load()); + if (hardware_estop_released) { + (void)autoPowerOnAfterHardwareEmergencyStop( + rpc_client, monitor, robot_interface); + safety = monitor->safety_state->snapshot(); + } + + if (safety.latched) { + if (monitor->cancellation_confirmed.load() && + !controllerStillQuiescent( + rpc_client, robot_interface)) { + CMVR_LOG(WARNING) + << "[AuboArm] controller activity reappeared while safety was latched, id=" + << monitor->arm_id; + cancelForSafetyTransition(monitor); + } + if (!monitor->cancellation_confirmed.load()) { + (void)enforceControllerTermination( + rpc_client, monitor); + } + } + if (monitorWait( + monitor, kSafetyPollInterval)) { + break; + } + } + } + } + } + } catch (const std::exception& e) { + publishSafetyUnavailable(monitor, e.what()); + } + + if (rpc_client) { + try { + if (rpc_client->hasLogined()) { + rpc_client->logout(); + } + if (rpc_client->hasConnected()) { + rpc_client->disconnect(); + } + } catch (const std::exception& e) { + CMVR_LOG(WARNING) + << "[AuboArm] safety monitor cleanup failed, id=" + << monitor->arm_id << ", error=" << e.what(); + } + } + if (!monitor->stop_requested.load()) { + publishSafetyUnavailable(monitor, "monitor RPC disconnected"); + (void)monitorWait(monitor, kSafetyReconnectInterval); + } + } +} + +enum class CabinetIoOperation { + GetDigitalInput, + GetDigitalOutput, + SetDigitalOutput, +}; + +std::string lowerString(std::string value) +{ + std::transform(value.begin(), value.end(), value.begin(), [](const unsigned char c) { + return static_cast(std::tolower(c)); + }); + return value; +} + +bool parseJsonCommand(const std::string& request_json, + Json::Value& root, + std::string& error) +{ + Json::CharReaderBuilder builder; + std::unique_ptr reader(builder.newCharReader()); + return reader->parse( + request_json.data(), + request_json.data() + request_json.size(), + &root, + &error); +} + +std::string compactJson(const Json::Value& value) +{ + Json::StreamWriterBuilder builder; + builder[std::string("indentation")] = ""; + return Json::writeString(builder, value); +} + +Json::Value& jsonMember(Json::Value& root, const char* name) +{ + return *root.demand(name, name + std::strlen(name)); +} + +const Json::Value* findJsonMember(const Json::Value& root, const char* name) +{ + return root.find(name, name + std::strlen(name)); +} + +bool requiredJsonString(const Json::Value& root, + const char* name, + std::string& value) +{ + const Json::Value* member = findJsonMember(root, name); + if (!member || !member->isString() || member->asString().empty()) { + return false; + } + value = member->asString(); + return true; +} + +bool requiredJsonInt(const Json::Value& root, const char* name, int& value) +{ + const Json::Value* member = findJsonMember(root, name); + if (!member || !member->isInt()) { + return false; + } + value = member->asInt(); + return true; +} + +bool requiredJsonBool(const Json::Value& root, const char* name, bool& value) +{ + const Json::Value* member = findJsonMember(root, name); + if (!member || !member->isBool()) { + return false; + } + value = member->asBool(); + return true; +} + +bool parseCabinetIoOperation(const std::string& name, CabinetIoOperation& operation) +{ + const std::string normalized = lowerString(name); + if (normalized == "get_di") { + operation = CabinetIoOperation::GetDigitalInput; + } else if (normalized == "get_do") { + operation = CabinetIoOperation::GetDigitalOutput; + } else if (normalized == "set_do") { + operation = CabinetIoOperation::SetDigitalOutput; + } else { + return false; + } + return true; +} + +std::string standardOutputRunstateName( + const arcs::common_interface::StandardOutputRunState runstate) +{ + return arcs::common_interface::toString(runstate); +} RobotInterfacePtr getPrimaryRobotInterface(const std::shared_ptr& rpc_client, const std::string& context, @@ -66,35 +1263,74 @@ RobotInterfacePtr getPrimaryRobotInterface(const std::shared_ptr& cancellation_requested) { const auto start_time = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start_time < std::chrono::seconds(20)) { + if (cancellationRequested(cancellation_requested)) { + return RobotModeWaitResult::Cancelled; + } const auto current_mode = robot_interface->getRobotState()->getRobotModeType(); if (current_mode == target_mode) { - return true; + return RobotModeWaitResult::Reached; } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } - return false; + return cancellationRequested(cancellation_requested) + ? RobotModeWaitResult::Cancelled + : RobotModeWaitResult::Timeout; } -int waitArrival(const RobotInterfacePtr& robot_interface) +bool waitForRobotMode(const RobotInterfacePtr& robot_interface, + const RobotModeType& target_mode) +{ + return waitForRobotMode(robot_interface, target_mode, {}) == + RobotModeWaitResult::Reached; +} + +template +aubo_internal::MotionWaitResult waitArrival( + const RobotInterfacePtr& robot_interface, + IsCancelled&& is_cancelled) { int retry_count = 0; + if (is_cancelled()) { + return aubo_internal::MotionWaitResult::Cancelled; + } int exec_id = robot_interface->getMotionControl()->getExecId(); while (exec_id == -1 && retry_count++ < 5) { + if (is_cancelled()) { + return aubo_internal::MotionWaitResult::Cancelled; + } std::this_thread::sleep_for(std::chrono::milliseconds(50)); + if (is_cancelled()) { + return aubo_internal::MotionWaitResult::Cancelled; + } exec_id = robot_interface->getMotionControl()->getExecId(); } if (exec_id == -1) { - return -1; + return is_cancelled() + ? aubo_internal::MotionWaitResult::Cancelled + : aubo_internal::MotionWaitResult::Failed; } while (robot_interface->getMotionControl()->getExecId() != -1) { + if (is_cancelled()) { + return aubo_internal::MotionWaitResult::Cancelled; + } std::this_thread::sleep_for(std::chrono::milliseconds(50)); } - return 0; + return is_cancelled() + ? aubo_internal::MotionWaitResult::Cancelled + : aubo_internal::MotionWaitResult::Completed; } bool waitServoModeSelect(const RobotInterfacePtr& robot_interface, const int mode) @@ -126,6 +1362,21 @@ CartesianPose poseFromVector(const std::vector& values) struct AuboArm::SdkState { std::shared_ptr rpc_client; + std::shared_ptr motion_state{ + std::make_shared()}; + std::shared_ptr safety_monitor; + std::thread safety_monitor_thread; + + ~SdkState() + { + if (safety_monitor) { + safety_monitor->stop_requested.store(true); + safety_monitor->wait_cv.notify_all(); + } + if (safety_monitor_thread.joinable()) { + safety_monitor_thread.join(); + } + } }; AuboArm::AuboArm(const config::RobotArmConfig& cfg) @@ -179,17 +1430,171 @@ bool AuboArm::stop() return stopMotion().ok(); } +bool AuboArm::executeJsonCommand(const std::string& request_json, + std::string& response_json) +{ + Json::Value response(Json::objectValue); + jsonMember(response, "success") = false; + const auto fail = [&](const std::string& error_code, + const std::string& error_message) { + jsonMember(response, "success") = false; + jsonMember(response, "error_code") = error_code; + jsonMember(response, "error_message") = error_message; + response_json = compactJson(response); + return false; + }; + + Json::Value root; + std::string parse_error; + if (!parseJsonCommand(request_json, root, parse_error)) { + return fail("invalid_json", "invalid json: " + parse_error); + } + if (!root.isObject()) { + return fail("invalid_json", "invalid json: root must be an object"); + } + + std::string command; + if (!requiredJsonString(root, "command", command)) { + return fail("invalid_argument", + "field 'command' is required and must be a non-empty string"); + } + command = lowerString(command); + if (command != "cabinet_io") { + return fail("unsupported_command", "unsupported json command: " + command); + } + jsonMember(response, "command") = command; + + std::string operation_name; + if (!requiredJsonString(root, "operation", operation_name)) { + return fail("invalid_argument", + "field 'operation' is required and must be a non-empty string"); + } + operation_name = lowerString(operation_name); + CabinetIoOperation operation{}; + if (!parseCabinetIoOperation(operation_name, operation)) { + return fail("invalid_operation", + "unsupported cabinet_io operation: " + operation_name); + } + jsonMember(response, "operation") = operation_name; + + int index = -1; + if (!requiredJsonInt(root, "index", index) || index < 0) { + return fail("invalid_argument", + "field 'index' is required and must be a non-negative JSON integer"); + } + jsonMember(response, "index") = index; + + bool output_value = false; + if (operation == CabinetIoOperation::SetDigitalOutput && + !requiredJsonBool(root, "value", output_value)) { + return fail("invalid_argument", + "field 'value' is required for set_do and must be a JSON boolean"); + } + + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_("cabinet_io"); + if (!ready.ok()) { + return fail("not_connected", ready.message); + } + + try { + Result interface_result; + auto robot_interface = + getPrimaryRobotInterface(sdk_->rpc_client, "cabinet_io", interface_result); + if (!interface_result.ok() || !robot_interface) { + return fail("robot_interface_unavailable", interface_result.message); + } + + auto io = robot_interface->getIoControl(); + if (!io) { + return fail("io_interface_unavailable", + "[AuboArm] cabinet_io failed: IO interface is null"); + } + + const bool is_input = operation == CabinetIoOperation::GetDigitalInput; + const int count = is_input + ? io->getStandardDigitalInputNum() + : io->getStandardDigitalOutputNum(); + jsonMember(response, "count") = count; + if (index >= count) { + return fail( + "index_out_of_range", + "[AuboArm] cabinet_io index out of range: index=" + + std::to_string(index) + ", count=" + std::to_string(count)); + } + + if (operation == CabinetIoOperation::GetDigitalInput) { + jsonMember(response, "value") = io->getStandardDigitalInput(index); + } else { + const auto runstate = io->getStandardDigitalOutputRunstate(index); + jsonMember(response, "runstate") = standardOutputRunstateName(runstate); + jsonMember(response, "runstate_code") = static_cast(runstate); + + if (operation == CabinetIoOperation::GetDigitalOutput) { + jsonMember(response, "value") = + io->getStandardDigitalOutput(index); + } else { + if (runstate != arcs::common_interface::StandardOutputRunState::None) { + return fail( + "output_managed_by_runstate", + "[AuboArm] cabinet_io set_do rejected: output is managed by " + "controller runstate; configure this channel as None before writing"); + } + + const int ret = io->setStandardDigitalOutput(index, output_value); + jsonMember(response, "sdk_return_code") = ret; + if (ret != 0) { + return fail( + "sdk_command_failed", + "[AuboArm] cabinet_io set_do failed: sdk ret=" + + std::to_string(ret)); + } + jsonMember(response, "requested_value") = output_value; + } + } + + jsonMember(response, "success") = true; + response_json = compactJson(response); + return true; + } catch (const arcs::common_interface::AuboException& e) { + jsonMember(response, "sdk_return_code") = e.code(); + return fail("sdk_exception", + std::string("[AuboArm] cabinet_io failed: ") + e.what()); + } catch (const std::exception& e) { + return fail("sdk_exception", + std::string("[AuboArm] cabinet_io failed: ") + e.what()); + } +} + ArmState AuboArm::getRobotState() const { ArmState state; state.connected = connected_.load(); - state.powered_on = state.connected; - state.brake_released = state.connected; - state.moving = busy_.load(); + state.moving = busy(); state.robot_mode = getRobotMode(); state.safety_mode = getSafetyMode(); state.control_mode = getControlMode(); - state.emergency_stopped = emergency_stopped_; + state.powered_on = state.connected && + state.robot_mode != RobotMode::Disconnected && + state.robot_mode != RobotMode::PowerOff && + state.robot_mode != RobotMode::Unknown; + state.brake_released = + state.robot_mode == RobotMode::Running && + state.safety_mode != SafetyMode::EmergencyStop && + state.safety_mode != SafetyMode::SystemEmergencyStop && + state.safety_mode != SafetyMode::SafeguardStop; + state.program_running = false; + { + std::lock_guard lock(mutex_); + if (sdk_ && sdk_->safety_monitor) { + state.program_running = + sdk_->safety_monitor->runtime_state.load() == + static_cast(RuntimeState::Running); + } + } + state.protective_stopped = isProtectiveStopped(); + state.emergency_stopped = isEmergencyStopped(); + state.fault = isFault(); state.speed_scaling = speed_scaling_; state.actual_joint_state = getJointState(); state.target_joint_state = state.actual_joint_state; @@ -274,71 +1679,548 @@ RobotMode AuboArm::getRobotMode() const if (!connected_.load()) { return RobotMode::Disconnected; } - if (emergency_stopped_) { + const auto safety_mode = getSafetyMode(); + if (safety_mode == SafetyMode::Fault) { + return RobotMode::Fault; + } + if (safety_mode == SafetyMode::ProtectiveStop || + safety_mode == SafetyMode::SafeguardStop || + safety_mode == SafetyMode::EmergencyStop || + safety_mode == SafetyMode::SystemEmergencyStop) { return RobotMode::Stopped; } - return busy_.load() ? RobotMode::Running : RobotMode::Idle; + + std::lock_guard lock(mutex_); + if (!sdk_ || !sdk_->safety_monitor) { + return RobotMode::Unknown; + } + return publicRobotMode(static_cast( + sdk_->safety_monitor->robot_mode.load())); +} + +SafetyMode AuboArm::getSafetyMode() const +{ + if (!connected_.load()) { + return SafetyMode::Unknown; + } + std::lock_guard lock(mutex_); + if (!sdk_ || !sdk_->safety_monitor) { + return SafetyMode::Unknown; + } + const auto monitor = sdk_->safety_monitor; + if (!safetySampleFresh(monitor)) { + publishSafetyUnavailable(monitor, "sample is stale"); + } + const auto snapshot = monitor->safety_state->snapshot(); + return publicSafetyMode( + snapshot.latched ? snapshot.latched_reason : snapshot.observed); +} + +ControlMode AuboArm::getControlMode() const +{ + if (!connected_.load()) { + return ControlMode::None; + } + std::lock_guard lock(mutex_); + if (sdk_ && sdk_->safety_monitor && + sdk_->safety_monitor->servo_mode_select.load() != 0) { + return ControlMode::Servo; + } + return ControlMode::Position; +} + +bool AuboArm::isProtectiveStopped() const +{ + const auto mode = getSafetyMode(); + return mode == SafetyMode::ProtectiveStop || + mode == SafetyMode::SafeguardStop; +} + +bool AuboArm::isEmergencyStopped() const +{ + const auto mode = getSafetyMode(); + return emergency_stopped_.load() || + mode == SafetyMode::EmergencyStop || + mode == SafetyMode::SystemEmergencyStop; +} + +bool AuboArm::isFault() const +{ + return getSafetyMode() == SafetyMode::Fault || + getRobotMode() == RobotMode::Fault; +} + +bool AuboArm::busy() const +{ + std::lock_guard lock(mutex_); + if (sdk_) { + return sdk_->motion_state->busy(); + } + return false; } Result AuboArm::torqueOn() { - const auto ready = ensureConnected_("torqueOn"); - if (!ready.ok()) { - return ready; + return torqueOn({}); +} + +Result AuboArm::torqueOn( + const std::function& cancellation_requested) +{ + std::shared_ptr rpc_client; + std::shared_ptr monitor; + { + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_("torqueOn"); + if (!ready.ok()) { + return ready; + } + rpc_client = sdk_->rpc_client; + monitor = sdk_->safety_monitor; } - try { - const auto robot_names = sdk_->rpc_client->getRobotNames(); - if (robot_names.empty()) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot name list is empty"); + bool cancellation_latched = false; + bool controller_mutated = false; + const std::function cancellation_check = + [&cancellation_requested, &cancellation_latched]() { + if (!cancellation_latched) { + cancellation_latched = cancellationRequested( + cancellation_requested); + } + return cancellation_latched; + }; + const auto cancelled_before_startup = []() { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn cancelled before controller startup"); + }; + const auto cancellation_result = [&]() -> std::optional { + if (!cancellation_check()) { + return std::nullopt; } - auto robot_interface = sdk_->rpc_client->getRobotInterface(robot_names.front()); - if (!robot_interface) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot interface is null"); + if (!controller_mutated) { + return cancelled_before_startup(); + } + + try { + std::unique_lock cleanup_rpc_lock( + monitor->command_rpc_mutex); + cancelForSafetyTransition(monitor); + if (!enforceControllerTermination(rpc_client, monitor)) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn cancelled: control ownership was revoked, but controller safety termination could not be confirmed"); + } + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn cancelled: control ownership was revoked; controller safety termination confirmed"); + } catch (const std::exception& e) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn cancelled: controller safety termination raised an exception: " + + std::string(e.what())); + } catch (...) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn cancelled: controller safety termination raised an unknown exception"); + } + }; + + try { + if (!monitor) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] torqueOn failed: hardware safety monitor is unavailable"); + } + + if (cancellation_check()) { + return cancelled_before_startup(); + } + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + if (cancellation_check()) { + return cancelled_before_startup(); + } + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "torqueOn", interface_result); + if (!interface_result.ok()) { + return interface_result; + } + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + + refreshSafetySample(rpc_client, monitor, robot_interface); + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + auto safety_snapshot = monitor->safety_state->snapshot(); + const std::uint64_t entry_safety_epoch = safety_snapshot.epoch; + if (monitor->emergency_stop_source.load() != 0) { + return Result::failure( + ArmErrorCode::RobotInEmergencyStop, + "[AuboArm] torqueOn rejected: hardware emergency-stop input is still active"); + } + + aubo_internal::RecoveryToken recovery_token; + std::unique_ptr recovery_guard; + bool recovering = safety_snapshot.latched; + if (recovering && + !aubo_internal::isMotionSafe(safety_snapshot.observed)) { + const auto condition = safety_snapshot.observed; + if (aubo_internal::needsProtectiveUnlock(condition)) { + return Result::failure( + ArmErrorCode::RobotInProtectiveStop, + "[AuboArm] torqueOn rejected: ProtectiveStop/Violation must be cleared with unlockProtectiveStop first"); + } + if (condition == + aubo_internal::SafetyCondition::SafeguardStop) { + return Result::failure( + ArmErrorCode::RobotInProtectiveStop, + "[AuboArm] torqueOn rejected: SafeguardStop requires the external safety IO to be cleared"); + } + if (condition == + aubo_internal::SafetyCondition::Recovery) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] torqueOn rejected: Recovery mode requires manually moving the arm inside its safety limits"); + } + if (!aubo_internal::needsInterfaceBoardRestart(condition)) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] torqueOn rejected: safety state is " + + std::string(safetyConditionName(condition))); + } + + controller_mutated = true; + if (const auto mutation_result = + aubo_internal::runTorqueOnControllerMutation( + arcs::common_interface::AUBO_OK, + [&robot_interface] { + return robot_interface->getRobotManage() + ->restartInterfaceBoard(); + }, + [](const int return_code) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn recovery failed: " + "restartInterfaceBoard ret=" + + std::to_string(return_code)); + }, + cancellation_result)) { + return *mutation_result; + } + + const auto safety_deadline = + std::chrono::steady_clock::now() + + std::chrono::seconds(10); + do { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + std::this_thread::sleep_for( + std::chrono::milliseconds(100)); + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + refreshSafetySample( + rpc_client, monitor, robot_interface); + safety_snapshot = monitor->safety_state->snapshot(); + if (aubo_internal::isMotionSafe( + safety_snapshot.observed)) { + break; + } + } while (std::chrono::steady_clock::now() < + safety_deadline); + } + + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + + safety_snapshot = monitor->safety_state->snapshot(); + if (safety_snapshot.epoch != entry_safety_epoch) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn recovery rejected: a new safety event occurred while resetting the controller; retry recovery explicitly"); + } + if (!aubo_internal::isMotionSafe(safety_snapshot.observed)) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] torqueOn rejected: safety state is " + + std::string(safetyConditionName( + safety_snapshot.observed))); + } + + if (recovering) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + const auto token = monitor->safety_state->beginRecovery( + entry_safety_epoch); + if (!token.has_value()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] torqueOn recovery rejected: safety latch changed"); + } + recovery_token = *token; + recovery_guard = std::make_unique( + monitor->safety_state, recovery_token); + } + + if (const auto cancelled = cancellation_result()) { + return *cancelled; } double mass = 0.0; std::vector cog(3, 0.0); std::vector aom(3, 0.0); std::vector inertia(6, 0.0); - robot_interface->getRobotConfig()->setPayload(mass, cog, aom, inertia); + controller_mutated = true; + if (const auto mutation_result = + aubo_internal::runTorqueOnControllerMutation( + arcs::common_interface::AUBO_OK, + [&robot_interface, mass, &cog, &aom, &inertia] { + return robot_interface->getRobotConfig()->setPayload( + mass, cog, aom, inertia); + }, + [](const int return_code) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn failed: setPayload ret=" + + std::to_string(return_code)); + }, + cancellation_result)) { + return *mutation_result; + } - const auto current_mode = robot_interface->getRobotState()->getRobotModeType(); - if (current_mode != arcs::common_interface::RobotModeType::Running) { - robot_interface->getRobotManage()->poweron(); - if (!waitForRobotMode(robot_interface, arcs::common_interface::RobotModeType::Idle)) { + auto current_mode = + robot_interface->getRobotState()->getRobotModeType(); + if (current_mode != RobotModeType::Running && + current_mode != RobotModeType::Idle) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + controller_mutated = true; + if (const auto mutation_result = + aubo_internal::runTorqueOnControllerMutation( + arcs::common_interface::AUBO_OK, + [&robot_interface] { + return robot_interface->getRobotManage()->poweron(); + }, + [](const int return_code) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn failed: poweron ret=" + + std::to_string(return_code)); + }, + cancellation_result)) { + return *mutation_result; + } + const auto idle_wait = waitForRobotMode( + robot_interface, + arcs::common_interface::RobotModeType::Idle, + cancellation_check); + if (idle_wait != RobotModeWaitResult::Reached) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] torqueOn failed: timeout waiting for Idle"); } - robot_interface->getRobotManage()->startup(); - if (!waitForRobotMode(robot_interface, arcs::common_interface::RobotModeType::Running)) { + current_mode = RobotModeType::Idle; + } + + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + auto before_brake_release = + monitor->safety_state->snapshot(); + const std::uint64_t expected_epoch = recovering + ? recovery_token.epoch + : entry_safety_epoch; + const bool recovery_token_current = !recovering || + (before_brake_release.recovery_in_progress && + before_brake_release.epoch == recovery_token.epoch); + if (before_brake_release.epoch != expected_epoch || + !recovery_token_current || before_brake_release.latched != recovering || + !aubo_internal::isMotionSafe( + before_brake_release.observed) || + monitor->emergency_stop_source.load() != 0) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn rejected: safety state changed before brake release; the new event remains latched"); + } + + if (recovering) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + controller_mutated = true; + cancelForSafetyTransition(monitor); + const bool cleanup_ok = current_mode == RobotModeType::Running + ? enforceControllerTermination(rpc_client, monitor) + : prepareControllerForStartup(rpc_client, monitor); + if (!cleanup_ok) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn recovery failed: old controller queue could not be acknowledged and cleared before brake release"); + } + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + } + + if (current_mode != RobotModeType::Running) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + controller_mutated = true; + if (const auto mutation_result = + aubo_internal::runTorqueOnControllerMutation( + arcs::common_interface::AUBO_OK, + [&robot_interface] { + return robot_interface->getRobotManage()->startup(); + }, + [](const int return_code) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn failed: startup ret=" + + std::to_string(return_code)); + }, + cancellation_result)) { + return *mutation_result; + } + const auto running_wait = waitForRobotMode( + robot_interface, + arcs::common_interface::RobotModeType::Running, + cancellation_check); + if (running_wait != RobotModeWaitResult::Reached) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] torqueOn failed: timeout waiting for Running"); } } - emergency_stopped_ = false; + + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + const auto after_startup = monitor->safety_state->snapshot(); + const bool post_recovery_token_current = !recovering || + (after_startup.recovery_in_progress && + after_startup.epoch == recovery_token.epoch); + if (after_startup.epoch != expected_epoch || + !post_recovery_token_current || after_startup.latched != recovering || + !aubo_internal::isMotionSafe(after_startup.observed) || + monitor->emergency_stop_source.load() != 0 || + monitor->robot_mode.load() != + static_cast(RobotModeType::Running)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn rejected: safety state changed during startup; the new event remains latched"); + } + if (recovering) { + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + cancelForSafetyTransition(monitor); + if (!enforceControllerTermination(rpc_client, monitor)) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn recovery failed: controller did not reach an empty, steady state after startup"); + } + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + const bool robot_running = + monitor->robot_mode.load() == + static_cast(RobotModeType::Running); + if (!recovery_guard->complete( + robot_running, + true, + monitor->cancellation_confirmed.load())) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] torqueOn recovery failed: safety state changed during recovery"); + } + } + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } + emergency_stopped_.store(false); + servo_mode_.store(false); + monitor->hardware_emergency_stop_latched.store(false); + monitor->automatic_recovery_suppressed.store(false); + if (const auto cancelled = cancellation_result()) { + return *cancelled; + } return Result::success(); } catch (const std::exception& e) { - return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] torqueOn failed: ") + e.what()); + auto primary_failure = Result::failure( + ArmErrorCode::CommandFailed, + std::string("[AuboArm] torqueOn failed: ") + e.what()); + return controller_mutated + ? aubo_internal::preservePrimaryTorqueOnFailure( + std::move(primary_failure), cancellation_result()) + : primary_failure; + } catch (...) { + auto primary_failure = Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOn failed: unknown exception"); + return controller_mutated + ? aubo_internal::preservePrimaryTorqueOnFailure( + std::move(primary_failure), cancellation_result()) + : primary_failure; } } Result AuboArm::torqueOff() { - const auto ready = ensureConnected_("torqueOff"); - if (!ready.ok()) { - return ready; + std::shared_ptr rpc_client; + std::shared_ptr monitor; + { + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_("torqueOff"); + if (!ready.ok()) { + return ready; + } + rpc_client = sdk_->rpc_client; + monitor = sdk_->safety_monitor; + if (monitor) { + monitor->automatic_recovery_suppressed.store(true); + } } try { - const auto robot_names = sdk_->rpc_client->getRobotNames(); - if (robot_names.empty()) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot name list is empty"); + std::unique_lock command_rpc_lock; + if (monitor) { + command_rpc_lock = std::unique_lock( + monitor->command_rpc_mutex); } - auto robot_interface = sdk_->rpc_client->getRobotInterface(robot_names.front()); - if (!robot_interface) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot interface is null"); + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "torqueOff", interface_result); + if (!interface_result.ok()) { + return interface_result; } - robot_interface->getRobotManage()->poweroff(); - if (!waitForRobotMode(robot_interface, arcs::common_interface::RobotModeType::PowerOff)) { + const int power_off_ret = + robot_interface->getRobotManage()->poweroff(); + if (power_off_ret != arcs::common_interface::AUBO_OK) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] torqueOff failed: poweroff ret=" + + std::to_string(power_off_ret)); + } + if (!waitForRobotMode( + robot_interface, + arcs::common_interface::RobotModeType::PowerOff)) { return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] torqueOff failed: timeout waiting for PowerOff"); } return Result::success(); @@ -355,7 +2237,28 @@ Result AuboArm::calibrateZeroQ(const std::string& joint_name) Result AuboArm::emergencyStop() { - emergency_stopped_ = true; + emergency_stopped_.store(true); + { + std::lock_guard lock(mutex_); + if (sdk_ && sdk_->safety_monitor) { + sdk_->safety_monitor->safety_state->observe( + aubo_internal::SafetyCondition::SoftwareEmergencyStop); + cancelForSafetyTransition(sdk_->safety_monitor); + } + } + return stopMotion(); +} + +Result AuboArm::protectiveStop() +{ + { + std::lock_guard lock(mutex_); + if (sdk_ && sdk_->safety_monitor) { + sdk_->safety_monitor->safety_state->observe( + aubo_internal::SafetyCondition::ProtectiveStop); + cancelForSafetyTransition(sdk_->safety_monitor); + } + } return stopMotion(); } @@ -374,35 +2277,135 @@ Result AuboArm::moveJ(const JointPositionCommand& target, const MotionOptions& o if (!validDof_(target.position.size(), error)) { return Result::failure(ArmErrorCode::InvalidDof, error); } - const auto ready = ensureConnected_("moveJ"); - if (!ready.ok()) { - return ready; - } - if (busy_.exchange(true)) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] arm is busy: " + id_); - } - BusyGuard busy_guard{busy_}; - try { - const auto robot_names = sdk_->rpc_client->getRobotNames(); + std::unique_lock submit_lock(mutex_); + const auto locked_ready = ensureConnected_("moveJ"); + if (!locked_ready.ok()) { + return locked_ready; + } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "moveJ", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto rpc_client = sdk_->rpc_client; + const auto motion_state = sdk_->motion_state; + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; + const auto motion = motion_state->begin( + aubo_internal::MotionKind::Joint); + if (!motion.started()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] moveJ rejected: " + + std::string(motionStartFailure(motion.status)) + + ", id=" + id_); + } + busy_.store(true); + MotionOwnerGuard motion_owner{ + *motion_state, busy_, motion.token}; + + const auto robot_names = rpc_client->getRobotNames(); if (robot_names.empty()) { return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot name list is empty"); } - auto robot_interface = sdk_->rpc_client->getRobotInterface(robot_names.front()); + auto robot_interface = rpc_client->getRobotInterface(robot_names.front()); if (!robot_interface) { return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot interface is null"); } - robot_interface->getMotionControl()->setSpeedFraction(speed_scaling_); - robot_interface->getMotionControl()->moveJoint( + auto motion_control = robot_interface->getMotionControl(); + motion_control->setSpeedFraction(speed_scaling_); + motion_owner.requireExplicitSettlement(); + if (cancellationRequested(options.cancellation_requested) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveJ cancelled before submission"); + } + const int ret = motion_control->moveJoint( target.position, options.acceleration > 0.0 ? options.acceleration : 0.5, options.velocity > 0.0 ? options.velocity : 0.5, options.blend_radius, 0); - if (waitArrival(robot_interface) != 0) { + if (ret == arcs::common_interface::AUBO_OK) { + submit_lock.unlock(); + } else { + motion_owner.settle(); + } + const auto outcome = aubo_internal::resolveMotionCommand( + ret, + arcs::common_interface::AUBO_OK, + arcs::common_interface::AUBO_REQUEST_IGNORE, + [&robot_interface, + motion_state, + safety_monitor, + safety_permit, + cancellation_requested = options.cancellation_requested, + token = motion.token]() { + return waitArrival( + robot_interface, + [motion_state, + safety_monitor, + safety_permit, + cancellation_requested, + token]() { + return cancellationRequested( + cancellation_requested) || + motion_state->cancelled(token) || + !validateSafetyPermit( + safety_monitor, safety_permit); + }); + }); + if (cancellationRequested(options.cancellation_requested)) { + if (ret == arcs::common_interface::AUBO_OK) { + if (outcome == + aubo_internal::MotionCommandOutcome::CompletedAfterMotion) { + motion_owner.clearOnFinish(); + } else { + // The request was accepted but its completion is no longer + // owned by this caller. Preserve the typed motion state so + // the cancellation owner can issue stopJoint/stopLine. + motion_owner.retainKind(); + } + } + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveJ cancelled by its caller"); + } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveJ cancelled by hardware safety event"); + } + switch (outcome) { + case aubo_internal::MotionCommandOutcome::CompletedWithoutMotion: + CMVR_LOG(DEBUG) << "[AuboArm] moveJ completed without motion: sdk ret=" + << ret << " (" + << arcs::common_interface::returnValue2Str(ret) << ")"; + return Result::success(); + case aubo_internal::MotionCommandOutcome::CompletedAfterMotion: + motion_owner.clearOnFinish(); + motion_owner.settle(); + return Result::success(); + case aubo_internal::MotionCommandOutcome::Cancelled: + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveJ cancelled by stopMotion or hardware safety event"); + case aubo_internal::MotionCommandOutcome::SubmitFailed: + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] moveJ failed: sdk ret=" + std::to_string(ret) + + " (" + arcs::common_interface::returnValue2Str(ret) + ")"); + case aubo_internal::MotionCommandOutcome::CompletionFailed: return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] moveJ did not complete"); } - return Result::success(); + return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] moveJ failed: unknown outcome"); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] moveJ failed: ") + e.what()); } @@ -414,18 +2417,38 @@ Result AuboArm::speedJ(const JointVelocityCommand& velocity, double acceleration if (!validDof_(velocity.velocity.size(), error)) { return Result::failure(ArmErrorCode::InvalidDof, error); } - const auto ready = ensureConnected_("speedJ"); - if (!ready.ok()) { - return ready; - } - if (busy_.exchange(true)) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] arm is busy: " + id_); - } - BusyGuard busy_guard{busy_}; - try { + std::unique_lock submit_lock(mutex_); + const auto locked_ready = ensureConnected_("speedJ"); + if (!locked_ready.ok()) { + return locked_ready; + } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "speedJ", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto rpc_client = sdk_->rpc_client; + const auto motion_state = sdk_->motion_state; + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; + const auto motion = motion_state->begin( + aubo_internal::MotionKind::Joint, true); + if (!motion.started()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] speedJ rejected: " + + std::string(motionStartFailure(motion.status)) + + ", id=" + id_); + } + busy_.store(true); + MotionOwnerGuard motion_owner{ + *motion_state, busy_, motion.token}; + Result interface_result; - auto robot_interface = getPrimaryRobotInterface(sdk_->rpc_client, "speedJ", interface_result); + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "speedJ", interface_result); if (!interface_result.ok()) { return interface_result; } @@ -433,14 +2456,33 @@ Result AuboArm::speedJ(const JointVelocityCommand& velocity, double acceleration robot_interface->getMotionControl()->setSpeedFraction(speed_scaling_); const double resolved_acceleration = acceleration > 0.0 ? acceleration : 1.5; const double resolved_duration = duration > 0.0 ? duration : 100.0; + motion_owner.requireExplicitSettlement(); + submit_lock.unlock(); + if (motion_state->cancelled(motion.token) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] speedJ cancelled before submission"); + } const int ret = robot_interface->getMotionControl()->speedJoint( velocity.velocity, resolved_acceleration, resolved_duration); + if (motion_state->cancelled(motion.token) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] speedJ cancelled by stopMotion or hardware safety event"); + } if (ret != 0) { + motion_owner.settle(); return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] speedJ failed: ret=" + std::to_string(ret)); } + motion_owner.retainKind(); + motion_owner.settle(); return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] speedJ failed: ") + e.what()); @@ -449,63 +2491,143 @@ Result AuboArm::speedJ(const JointVelocityCommand& velocity, double acceleration Result AuboArm::stopJ(double acceleration) { - if (!connected_.load() || !sdk_ || !sdk_->rpc_client) { - return Result::success(); - } - try { - Result interface_result; - auto robot_interface = getPrimaryRobotInterface(sdk_->rpc_client, "stopJ", interface_result); - if (!interface_result.ok()) { - return interface_result; - } - const double resolved_acceleration = acceleration > 0.0 ? acceleration : 31.0; - const int ret = robot_interface->getMotionControl()->stopJoint(resolved_acceleration); - busy_.store(false); - if (ret != 0) { - return Result::failure(ArmErrorCode::CommandFailed, - "[AuboArm] stopJ failed: ret=" + std::to_string(ret)); - } - return Result::success(); - } catch (const std::exception& e) { - return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] stopJ failed: ") + e.what()); - } + return stopMotion_(MotionStopKind::Joint, acceleration); } Result AuboArm::moveL(const CartesianPose& target, const MotionOptions& options, FrameType frame) { (void)frame; - const auto ready = ensureConnected_("moveL"); - if (!ready.ok()) { - return ready; - } - if (busy_.exchange(true)) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] arm is busy: " + id_); - } - BusyGuard busy_guard{busy_}; - try { - const auto robot_names = sdk_->rpc_client->getRobotNames(); + std::unique_lock submit_lock(mutex_); + const auto locked_ready = ensureConnected_("moveL"); + if (!locked_ready.ok()) { + return locked_ready; + } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "moveL", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto rpc_client = sdk_->rpc_client; + const auto motion_state = sdk_->motion_state; + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; + const auto motion = motion_state->begin( + aubo_internal::MotionKind::Linear); + if (!motion.started()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] moveL rejected: " + + std::string(motionStartFailure(motion.status)) + + ", id=" + id_); + } + busy_.store(true); + MotionOwnerGuard motion_owner{ + *motion_state, busy_, motion.token}; + + const auto robot_names = rpc_client->getRobotNames(); if (robot_names.empty()) { return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot name list is empty"); } - auto robot_interface = sdk_->rpc_client->getRobotInterface(robot_names.front()); + auto robot_interface = rpc_client->getRobotInterface(robot_names.front()); if (!robot_interface) { return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] robot interface is null"); } - robot_interface->getMotionControl()->setSpeedFraction(speed_scaling_); + auto motion_control = robot_interface->getMotionControl(); + motion_control->setSpeedFraction(speed_scaling_); std::vector tcp_offset(6, 0.0); robot_interface->getRobotConfig()->setTcpOffset(tcp_offset); std::vector pose{target.x, target.y, target.z, target.rx, target.ry, target.rz}; - robot_interface->getMotionControl()->moveLine( + motion_owner.requireExplicitSettlement(); + if (cancellationRequested(options.cancellation_requested) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveL cancelled before submission"); + } + const int ret = motion_control->moveLine( pose, options.acceleration > 0.0 ? options.acceleration : 0.5, options.velocity > 0.0 ? options.velocity : 0.25, options.blend_radius, 0); - if (waitArrival(robot_interface) != 0) { + if (ret == arcs::common_interface::AUBO_OK) { + submit_lock.unlock(); + } else { + motion_owner.settle(); + } + const auto outcome = aubo_internal::resolveMotionCommand( + ret, + arcs::common_interface::AUBO_OK, + arcs::common_interface::AUBO_REQUEST_IGNORE, + [&robot_interface, + motion_state, + safety_monitor, + safety_permit, + cancellation_requested = options.cancellation_requested, + token = motion.token]() { + return waitArrival( + robot_interface, + [motion_state, + safety_monitor, + safety_permit, + cancellation_requested, + token]() { + return cancellationRequested( + cancellation_requested) || + motion_state->cancelled(token) || + !validateSafetyPermit( + safety_monitor, safety_permit); + }); + }); + if (cancellationRequested(options.cancellation_requested)) { + if (ret == arcs::common_interface::AUBO_OK) { + if (outcome == + aubo_internal::MotionCommandOutcome::CompletedAfterMotion) { + motion_owner.clearOnFinish(); + } else { + // Keep the accepted linear kind until a typed Stop confirms + // that the controller is idle. + motion_owner.retainKind(); + } + } + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveL cancelled by its caller"); + } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveL cancelled by hardware safety event"); + } + switch (outcome) { + case aubo_internal::MotionCommandOutcome::CompletedWithoutMotion: + CMVR_LOG(DEBUG) << "[AuboArm] moveL completed without motion: sdk ret=" + << ret << " (" + << arcs::common_interface::returnValue2Str(ret) << ")"; + return Result::success(); + case aubo_internal::MotionCommandOutcome::CompletedAfterMotion: + motion_owner.clearOnFinish(); + motion_owner.settle(); + return Result::success(); + case aubo_internal::MotionCommandOutcome::Cancelled: + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] moveL cancelled by stopMotion or hardware safety event"); + case aubo_internal::MotionCommandOutcome::SubmitFailed: + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] moveL failed: sdk ret=" + std::to_string(ret) + + " (" + arcs::common_interface::returnValue2Str(ret) + ")"); + case aubo_internal::MotionCommandOutcome::CompletionFailed: return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] moveL did not complete"); } - return Result::success(); + return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] moveL failed: unknown outcome"); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] moveL failed: ") + e.what()); } @@ -513,18 +2635,38 @@ Result AuboArm::moveL(const CartesianPose& target, const MotionOptions& options, Result AuboArm::speedL(const CartesianVelocity& velocity, double acceleration, double duration, FrameType frame) { - const auto ready = ensureConnected_("speedL"); - if (!ready.ok()) { - return ready; - } - if (busy_.exchange(true)) { - return Result::failure(ArmErrorCode::RobotNotReady, "[AuboArm] arm is busy: " + id_); - } - BusyGuard busy_guard{busy_}; - try { + std::unique_lock submit_lock(mutex_); + const auto locked_ready = ensureConnected_("speedL"); + if (!locked_ready.ok()) { + return locked_ready; + } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "speedL", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto rpc_client = sdk_->rpc_client; + const auto motion_state = sdk_->motion_state; + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; + const auto motion = motion_state->begin( + aubo_internal::MotionKind::Linear, true); + if (!motion.started()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] speedL rejected: " + + std::string(motionStartFailure(motion.status)) + + ", id=" + id_); + } + busy_.store(true); + MotionOwnerGuard motion_owner{ + *motion_state, busy_, motion.token}; + Result interface_result; - auto robot_interface = getPrimaryRobotInterface(sdk_->rpc_client, "speedL", interface_result); + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "speedL", interface_result); if (!interface_result.ok()) { return interface_result; } @@ -544,8 +2686,10 @@ Result AuboArm::speedL(const CartesianVelocity& velocity, double acceleration, d tool_frame[0] = 0.0; tool_frame[1] = 0.0; tool_frame[2] = 0.0; - line_speed = sdk_->rpc_client->getMath()->poseTrans(tool_frame, line_speed); - angular_speed = sdk_->rpc_client->getMath()->poseTrans(tool_frame, angular_speed); + line_speed = rpc_client->getMath()->poseTrans( + tool_frame, line_speed); + angular_speed = rpc_client->getMath()->poseTrans( + tool_frame, angular_speed); } else if (frame == FrameType::User) { return Result::failure(ArmErrorCode::UnsupportedCommand, "[AuboArm] speedL User frame requires a configured user coordinate frame"); @@ -562,14 +2706,33 @@ Result AuboArm::speedL(const CartesianVelocity& velocity, double acceleration, d const double resolved_acceleration = acceleration > 0.0 ? acceleration : 1.2; const double resolved_duration = duration > 0.0 ? duration : 100.0; + motion_owner.requireExplicitSettlement(); + submit_lock.unlock(); + if (motion_state->cancelled(motion.token) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] speedL cancelled before submission"); + } const int ret = robot_interface->getMotionControl()->speedLine( speed, resolved_acceleration, resolved_duration); + if (motion_state->cancelled(motion.token) || + !validateSafetyPermit(safety_monitor, safety_permit)) { + motion_owner.settle(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] speedL cancelled by stopMotion or hardware safety event"); + } if (ret != 0) { + motion_owner.settle(); return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] speedL failed: ret=" + std::to_string(ret)); } + motion_owner.retainKind(); + motion_owner.settle(); return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] speedL failed: ") + e.what()); @@ -578,44 +2741,191 @@ Result AuboArm::speedL(const CartesianVelocity& velocity, double acceleration, d Result AuboArm::stopL(std::optional acceleration) { - if (!connected_.load() || !sdk_ || !sdk_->rpc_client) { - return Result::success(); - } - try { - Result interface_result; - auto robot_interface = getPrimaryRobotInterface(sdk_->rpc_client, "stopL", interface_result); - if (!interface_result.ok()) { - return interface_result; - } - const double resolved_acceleration = - acceleration.has_value() && *acceleration > 0.0 ? *acceleration : 10.0; - const int ret = robot_interface->getMotionControl()->stopLine(resolved_acceleration, resolved_acceleration); - busy_.store(false); - if (ret != 0) { - return Result::failure(ArmErrorCode::CommandFailed, - "[AuboArm] stopL failed: ret=" + std::to_string(ret)); - } - return Result::success(); - } catch (const std::exception& e) { - return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] stopL failed: ") + e.what()); - } + return stopMotion_( + MotionStopKind::Linear, + acceleration.has_value() ? *acceleration : 0.0); } Result AuboArm::stopMotion() { - if (!connected_.load() || !sdk_ || !sdk_->rpc_client) { + return stopMotion_(MotionStopKind::Automatic, 0.0); +} + +Result AuboArm::stopMotion_( + const MotionStopKind requested_kind, + const double acceleration) +{ + if (!connected_.load()) { return Result::success(); } + try { - const auto robot_names = sdk_->rpc_client->getRobotNames(); - if (robot_names.empty()) { + std::unique_lock submit_lock(mutex_); + if (!connected_.load() || !sdk_ || !sdk_->rpc_client) { return Result::success(); } - auto robot_interface = sdk_->rpc_client->getRobotInterface(robot_names.front()); - if (robot_interface) { - robot_interface->getMotionControl()->stopMove(true, true); + + const auto motion_state = sdk_->motion_state; + const auto monitor = sdk_->safety_monitor; + std::unique_lock command_rpc_lock; + if (monitor) { + monitor->automatic_recovery_suppressed.store(true); + command_rpc_lock = std::unique_lock( + monitor->command_rpc_mutex); + } + aubo_internal::MotionKind forced_kind = + aubo_internal::MotionKind::None; + if (requested_kind == MotionStopKind::Joint) { + forced_kind = aubo_internal::MotionKind::Joint; + } else if (requested_kind == MotionStopKind::Linear) { + forced_kind = aubo_internal::MotionKind::Linear; + } + + const auto stop_request = + motion_state->beginStop(forced_kind); + if (!stop_request.started()) { + busy_.store(true); + constexpr auto kExistingStopTimeout = + std::chrono::seconds(6); + const auto existing_result = + motion_state->waitForStopCompletion( + stop_request, + std::chrono::duration_cast( + kExistingStopTimeout)); + busy_.store(motion_state->busy()); + if (existing_result == + aubo_internal::StopWaitStatus::Completed) { + return Result::success(); + } + if (existing_result == + aubo_internal::StopWaitStatus::Timeout) { + return Result::failure( + ArmErrorCode::Timeout, + "[AuboArm] stopMotion failed: timeout waiting for the existing stop operation to complete"); + } + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] stopMotion failed: the existing stop operation could not confirm controller idle"); + } + busy_.store(true); + StopStateGuard stop_state_guard{ + *motion_state, busy_}; + + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + sdk_->rpc_client, "stopMotion", interface_result); + if (!interface_result.ok()) { + return interface_result; + } + + auto motion_control = robot_interface->getMotionControl(); + auto robot_state = robot_interface->getRobotState(); + int last_exec_id = motion_control->getExecId(); + bool last_steady = robot_state->isSteady(); + const bool requires_vendor_stop = + stop_request.tracked_motion || + last_exec_id != -1 || + !last_steady; + + if (requires_vendor_stop && + stop_request.kind == aubo_internal::MotionKind::None) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] stopMotion failed: controller is moving but the " + "active direct-motion type is unknown"); + } + + const auto issue_vendor_stop = [&]() -> Result { + int ret = 0; + if (stop_request.kind == aubo_internal::MotionKind::Joint) { + const double resolved_acceleration = + acceleration > 0.0 ? acceleration : 31.0; + ret = motion_control->stopJoint(resolved_acceleration); + } else { + const double resolved_acceleration = + acceleration > 0.0 ? acceleration : 10.0; + ret = motion_control->stopLine( + resolved_acceleration, resolved_acceleration); + } + if (ret != arcs::common_interface::AUBO_OK) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] stopMotion failed: " + + std::string(motionKindName(stop_request.kind)) + + " stop sdk ret=" + std::to_string(ret) + + " (" + + arcs::common_interface::returnValue2Str(ret) + + ")"); + } + return Result::success(); + }; + + if (requires_vendor_stop) { + const auto stop_result = issue_vendor_stop(); + if (!stop_result.ok()) { + return stop_result; + } + } + + constexpr auto kStopTimeout = std::chrono::seconds(5); + constexpr auto kPollInterval = std::chrono::milliseconds(50); + constexpr int kStableSamples = 3; + const auto deadline = + std::chrono::steady_clock::now() + kStopTimeout; + int stable_samples = 0; + bool idle_since_stop = last_exec_id == -1 && last_steady; + bool owner_active = + motion_state->ownerActive(stop_request.active_token); + while (std::chrono::steady_clock::now() < deadline) { + last_exec_id = motion_control->getExecId(); + last_steady = robot_state->isSteady(); + owner_active = + motion_state->ownerActive(stop_request.active_token); + const bool physically_idle = + last_exec_id == -1 && last_steady; + if (!physically_idle && idle_since_stop) { + if (stop_request.kind == + aubo_internal::MotionKind::None) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] stopMotion failed: motion started " + "after an idle observation but its type is unknown"); + } + const auto stop_result = issue_vendor_stop(); + if (!stop_result.ok()) { + return stop_result; + } + idle_since_stop = false; + } + if (physically_idle && !owner_active) { + if (++stable_samples >= kStableSamples) { + break; + } + } else { + stable_samples = 0; + } + if (physically_idle) { + idle_since_stop = true; + } + std::this_thread::sleep_for(kPollInterval); + } + if (stable_samples < kStableSamples) { + return Result::failure( + ArmErrorCode::Timeout, + "[AuboArm] stopMotion failed: timeout waiting for " + + std::string(motionKindName(stop_request.kind)) + + " motion to stop, generation=" + + std::to_string(stop_request.active_token.generation) + + ", exec_id=" + std::to_string(last_exec_id) + + ", steady=" + (last_steady ? "true" : "false") + + ", owner_active=" + + (owner_active ? "true" : "false")); + } + if (!stop_state_guard.complete()) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] stopMotion failed: cancelled motion handler is still active"); } - busy_.store(false); return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] stopMotion failed: ") + e.what()); @@ -628,6 +2938,14 @@ Result AuboArm::startServoMode(const ServoOptions& options) if (!ready.ok()) { return ready; } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "startServoMode", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; try { Result interface_result; @@ -635,6 +2953,11 @@ Result AuboArm::startServoMode(const ServoOptions& options) if (!interface_result.ok()) { return interface_result; } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] startServoMode cancelled by hardware safety"); + } const int ret = robot_interface->getMotionControl()->setServoModeSelect(kAuboServoMode); if (ret != 0) { return Result::failure(ArmErrorCode::CommandFailed, @@ -644,8 +2967,15 @@ Result AuboArm::startServoMode(const ServoOptions& options) return Result::failure(ArmErrorCode::Timeout, "[AuboArm] startServoMode failed: timeout waiting for servo mode"); } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + (void)robot_interface->getMotionControl()->setServoModeSelect(0); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] startServoMode cancelled by hardware safety event"); + } servo_options_ = options; servo_mode_.store(true); + safety_monitor->servo_mode_select.store(kAuboServoMode); return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, @@ -663,6 +2993,13 @@ Result AuboArm::servoJ(const JointPositionCommand& target) if (!ready.ok()) { return ready; } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_("servoJ", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; try { Result interface_result; @@ -677,6 +3014,11 @@ Result AuboArm::servoJ(const JointPositionCommand& target) } } const double period = servo_options_.period > 0.0 ? servo_options_.period : 0.008; + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] servoJ cancelled by hardware safety before submission"); + } const int ret = robot_interface->getMotionControl()->servoJoint( target.position, 0.0, @@ -688,6 +3030,11 @@ Result AuboArm::servoJ(const JointPositionCommand& target) return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] servoJ failed: ret=" + std::to_string(ret)); } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] servoJ cancelled by hardware safety event"); + } return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] servoJ failed: ") + e.what()); @@ -700,6 +3047,13 @@ Result AuboArm::servoL(const CartesianPose& target, FrameType frame) if (!ready.ok()) { return ready; } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_("servoL", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; try { Result interface_result; @@ -728,6 +3082,11 @@ Result AuboArm::servoL(const CartesianPose& target, FrameType frame) } const double period = servo_options_.period > 0.0 ? servo_options_.period : 0.008; + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] servoL cancelled by hardware safety before submission"); + } const int ret = robot_interface->getMotionControl()->servoCartesian( pose, 0.0, @@ -739,6 +3098,11 @@ Result AuboArm::servoL(const CartesianPose& target, FrameType frame) return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] servoL failed: ret=" + std::to_string(ret)); } + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] servoL cancelled by hardware safety event"); + } return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, std::string("[AuboArm] servoL failed: ") + e.what()); @@ -771,6 +3135,9 @@ Result AuboArm::stopServoMode() } const int ret = robot_interface->getMotionControl()->setServoModeSelect(0); servo_mode_.store(false); + if (sdk_->safety_monitor) { + sdk_->safety_monitor->servo_mode_select.store(0); + } if (ret != 0) { return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] stopServoMode failed: ret=" + std::to_string(ret)); @@ -788,6 +3155,7 @@ Result AuboArm::stopServoMode() Result AuboArm::connect(const std::string& ip, const int port) { + std::lock_guard lock(mutex_); if (connected_.load()) { return Result::success(); } @@ -798,13 +3166,7 @@ Result AuboArm::connect(const std::string& ip, const int port) try { const int resolved_port = port > 0 ? port : 30004; auto sdk_state = std::make_unique(); - sdk_state->rpc_client = std::shared_ptr( - ::createRpcClient(), - [](arcs::aubo_sdk::RpcClient* client) { - if (client) { - ::destroyRpcClient(client); - } - }); + sdk_state->rpc_client = makeRpcClient(); if (!sdk_state->rpc_client) { return Result::failure(ArmErrorCode::ConnectionFailed, "[AuboArm] connect failed: create RPC client failed"); @@ -840,8 +3202,46 @@ Result AuboArm::connect(const std::string& ip, const int port) "[AuboArm] connect failed: robot name list is empty"); } + auto robot_interface = sdk_state->rpc_client->getRobotInterface( + robot_names.front()); + if (!robot_interface) { + sdk_state->rpc_client->logout(); + sdk_state->rpc_client->disconnect(); + return Result::failure(ArmErrorCode::ConnectionFailed, + "[AuboArm] connect failed: robot interface is null"); + } + + sdk_state->safety_monitor = + std::make_shared(); + sdk_state->safety_monitor->motion_state = + sdk_state->motion_state; + sdk_state->safety_monitor->arm_id = id_; + sdk_state->safety_monitor + ->auto_power_on_after_hardware_estop_release = + vendor_cfg_.auto_power_on_after_hardware_estop_release(); + sdk_state->safety_monitor->on_hardware_estop_auto_recovered = + [this] { + busy_.store(false); + servo_mode_.store(false); + }; + publishSafetySample( + sdk_state->safety_monitor, + robot_interface->getRobotState()->getSafetyModeType(), + robot_interface->getRobotState()->getRobotModeType(), + sdk_state->rpc_client->getRuntimeMachine()->getRuntimeState(), + robot_interface->getRobotConfig() + ->getRobotEmergencyStopSource(), + robot_interface->getMotionControl()->getServoModeSelect()); + ip_ = ip; port_ = resolved_port; + sdk_state->safety_monitor_thread = std::thread( + runSafetyMonitor, + sdk_state->safety_monitor, + ip_, + port_, + username_, + password_); sdk_ = std::move(sdk_state); connected_.store(true); return Result::success(); @@ -855,22 +3255,40 @@ Result AuboArm::connect(const std::string& ip, const int port) Result AuboArm::disconnect() { + std::lock_guard lock(mutex_); try { - if (sdk_ && sdk_->rpc_client) { - if (sdk_->rpc_client->hasLogined()) { - sdk_->rpc_client->logout(); - } - if (sdk_->rpc_client->hasConnected()) { - sdk_->rpc_client->disconnect(); + connected_.store(false); + if (sdk_ && sdk_->safety_monitor) { + sdk_->safety_monitor->stop_requested.store(true); + sdk_->safety_monitor->wait_cv.notify_all(); + } + if (sdk_ && sdk_->safety_monitor_thread.joinable()) { + sdk_->safety_monitor_thread.join(); + } + const auto close_command_rpc = [this]() { + if (sdk_ && sdk_->rpc_client) { + if (sdk_->rpc_client->hasLogined()) { + sdk_->rpc_client->logout(); + } + if (sdk_->rpc_client->hasConnected()) { + sdk_->rpc_client->disconnect(); + } } + }; + if (sdk_ && sdk_->safety_monitor) { + std::unique_lock command_rpc_lock( + sdk_->safety_monitor->command_rpc_mutex); + close_command_rpc(); + } else { + close_command_rpc(); } } catch (const std::exception& e) { CMVR_LOG(ERROR) << "[AuboArm] disconnect failed: " << e.what(); } sdk_.reset(); - connected_.store(false); busy_.store(false); servo_mode_.store(false); + emergency_stopped_.store(false); return Result::success(); } @@ -880,6 +3298,258 @@ Result AuboArm::shutdown() return disconnect(); } +Result AuboArm::clearFault() +{ + std::shared_ptr rpc_client; + std::shared_ptr monitor; + { + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_("clearFault"); + if (!ready.ok()) { + return ready; + } + rpc_client = sdk_->rpc_client; + monitor = sdk_->safety_monitor; + } + + try { + if (!monitor) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] clearFault failed: hardware safety monitor is unavailable"); + } + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + const auto recover_with_torque_on = + [this, &command_rpc_lock]() -> Result { + if (command_rpc_lock.owns_lock()) { + command_rpc_lock.unlock(); + } + auto recovery = torqueOn(); + if (!recovery.ok()) { + recovery.message = + "[AuboArm] clearFault recovery failed: " + + recovery.message; + } + return recovery; + }; + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "clearFault", interface_result); + if (!interface_result.ok()) { + return interface_result; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + auto snapshot = monitor->safety_state->snapshot(); + const std::uint64_t expected_safety_epoch = snapshot.epoch; + const int entry_robot_mode = monitor->robot_mode.load(); + if (!snapshot.latched && + aubo_internal::isMotionSafe(snapshot.observed) && + entry_robot_mode != static_cast(RobotModeType::Error)) { + if (entry_robot_mode == + static_cast(RobotModeType::Running)) { + return Result::success(); + } + return recover_with_torque_on(); + } + if (monitor->emergency_stop_source.load() != 0) { + return Result::failure( + ArmErrorCode::RobotInEmergencyStop, + "[AuboArm] clearFault rejected: hardware emergency-stop input is still active"); + } + + if (aubo_internal::needsProtectiveUnlock(snapshot.observed) || + aubo_internal::needsProtectiveUnlock( + snapshot.latched_reason)) { + command_rpc_lock.unlock(); + auto unlock_result = + unlockProtectiveStop_(expected_safety_epoch); + if (unlock_result.ok()) { + return monitor->robot_mode.load() == + static_cast(RobotModeType::Running) + ? Result::success() + : recover_with_torque_on(); + } + if (unlock_result.code == ArmErrorCode::RobotNotPowered) { + return recover_with_torque_on(); + } + return unlock_result; + } + + const bool controller_fault_requires_restart = + aubo_internal::isMotionSafe(snapshot.observed) && + monitor->robot_mode.load() == + static_cast(RobotModeType::Error); + + if (aubo_internal::isMotionSafe(snapshot.observed) && + !controller_fault_requires_restart) { + if (monitor->robot_mode.load() == + static_cast(RobotModeType::Running)) { + command_rpc_lock.unlock(); + return completeSafetyRecovery_( + "clearFault", expected_safety_epoch); + } + return recover_with_torque_on(); + } + + if (!controller_fault_requires_restart && + !aubo_internal::needsInterfaceBoardRestart( + snapshot.observed)) { + const std::string guidance = + snapshot.observed == + aubo_internal::SafetyCondition::SafeguardStop + ? "clear the external safety IO" + : (snapshot.observed == + aubo_internal::SafetyCondition::Recovery + ? "manually move the arm inside its safety limits" + : "restore a valid controller safety state"); + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] clearFault rejected for " + + std::string(safetyConditionName(snapshot.observed)) + + ": " + guidance); + } + + const int ret = + robot_interface->getRobotManage()->restartInterfaceBoard(); + if (ret != arcs::common_interface::AUBO_OK) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] clearFault failed: restartInterfaceBoard ret=" + + std::to_string(ret)); + } + + const auto deadline = + std::chrono::steady_clock::now() + std::chrono::seconds(10); + while (std::chrono::steady_clock::now() < deadline) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + refreshSafetySample(rpc_client, monitor, robot_interface); + snapshot = monitor->safety_state->snapshot(); + if (aubo_internal::isMotionSafe(snapshot.observed)) { + break; + } + } + if (!aubo_internal::isMotionSafe(snapshot.observed)) { + return Result::failure( + ArmErrorCode::Timeout, + "[AuboArm] clearFault failed: timeout waiting for a safe controller state"); + } + if (monitor->robot_mode.load() == + static_cast(RobotModeType::Running)) { + command_rpc_lock.unlock(); + return completeSafetyRecovery_( + "clearFault", expected_safety_epoch); + } + return recover_with_torque_on(); + } catch (const std::exception& e) { + return Result::failure( + ArmErrorCode::CommandFailed, + std::string("[AuboArm] clearFault failed: ") + e.what()); + } +} + +Result AuboArm::unlockProtectiveStop() +{ + return unlockProtectiveStop_(std::nullopt); +} + +Result AuboArm::unlockProtectiveStop_( + const std::optional expected_safety_epoch) +{ + std::shared_ptr rpc_client; + std::shared_ptr monitor; + { + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_("unlockProtectiveStop"); + if (!ready.ok()) { + return ready; + } + rpc_client = sdk_->rpc_client; + monitor = sdk_->safety_monitor; + } + + try { + if (!monitor) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] unlockProtectiveStop failed: hardware safety monitor is unavailable"); + } + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, "unlockProtectiveStop", interface_result); + if (!interface_result.ok()) { + return interface_result; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + auto snapshot = monitor->safety_state->snapshot(); + const std::uint64_t recovery_epoch = + expected_safety_epoch.value_or(snapshot.epoch); + if (snapshot.epoch != recovery_epoch) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] unlockProtectiveStop rejected: a newer safety event superseded this recovery request"); + } + if (!snapshot.latched && + aubo_internal::isMotionSafe(snapshot.observed)) { + return Result::success(); + } + if (monitor->emergency_stop_source.load() != 0) { + return Result::failure( + ArmErrorCode::RobotInEmergencyStop, + "[AuboArm] unlockProtectiveStop rejected: hardware emergency-stop input is active"); + } + + if (aubo_internal::needsProtectiveUnlock( + snapshot.observed)) { + const int ret = robot_interface->getRobotManage() + ->setUnlockProtectiveStop(); + if (ret != arcs::common_interface::AUBO_OK) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] unlockProtectiveStop failed: sdk ret=" + + std::to_string(ret)); + } + } else if (!aubo_internal::isMotionSafe(snapshot.observed)) { + return Result::failure( + ArmErrorCode::RobotInProtectiveStop, + "[AuboArm] unlockProtectiveStop rejected: current safety state is " + + std::string(safetyConditionName(snapshot.observed))); + } + + const auto deadline = + std::chrono::steady_clock::now() + std::chrono::seconds(5); + while (std::chrono::steady_clock::now() < deadline) { + refreshSafetySample(rpc_client, monitor, robot_interface); + snapshot = monitor->safety_state->snapshot(); + if (aubo_internal::isMotionSafe(snapshot.observed)) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + if (!aubo_internal::isMotionSafe(snapshot.observed)) { + return Result::failure( + ArmErrorCode::Timeout, + "[AuboArm] unlockProtectiveStop failed: safety mode did not return to Normal/Reduced"); + } + if (monitor->robot_mode.load() != + static_cast(RobotModeType::Running)) { + return Result::failure( + ArmErrorCode::RobotNotPowered, + "[AuboArm] protective stop was unlocked, but torqueOn is required to complete safety recovery"); + } + command_rpc_lock.unlock(); + return completeSafetyRecovery_( + "unlockProtectiveStop", recovery_epoch); + } catch (const std::exception& e) { + return Result::failure( + ArmErrorCode::CommandFailed, + std::string("[AuboArm] unlockProtectiveStop failed: ") + + e.what()); + } +} + Result AuboArm::loadProgram(const std::string& program_name) { if (program_name.empty()) { @@ -908,12 +3578,33 @@ Result AuboArm::playProgram() if (!ready.ok()) { return ready; } + std::uint64_t safety_epoch = 0; + const auto safety_ready = ensureMotionReady_( + "playProgram", safety_epoch); + if (!safety_ready.ok()) { + return safety_ready; + } + const auto safety_monitor = sdk_->safety_monitor; + const aubo_internal::SafetyPermit safety_permit{safety_epoch}; try { + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] playProgram cancelled by hardware safety before submission"); + } const int ret = sdk_->rpc_client->getRuntimeMachine()->runProgram(); if (ret != 0) { return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] playProgram failed: ret=" + std::to_string(ret)); } + safety_monitor->runtime_state.store( + static_cast(RuntimeState::Running)); + if (!validateSafetyPermit(safety_monitor, safety_permit)) { + (void)sdk_->rpc_client->getRuntimeMachine()->abort(); + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] playProgram cancelled by hardware safety event"); + } return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, @@ -933,6 +3624,10 @@ Result AuboArm::pauseProgram() return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] pauseProgram failed: ret=" + std::to_string(ret)); } + if (sdk_->safety_monitor) { + sdk_->safety_monitor->runtime_state.store( + static_cast(RuntimeState::Paused)); + } return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, @@ -948,11 +3643,15 @@ Result AuboArm::stopProgram() } try { const int ret = sdk_->rpc_client->getRuntimeMachine()->abort(); - busy_.store(false); if (ret != 0) { return Result::failure(ArmErrorCode::CommandFailed, "[AuboArm] stopProgram failed: ret=" + std::to_string(ret)); } + if (sdk_->safety_monitor) { + sdk_->safety_monitor->runtime_state.store( + static_cast(RuntimeState::Stopped)); + sdk_->safety_monitor->runtime_abort_required.store(false); + } return Result::success(); } catch (const std::exception& e) { return Result::failure(ArmErrorCode::CommandFailed, @@ -1049,6 +3748,119 @@ bool AuboArm::validDof_(const std::size_t size, std::string& error) const return true; } +Result AuboArm::completeSafetyRecovery_( + const std::string& context, + const std::uint64_t expected_safety_epoch) +{ + std::shared_ptr rpc_client; + std::shared_ptr monitor; + { + std::lock_guard lock(mutex_); + const auto ready = ensureConnected_(context); + if (!ready.ok()) { + return ready; + } + rpc_client = sdk_->rpc_client; + monitor = sdk_->safety_monitor; + } + + try { + if (!monitor) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " failed: hardware safety monitor is unavailable"); + } + std::unique_lock command_rpc_lock( + monitor->command_rpc_mutex); + Result interface_result; + auto robot_interface = getPrimaryRobotInterface( + rpc_client, context, interface_result); + if (!interface_result.ok()) { + return interface_result; + } + refreshSafetySample(rpc_client, monitor, robot_interface); + if (monitor->emergency_stop_source.load() != 0) { + return Result::failure( + ArmErrorCode::RobotInEmergencyStop, + "[AuboArm] " + context + + " rejected: hardware emergency-stop input is active"); + } + + const auto snapshot = monitor->safety_state->snapshot(); + if (snapshot.epoch != expected_safety_epoch) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] " + context + + " rejected: a newer safety event superseded this recovery request"); + } + if (!snapshot.latched) { + return aubo_internal::isMotionSafe(snapshot.observed) + ? Result::success() + : Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " failed: safety state is " + + safetyConditionName(snapshot.observed)); + } + if (!aubo_internal::isMotionSafe(snapshot.observed)) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: hardware safety state is " + + safetyConditionName(snapshot.observed)); + } + if (monitor->robot_mode.load() != + static_cast(RobotModeType::Running)) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: robot must be Running before the safety latch can be cleared"); + } + + const auto recovery_token = + monitor->safety_state->beginRecovery( + expected_safety_epoch); + if (!recovery_token.has_value()) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] " + context + + " rejected: another recovery is active or the safety state changed"); + } + SafetyRecoveryGuard recovery_guard{ + monitor->safety_state, *recovery_token}; + cancelForSafetyTransition(monitor); + if (!enforceControllerTermination(rpc_client, monitor)) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] " + context + + " failed: old motion/program could not be terminated and verified"); + } + + refreshSafetySample(rpc_client, monitor, robot_interface); + const bool robot_running = + monitor->robot_mode.load() == + static_cast(RobotModeType::Running); + if (!recovery_guard.complete( + robot_running, + true, + monitor->cancellation_confirmed.load())) { + return Result::failure( + ArmErrorCode::CommandRejected, + "[AuboArm] " + context + + " failed: safety state changed while recovery was being verified"); + } + emergency_stopped_.store(false); + servo_mode_.store(false); + return Result::success(); + } catch (const std::exception& e) { + return Result::failure( + ArmErrorCode::CommandFailed, + "[AuboArm] " + context + + " failed during safety recovery: " + e.what()); + } +} + Result AuboArm::ensureConnected_(const std::string& context) const { if (!connected_.load()) { @@ -1062,4 +3874,100 @@ Result AuboArm::ensureConnected_(const std::string& context) const return Result::success(); } +Result AuboArm::ensureMotionReady_( + const std::string& context, + std::uint64_t& safety_epoch) const +{ + const auto connected = ensureConnected_(context); + if (!connected.ok()) { + return connected; + } + if (!sdk_->safety_monitor) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: hardware safety monitor is unavailable"); + } + + const auto monitor = sdk_->safety_monitor; + if (!safetySampleFresh(monitor)) { + publishSafetyUnavailable(monitor, "sample is stale"); + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: hardware safety state is unavailable or stale"); + } + + const auto sampled_condition = + aubo_internal::effectiveSafetyCondition( + safetyConditionFromSdk(static_cast( + monitor->safety_mode.load())), + monitor->emergency_stop_source.load()); + if (aubo_internal::isHardwareEmergencyStop(sampled_condition)) { + const auto previous = monitor->safety_state->snapshot(); + monitor->safety_state->observe(sampled_condition); + if (!previous.latched || + previous.observed != sampled_condition) { + cancelForSafetyTransition(monitor); + } + } + + const auto snapshot = monitor->safety_state->snapshot(); + const auto condition = snapshot.latched + ? snapshot.latched_reason + : snapshot.observed; + if (snapshot.latched || + !aubo_internal::isMotionSafe(snapshot.observed)) { + ArmErrorCode code = ArmErrorCode::RobotNotReady; + if (condition == + aubo_internal::SafetyCondition::RobotEmergencyStop || + condition == + aubo_internal::SafetyCondition::SystemEmergencyStop || + condition == + aubo_internal::SafetyCondition::SoftwareEmergencyStop) { + code = ArmErrorCode::RobotInEmergencyStop; + } else if ( + condition == aubo_internal::SafetyCondition::ProtectiveStop || + condition == aubo_internal::SafetyCondition::SafeguardStop) { + code = ArmErrorCode::RobotInProtectiveStop; + } else if ( + condition == aubo_internal::SafetyCondition::Fault || + condition == aubo_internal::SafetyCondition::Violation) { + code = ArmErrorCode::RobotInFault; + } + std::string recovery_instruction = + "; clear the hardware condition and perform explicit recovery"; + if (aubo_internal::isHardwareEmergencyStop(condition) && + monitor->auto_power_on_after_hardware_estop_release && + !monitor->automatic_recovery_suppressed.load()) { + recovery_instruction = + "; release the physical emergency stop and wait for " + "automatic power-on recovery"; + } + return Result::failure( + code, + "[AuboArm] " + context + + " rejected: hardware safety latch is " + + safetyConditionName(condition) + recovery_instruction); + } + + if (monitor->robot_mode.load() != + static_cast(RobotModeType::Running)) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: robot is not in Running mode"); + } + + const auto permit = monitor->safety_state->tryPermit(); + if (!permit.has_value()) { + return Result::failure( + ArmErrorCode::RobotNotReady, + "[AuboArm] " + context + + " rejected: no valid hardware safety permit"); + } + safety_epoch = permit->epoch; + return Result::success(); +} + } // namespace cmvr::device diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_arm.h b/cmvr-es/devices/arm/aubo_arm/aubo_arm.h index a4d4dd6f..8665aecc 100644 --- a/cmvr-es/devices/arm/aubo_arm/aubo_arm.h +++ b/cmvr-es/devices/arm/aubo_arm/aubo_arm.h @@ -2,6 +2,8 @@ #define CMVR_ES_AUBO_ARM_H #include +#include +#include #include #include #include @@ -21,6 +23,8 @@ public: std::string typeName() const override { return "AuboARM"; } bool init() override; bool stop() override; + bool executeJsonCommand(const std::string& request_json, + std::string& response_json) override; RobotModel getRobotModel() const override { return model_; } std::size_t getDof() const override { return model_.dof; } @@ -28,27 +32,22 @@ public: JointGroupState getJointState() const override; CartesianPose getTcpPose(FrameType frame = FrameType::Base) const override; RobotMode getRobotMode() const override; - SafetyMode getSafetyMode() const override { return SafetyMode::Normal; } - ControlMode getControlMode() const override { return servo_mode_.load() ? ControlMode::Servo : ControlMode::Position; } + SafetyMode getSafetyMode() const override; + ControlMode getControlMode() const override; + bool supportsActionQueueMotion() const noexcept override { return true; } Result torqueOn() override; + Result torqueOn( + const std::function& cancellation_requested) override; Result torqueOff() override; Result calibrateZeroQ(const std::string& joint_name) override; Result emergencyStop() override; - Result protectiveStop() override { return emergencyStop(); } - Result recoverProtectiveStop( - const JointTrajectory&, - const MotionOptions&) override - { - return Result::failure( - ArmErrorCode::UnsupportedCommand, - "protective recovery is not implemented for AuboArm"); - } + Result protectiveStop() override; Result setSpeedScaling(double scaling) override; double getSpeedScaling() const override { return speed_scaling_; } - bool isProtectiveStopped() const override { return false; } - bool isEmergencyStopped() const override { return emergency_stopped_; } - bool isFault() const override { return false; } + bool isProtectiveStopped() const override; + bool isEmergencyStopped() const override; + bool isFault() const override; Result moveJ(const JointPositionCommand& target, const MotionOptions& options) override; Result speedJ(const JointVelocityCommand& velocity, double acceleration, double duration) override; @@ -72,8 +71,8 @@ public: Result powerOff() override { return torqueOff(); } Result brakeRelease() override { return torqueOn(); } Result shutdown() override; - Result clearFault() override { return Result::success(); } - Result unlockProtectiveStop() override { return Result::success(); } + Result clearFault() override; + Result unlockProtectiveStop() override; Result loadProgram(const std::string& program_name) override; Result playProgram() override; Result pauseProgram() override; @@ -86,16 +85,27 @@ public: CartesianPose fk(const std::string& base_link, const std::string& ee_link) override; CartesianPose fk(bool is_tcp = true) override; CartesianVelocity getSpeedLCommandTwistBase() const override { return {}; } - bool busy() const override { return busy_.load(); } + bool busy() const override; private: + enum class MotionStopKind { + Automatic, + Joint, + Linear, + }; + Result unsupported_(const std::string& name) const; bool validDof_(std::size_t size, std::string& error) const; Result ensureConnected_(const std::string& context) const; + Result ensureMotionReady_(const std::string& context, + std::uint64_t& safety_epoch) const; + Result completeSafetyRecovery_(const std::string& context, + std::uint64_t expected_safety_epoch); + Result unlockProtectiveStop_( + std::optional expected_safety_epoch); + Result stopMotion_(MotionStopKind kind, double acceleration); -#if defined(CMVR_HAS_AUBO_SDK) struct SdkState; -#endif private: config::RobotArmConfig cfg_; @@ -110,12 +120,10 @@ private: std::atomic connected_{false}; std::atomic busy_{false}; std::atomic servo_mode_{false}; - bool emergency_stopped_{false}; + std::atomic emergency_stopped_{false}; mutable std::mutex mutex_; -#if defined(CMVR_HAS_AUBO_SDK) std::unique_ptr sdk_; -#endif }; } // namespace cmvr::device diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_motion_result.h b/cmvr-es/devices/arm/aubo_arm/aubo_motion_result.h new file mode 100644 index 00000000..d1c92fb0 --- /dev/null +++ b/cmvr-es/devices/arm/aubo_arm/aubo_motion_result.h @@ -0,0 +1,45 @@ +#ifndef CMVR_ES_AUBO_MOTION_RESULT_H +#define CMVR_ES_AUBO_MOTION_RESULT_H + +namespace cmvr::device::aubo_internal { + +enum class MotionCommandOutcome { + CompletedWithoutMotion, + CompletedAfterMotion, + Cancelled, + SubmitFailed, + CompletionFailed, +}; + +enum class MotionWaitResult { + Completed, + Cancelled, + Failed, +}; + +template +MotionCommandOutcome resolveMotionCommand( + const int return_code, + const int success_code, + const int request_ignore_code, + WaitForCompletion&& wait_for_completion) +{ + if (return_code == request_ignore_code) { + return MotionCommandOutcome::CompletedWithoutMotion; + } + if (return_code != success_code) { + return MotionCommandOutcome::SubmitFailed; + } + const auto wait_result = wait_for_completion(); + if (wait_result == MotionWaitResult::Cancelled) { + return MotionCommandOutcome::Cancelled; + } + if (wait_result != MotionWaitResult::Completed) { + return MotionCommandOutcome::CompletionFailed; + } + return MotionCommandOutcome::CompletedAfterMotion; +} + +} // namespace cmvr::device::aubo_internal + +#endif // CMVR_ES_AUBO_MOTION_RESULT_H diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_motion_state.h b/cmvr-es/devices/arm/aubo_arm/aubo_motion_state.h new file mode 100644 index 00000000..84c84367 --- /dev/null +++ b/cmvr-es/devices/arm/aubo_arm/aubo_motion_state.h @@ -0,0 +1,369 @@ +#ifndef CMVR_ES_AUBO_MOTION_STATE_H +#define CMVR_ES_AUBO_MOTION_STATE_H + +#include +#include +#include +#include +#include +#include + +namespace cmvr::device::aubo_internal { + +enum class MotionKind { + None, + Joint, + Linear, +}; + +struct MotionToken { + std::uint64_t generation{0}; + MotionKind kind{MotionKind::None}; + + bool valid() const noexcept + { + return generation != 0 && kind != MotionKind::None; + } +}; + +enum class MotionStartStatus { + Started, + Invalid, + Busy, + Stopping, + Blocked, +}; + +struct MotionStartResult { + MotionStartStatus status{MotionStartStatus::Busy}; + MotionToken token; + + bool started() const noexcept + { + return status == MotionStartStatus::Started; + } +}; + +enum class MotionFinishMode { + RestorePrevious, + Clear, + Retain, +}; + +enum class StopStartStatus { + Started, + AlreadyStopping, +}; + +enum class StopWaitStatus { + Completed, + Failed, + Timeout, +}; + +class StopCompletion final { +public: + StopWaitStatus waitFor(const std::chrono::milliseconds timeout) + { + std::unique_lock lock(mutex_); + if (!cv_.wait_for(lock, timeout, [this]() { return completed_; })) { + return StopWaitStatus::Timeout; + } + return succeeded_ + ? StopWaitStatus::Completed + : StopWaitStatus::Failed; + } + +private: + friend class MotionState; + + void finish(const bool succeeded) + { + { + std::lock_guard lock(mutex_); + succeeded_ = succeeded; + completed_ = true; + } + cv_.notify_all(); + } + + std::mutex mutex_; + std::condition_variable cv_; + bool completed_{false}; + bool succeeded_{false}; +}; + +struct StopRequest { + StopStartStatus status{StopStartStatus::AlreadyStopping}; + MotionKind kind{MotionKind::None}; + MotionToken active_token; + bool tracked_motion{false}; + std::shared_ptr completion; + + bool started() const noexcept + { + return status == StopStartStatus::Started; + } +}; + +struct SafetyCancelResult { + MotionKind kind{MotionKind::None}; + MotionToken active_token; + bool tracked_motion{false}; +}; + +// Tracks one direct AUBO motion owner. MoveJ/MoveL submissions are serialized +// through the vendor call. Speed calls release the outer mutex before their +// potentially blocking SDK call, so the generation cancellation below also +// closes the stop-vs-speed-submission race. +class MotionState final { +public: + MotionStartResult begin( + const MotionKind kind, + const bool replace_retained_same_kind = false) + { + std::lock_guard lock(mutex_); + if (kind == MotionKind::None) { + return {MotionStartStatus::Invalid, {}}; + } + if (stop_in_progress_) { + return {MotionStartStatus::Stopping, {}}; + } + if (blocked_) { + return {MotionStartStatus::Blocked, {}}; + } + if (owner_active_) { + return {MotionStartStatus::Busy, {}}; + } + if (last_kind_ != MotionKind::None && + (!replace_retained_same_kind || last_kind_ != kind)) { + return {MotionStartStatus::Busy, {}}; + } + + MotionToken token{++next_generation_, kind}; + owner_active_ = true; + active_token_ = token; + previous_kind_ = last_kind_; + return {MotionStartStatus::Started, token}; + } + + void finish( + const MotionToken& token, + const MotionFinishMode mode = MotionFinishMode::RestorePrevious) + { + std::lock_guard lock(mutex_); + if (!owner_active_ || + active_token_.generation != token.generation) { + return; + } + + owner_active_ = false; + active_token_ = {}; + if (!stop_in_progress_ && !blocked_) { + if (mode == MotionFinishMode::Retain) { + last_kind_ = token.kind; + } else if (mode == MotionFinishMode::Clear) { + last_kind_ = MotionKind::None; + } else { + last_kind_ = previous_kind_; + } + } + previous_kind_ = MotionKind::None; + owner_finished_cv_.notify_all(); + } + + void failMotion(const MotionToken& token) + { + std::lock_guard lock(mutex_); + if (!owner_active_ || + active_token_.generation != token.generation) { + return; + } + owner_active_ = false; + active_token_ = {}; + last_kind_ = token.kind; + previous_kind_ = MotionKind::None; + blocked_ = true; + owner_finished_cv_.notify_all(); + } + + StopRequest beginStop( + const MotionKind requested_kind = MotionKind::None) + { + std::lock_guard lock(mutex_); + if (stop_in_progress_) { + return { + StopStartStatus::AlreadyStopping, + MotionKind::None, + {}, + false, + active_stop_completion_}; + } + + auto completion = std::make_shared(); + stop_in_progress_ = true; + active_stop_completion_ = completion; + const MotionToken active = owner_active_ + ? active_token_ + : MotionToken{}; + // A successful speedJoint/speedLine call may keep the controller in + // velocity mode after the SDK function returns, even when the target + // velocity is zero and the robot currently reports steady. Retain that + // motion kind until a typed stop has been acknowledged. + const bool tracked_motion = + active.valid() || last_kind_ != MotionKind::None; + if (active.valid()) { + cancelled_generation_ = std::max( + cancelled_generation_, active.generation); + } + MotionKind kind = MotionKind::None; + if (active.valid()) { + kind = active.kind; + } else if (last_kind_ != MotionKind::None) { + kind = last_kind_; + } else if (requested_kind != MotionKind::None) { + kind = requested_kind; + } else { + kind = last_kind_; + } + if (kind != MotionKind::None) { + last_kind_ = kind; + } + return { + StopStartStatus::Started, + kind, + active, + tracked_motion, + completion}; + } + + SafetyCancelResult cancelActiveForSafety() + { + std::lock_guard lock(mutex_); + const MotionToken active = owner_active_ + ? active_token_ + : MotionToken{}; + if (active.valid()) { + cancelled_generation_ = std::max( + cancelled_generation_, active.generation); + } + + const MotionKind kind = active.valid() + ? active.kind + : last_kind_; + if (kind != MotionKind::None) { + last_kind_ = kind; + } + // This block is intentionally independent of stop_in_progress_. The + // monitor may observe the safety event while a software Stop owns the + // stop transaction; either way no new motion may enter. + blocked_ = true; + owner_finished_cv_.notify_all(); + return {kind, active, active.valid() || kind != MotionKind::None}; + } + + bool cancelled(const MotionToken& token) const + { + std::lock_guard lock(mutex_); + return token.valid() && + token.generation <= cancelled_generation_; + } + + bool waitForOwnerExit( + const MotionToken& token, + const std::chrono::milliseconds timeout) + { + if (!token.valid()) { + return true; + } + std::unique_lock lock(mutex_); + return owner_finished_cv_.wait_for( + lock, + timeout, + [this, &token]() { + return !owner_active_ || + active_token_.generation != token.generation; + }); + } + + bool ownerActive(const MotionToken& token) const + { + if (!token.valid()) { + return false; + } + std::lock_guard lock(mutex_); + return owner_active_ && + active_token_.generation == token.generation; + } + + StopWaitStatus waitForStopCompletion( + const StopRequest& request, + const std::chrono::milliseconds timeout) const + { + if (!request.completion) { + return StopWaitStatus::Failed; + } + return request.completion->waitFor(timeout); + } + + bool completeStop() + { + std::shared_ptr completion; + { + std::lock_guard lock(mutex_); + if (owner_active_) { + return false; + } + stop_in_progress_ = false; + blocked_ = false; + active_token_ = {}; + last_kind_ = MotionKind::None; + previous_kind_ = MotionKind::None; + completion = std::move(active_stop_completion_); + owner_finished_cv_.notify_all(); + } + if (completion) { + completion->finish(true); + } + return true; + } + + void failStop() + { + std::shared_ptr completion; + { + std::lock_guard lock(mutex_); + stop_in_progress_ = false; + blocked_ = true; + completion = std::move(active_stop_completion_); + owner_finished_cv_.notify_all(); + } + if (completion) { + completion->finish(false); + } + } + + bool busy() const + { + std::lock_guard lock(mutex_); + return owner_active_ || stop_in_progress_ || blocked_ || + last_kind_ != MotionKind::None; + } + +private: + mutable std::mutex mutex_; + std::condition_variable owner_finished_cv_; + std::uint64_t next_generation_{0}; + std::uint64_t cancelled_generation_{0}; + MotionToken active_token_; + MotionKind last_kind_{MotionKind::None}; + MotionKind previous_kind_{MotionKind::None}; + std::shared_ptr active_stop_completion_; + bool owner_active_{false}; + bool stop_in_progress_{false}; + bool blocked_{false}; +}; + +} // namespace cmvr::device::aubo_internal + +#endif // CMVR_ES_AUBO_MOTION_STATE_H diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_safety_state.h b/cmvr-es/devices/arm/aubo_arm/aubo_safety_state.h new file mode 100644 index 00000000..065453cc --- /dev/null +++ b/cmvr-es/devices/arm/aubo_arm/aubo_safety_state.h @@ -0,0 +1,260 @@ +#ifndef CMVR_ES_AUBO_SAFETY_STATE_H +#define CMVR_ES_AUBO_SAFETY_STATE_H + +#include +#include +#include + +namespace cmvr::device::aubo_internal { + +// This is deliberately richer than RobotArm::SafetyMode. Recovery and +// Violation have no lossless public mapping, but both must remain fail-closed. +enum class SafetyCondition { + Unknown, + Normal, + Reduced, + Recovery, + Violation, + ProtectiveStop, + SafeguardStop, + SystemEmergencyStop, + RobotEmergencyStop, + SoftwareEmergencyStop, + Fault, +}; + +inline bool isMotionSafe(const SafetyCondition condition) noexcept +{ + return condition == SafetyCondition::Normal || + condition == SafetyCondition::Reduced; +} + +inline bool isHardwareEmergencyStop( + const SafetyCondition condition) noexcept +{ + return condition == SafetyCondition::SystemEmergencyStop || + condition == SafetyCondition::RobotEmergencyStop; +} + +inline SafetyCondition effectiveSafetyCondition( + const SafetyCondition reported_condition, + const int robot_emergency_stop_source) noexcept +{ + // The source bitmask describes robot-side inputs such as the control box + // and teach pendant. Keep the SDK's SystemEmergencyStop classification for + // the separate external system-emergency input. + if (reported_condition == SafetyCondition::SystemEmergencyStop) { + return SafetyCondition::SystemEmergencyStop; + } + if (robot_emergency_stop_source < 0) { + return SafetyCondition::Unknown; + } + if (robot_emergency_stop_source != 0) { + return SafetyCondition::RobotEmergencyStop; + } + return reported_condition; +} + +inline bool needsProtectiveUnlock( + const SafetyCondition condition) noexcept +{ + return condition == SafetyCondition::ProtectiveStop || + condition == SafetyCondition::Violation; +} + +inline bool needsInterfaceBoardRestart( + const SafetyCondition condition) noexcept +{ + return condition == SafetyCondition::SystemEmergencyStop || + condition == SafetyCondition::RobotEmergencyStop || + condition == SafetyCondition::Fault; +} + +struct SafetyPermit { + std::uint64_t epoch{0}; + + bool valid() const noexcept { return epoch != 0; } +}; + +struct RecoveryToken { + std::uint64_t epoch{0}; + + bool valid() const noexcept { return epoch != 0; } +}; + +struct SafetySnapshot { + SafetyCondition observed{SafetyCondition::Unknown}; + SafetyCondition latched_reason{SafetyCondition::Unknown}; + std::uint64_t epoch{0}; + bool latched{false}; + bool recovery_in_progress{false}; + bool software_emergency_stop_latched{false}; +}; + +inline bool shouldAutoRecoverHardwareEmergencyStop( + const SafetySnapshot& snapshot, + const bool hardware_emergency_stop_was_observed, + const int current_emergency_stop_source, + const bool auto_power_on_enabled, + const bool automatic_recovery_suppressed) noexcept +{ + return auto_power_on_enabled && !automatic_recovery_suppressed && + hardware_emergency_stop_was_observed && snapshot.latched && + !snapshot.recovery_in_progress && + !snapshot.software_emergency_stop_latched && + isHardwareEmergencyStop(snapshot.latched_reason) && + isMotionSafe(snapshot.observed) && + current_emergency_stop_source == 0; +} + +// Hardware safety is an event, not a level. Once an unsafe state has been +// observed, returning to Normal only changes the observed level. A separate, +// explicit recovery must prove that the old controller operation has been +// cancelled before new motion permits can be issued. +class SafetyState final { +public: + SafetyState() = default; + + void observe(const SafetyCondition condition) + { + std::lock_guard lock(mutex_); + const bool changed = observed_ != condition; + observed_ = condition; + if (condition == SafetyCondition::SoftwareEmergencyStop) { + software_emergency_stop_latched_ = true; + } + if (isMotionSafe(condition)) { + return; + } + + const bool preserve_hardware_estop_latch = + condition == SafetyCondition::Unknown && latched_ && + isHardwareEmergencyStop(latched_reason_) && + !software_emergency_stop_latched_; + if (!latched_ || recovery_in_progress_ || + (changed && !preserve_hardware_estop_latch)) { + ++epoch_; + } + latched_ = true; + recovery_in_progress_ = false; + // A physical E-stop sample can continue arriving after a software + // E-stop request. Keep the software stop independently latched so a + // later physical-input release can never clear it automatically. + if (software_emergency_stop_latched_) { + latched_reason_ = SafetyCondition::SoftwareEmergencyStop; + } else if (!preserve_hardware_estop_latch) { + latched_reason_ = condition; + } + } + + std::optional tryPermit() const + { + std::lock_guard lock(mutex_); + if (latched_ || !isMotionSafe(observed_)) { + return std::nullopt; + } + return SafetyPermit{epoch_}; + } + + bool validate(const SafetyPermit permit) const + { + std::lock_guard lock(mutex_); + return permit.valid() && permit.epoch == epoch_ && !latched_ && + isMotionSafe(observed_); + } + + std::optional beginRecovery( + const std::uint64_t expected_epoch) + { + std::lock_guard lock(mutex_); + if (expected_epoch == 0 || expected_epoch != epoch_ || !latched_ || + recovery_in_progress_ || + !isMotionSafe(observed_)) { + return std::nullopt; + } + recovery_in_progress_ = true; + return RecoveryToken{epoch_}; + } + + bool completeRecovery( + const RecoveryToken token, + const bool robot_running, + const bool controller_idle, + const bool cancellation_confirmed) + { + std::lock_guard lock(mutex_); + if (!token.valid() || token.epoch != epoch_ || !latched_ || + !recovery_in_progress_ || !isMotionSafe(observed_) || + !robot_running || !controller_idle || + !cancellation_confirmed) { + return false; + } + + latched_ = false; + recovery_in_progress_ = false; + latched_reason_ = SafetyCondition::Unknown; + software_emergency_stop_latched_ = false; + ++epoch_; + return true; + } + + // The caller may clear the physical E-stop latch only after it has powered + // the controller, released the brakes, and then re-confirmed an empty, + // steady controller in Running mode. This never authorizes replaying the + // old target, runtime program, or servo session. + bool completeHardwareEmergencyStopRecovery( + const RecoveryToken token, + const bool robot_running, + const bool controller_idle, + const bool cancellation_confirmed) + { + std::lock_guard lock(mutex_); + if (!token.valid() || token.epoch != epoch_ || !latched_ || + !recovery_in_progress_ || + software_emergency_stop_latched_ || + !isHardwareEmergencyStop(latched_reason_) || + !isMotionSafe(observed_) || !robot_running || !controller_idle || + !cancellation_confirmed) { + return false; + } + + latched_ = false; + recovery_in_progress_ = false; + latched_reason_ = SafetyCondition::Unknown; + ++epoch_; + return true; + } + + void failRecovery(const RecoveryToken token) + { + std::lock_guard lock(mutex_); + if (token.valid() && token.epoch == epoch_) { + recovery_in_progress_ = false; + } + } + + SafetySnapshot snapshot() const + { + std::lock_guard lock(mutex_); + return { + observed_, + latched_reason_, + epoch_, + latched_, + recovery_in_progress_, + software_emergency_stop_latched_}; + } + +private: + mutable std::mutex mutex_; + SafetyCondition observed_{SafetyCondition::Unknown}; + SafetyCondition latched_reason_{SafetyCondition::Unknown}; + std::uint64_t epoch_{1}; + bool latched_{false}; + bool recovery_in_progress_{false}; + bool software_emergency_stop_latched_{false}; +}; + +} // namespace cmvr::device::aubo_internal + +#endif // CMVR_ES_AUBO_SAFETY_STATE_H diff --git a/cmvr-es/devices/arm/aubo_arm/aubo_torque_on_result.h b/cmvr-es/devices/arm/aubo_arm/aubo_torque_on_result.h new file mode 100644 index 00000000..4f2f1365 --- /dev/null +++ b/cmvr-es/devices/arm/aubo_arm/aubo_torque_on_result.h @@ -0,0 +1,50 @@ +#ifndef CMVR_ES_AUBO_TORQUE_ON_RESULT_H +#define CMVR_ES_AUBO_TORQUE_ON_RESULT_H + +#include +#include +#include + +#include "common/types/arm/arm_types.h" + +namespace cmvr::device::aubo_internal { + +inline Result preservePrimaryTorqueOnFailure( + Result primary_failure, + const std::optional& cancellation_outcome) +{ + if (!cancellation_outcome.has_value() || + cancellation_outcome->message.empty()) { + return primary_failure; + } + + if (!primary_failure.message.empty()) { + primary_failure.message += "; "; + } + primary_failure.message += + "cancellation handling: " + cancellation_outcome->message; + return primary_failure; +} + +template +std::optional runTorqueOnControllerMutation( + const int success_code, + Mutation&& mutation, + FailureResult&& failure_result, + CancellationOutcome&& cancellation_outcome) +{ + const int return_code = std::forward(mutation)(); + if (return_code != success_code) { + auto primary_failure = + std::forward(failure_result)(return_code); + return preservePrimaryTorqueOnFailure( + std::move(primary_failure), + std::forward(cancellation_outcome)()); + } + return std::forward(cancellation_outcome)(); +} + +} // namespace cmvr::device::aubo_internal + +#endif // CMVR_ES_AUBO_TORQUE_ON_RESULT_H diff --git a/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt b/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt index 617fab7d..ca88f4fc 100644 --- a/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt +++ b/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt @@ -1,5 +1,7 @@ add_library(huayan_arm SHARED huayan_arm.cpp) +find_package(Threads REQUIRED) + set(HUAYAN_ARM_SDK_DIR ${CMAKE_SOURCE_DIR}/dependency/${ARCH}/third_party/huayan_arm/v1.0) target_include_directories(huayan_arm @@ -20,9 +22,10 @@ target_link_libraries(huayan_arm PRIVATE HR_Pro glog + Threads::Threads ) add_library(cmvr_es::device::huayan_arm ALIAS huayan_arm) install(TARGETS huayan_arm LIBRARY DESTINATION lib) -install(FILES ${HUAYAN_ARM_SDK_DIR}/lib/libHR_Pro.so DESTINATION lib) \ No newline at end of file +install(FILES ${HUAYAN_ARM_SDK_DIR}/lib/libHR_Pro.so DESTINATION lib) diff --git a/cmvr-es/devices/arm/robot_arm.h b/cmvr-es/devices/arm/robot_arm.h index f3b927d2..7b9eff4f 100644 --- a/cmvr-es/devices/arm/robot_arm.h +++ b/cmvr-es/devices/arm/robot_arm.h @@ -2,6 +2,7 @@ #define CMVR_ES_ROBOT_ARM_H #include +#include #include #include #include @@ -28,15 +29,57 @@ public: virtual SafetyMode getSafetyMode() const = 0; virtual ControlMode getControlMode() const = 0; + // Queued actions require synchronous completion, cooperative cancellation + // at the final device-submission boundary, and a bounded typed Stop which + // returns success only after controller idle is confirmed. Backends must + // opt in only after all of these semantics have been validated. + virtual bool supportsActionQueueMotion() const noexcept { return false; } + + // ArmTeleop requires an explicitly reviewed group-servo implementation. + // Existing and vendor arms remain unavailable until their implementations + // override this capability after timing and partial-write validation. + virtual bool supportsTeleopGroupServo() const noexcept { return false; } + virtual JointEffortSource jointEffortSource() const noexcept + { + return JointEffortSource::Unspecified; + } + virtual Result torqueOn() = 0; + // Long-running startup implementations may cooperatively observe loss of + // their control lease. Backends which have not adopted cancellation retain + // the legacy behavior, while still rejecting an already-cancelled request + // before entering the vendor API. + virtual Result torqueOn( + const std::function& cancellation_requested) + { + if (cancellation_requested) { + try { + if (cancellation_requested()) { + return Result::failure( + ArmErrorCode::CommandRejected, + "torqueOn cancelled before execution"); + } + } catch (...) { + return Result::failure( + ArmErrorCode::CommandRejected, + "torqueOn cancellation check failed"); + } + } + return torqueOn(); + } virtual Result torqueOff() = 0; virtual Result calibrateZeroQ(const std::string& joint_name) = 0; virtual Result emergencyStop() = 0; virtual Result protectiveStop() = 0; virtual Result recoverProtectiveStop( - const JointTrajectory& path, - const MotionOptions& options) = 0; + const JointTrajectory&, + const MotionOptions&) + { + return Result::failure( + ArmErrorCode::UnsupportedCommand, + "protective recovery is unsupported by this RobotArm"); + } virtual Result setSpeedScaling(double scaling) = 0; virtual double getSpeedScaling() const = 0; virtual bool isProtectiveStopped() const = 0; @@ -76,6 +119,27 @@ public: FrameType frame = FrameType::Base) = 0; virtual Result stopServoMode() = 0; + // Torque streaming is optional. Backends which do not provide an atomic + // group torque port retain source compatibility and fail explicitly. + virtual Result startTorqueMode(const TorqueServoOptions&) + { + return Result::failure( + ArmErrorCode::UnsupportedCommand, + "torque servo mode is unsupported by this RobotArm"); + } + virtual Result servoTorque(const JointTorqueCommand&) + { + return Result::failure( + ArmErrorCode::UnsupportedCommand, + "torque servo command is unsupported by this RobotArm"); + } + virtual Result stopTorqueMode() + { + return Result::failure( + ArmErrorCode::UnsupportedCommand, + "torque servo mode is unsupported by this RobotArm"); + } + virtual Result connect(const std::string& ip, int port) = 0; virtual Result disconnect() = 0; virtual bool isConnected() const = 0; diff --git a/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt b/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt new file mode 100644 index 00000000..17c4ff22 --- /dev/null +++ b/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt @@ -0,0 +1,23 @@ +add_library(ume_robot_arm SHARED + src/damiao_mit_codec.cpp + src/damiao_can_fd_chain.cpp + src/ume_robot_arm.cpp +) + +target_include_directories(ume_robot_arm PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_link_libraries(ume_robot_arm + PUBLIC + cmvr_es::device::canbus + cmvr_es::ik_solver + cmvr_es::common + PRIVATE + cmvr_es::proto + cmvr_es::logging + pthread +) + +add_library(cmvr_es::device::ume_robot_arm ALIAS ume_robot_arm) +install(TARGETS ume_robot_arm LIBRARY DESTINATION lib) diff --git a/cmvr-es/devices/biohead/abstract_biohead.h b/cmvr-es/devices/biohead/abstract_biohead.h index aaf28658..c4768e41 100644 --- a/cmvr-es/devices/biohead/abstract_biohead.h +++ b/cmvr-es/devices/biohead/abstract_biohead.h @@ -1,6 +1,12 @@ #ifndef ABSTRACT_BIOHEAD_H #define ABSTRACT_BIOHEAD_H #pragma once + +#include +#include +#include +#include + #include "../abstract_device.h" namespace cmvr::device { @@ -58,6 +64,8 @@ namespace cmvr::device { // 抽象头部类 class AbstractBiohead : public AbstractDevice { public: + using OperationalToken = std::uint64_t; + AbstractBiohead() = default; ~AbstractBiohead() override = default; @@ -76,20 +84,142 @@ namespace cmvr::device { virtual void expressionSadness() {}; virtual void expressionYawn() {}; + // Capture under the process-wide StopAll admission gate. Commands + // from an older generation are rejected after operational stop. + OperationalToken beginOperationalActivity() const noexcept + { + std::lock_guard lock(operational_mutex_); + return operational_generation_; + } + + virtual bool setExpressionPoseIfCurrent( + OperationalToken token, + FacialExpressionState& expression_state, + double vel = 0.5, + double acc = 0.1) + { + return runIfOperationalActivityCurrent_(token, [&] { + setExpressionPose(expression_state, vel, acc); + }); + } + + virtual bool streamFacialPoseIfCurrent( + OperationalToken token, + FacialExpressionState& expression_state, + double vel, + double acc) + { + return runIfOperationalActivityCurrent_(token, [&] { + streamFacialPose(expression_state, vel, acc); + }); + } + + virtual bool speakStartIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + speakstart(); + }); + } + + virtual bool expressionHappyIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionHappy(); + }); + } + + virtual bool expressionSurprisedIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionSurprised(); + }); + } + + virtual bool expressionTiredIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionTired(); + }); + } + + virtual bool expressionAngryIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionAngry(); + }); + } + + virtual bool expressionSadnessIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionSadness(); + }); + } + + virtual bool expressionYawnIfCurrent(OperationalToken token) + { + return runIfOperationalActivityCurrent_(token, [&] { + expressionYawn(); + }); + } + + // Stops expression motion and speaking without closing the device. + // True confirms that old activity was fenced and the hold completed. + virtual bool stopOperationalActivity() + { + invalidateOperationalActivities_(); + speakstop(); + (void)runOperationalStop_([&] { eStop(); }); + return false; + } + FacialExpressionState expression_state_; - std::atomic emergency_stop_requested = false; - + // Legacy gRPC streaming cancellation flag retained while callers move + // to the operational-generation fence above. + std::atomic emergency_stop_requested{false}; + protected: + template + bool runIfOperationalActivityCurrent_( + const OperationalToken token, + Operation&& operation) + { + std::lock_guard lock(operational_mutex_); + if (token == 0U || token != operational_generation_) { + return false; + } + std::forward(operation)(); + return true; + } + template + bool runOperationalStop_(Operation&& operation) + { + std::lock_guard lock(operational_mutex_); + std::forward(operation)(); + return true; + } + bool operationalActivityCurrent_( + const OperationalToken token) const noexcept + { + std::lock_guard lock(operational_mutex_); + return token != 0U && token == operational_generation_; + } + void invalidateOperationalActivities_() noexcept + { + std::lock_guard lock(operational_mutex_); + ++operational_generation_; + if (operational_generation_ == 0U) { + ++operational_generation_; + } + } + private: + mutable std::mutex operational_mutex_; + OperationalToken operational_generation_{1U}; }; } // namespace cmvr::device #endif // ABSTRACT_BIOHEAD_H - - - - - diff --git a/cmvr-es/devices/camera/abstract_camera.h b/cmvr-es/devices/camera/abstract_camera.h index a3082602..7d28efca 100644 --- a/cmvr-es/devices/camera/abstract_camera.h +++ b/cmvr-es/devices/camera/abstract_camera.h @@ -131,6 +131,12 @@ namespace cmvr::device { virtual bool startStreaming() {return true;} virtual void stopStreaming() {} + virtual bool startOperationalActivity() { return start(); } + // Stops activity started by CameraService::StartCamera without + // tearing down the device lifecycle. Implementations must return true + // only after the camera is quiescent and a later start() can resume it + // without another init(). Unsupported backends fail closed. + virtual bool stopOperationalActivity() { return false; } virtual bool controlPtz(PtzCommand command, bool stop, int speed) { (void)command; (void)stop; diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc b/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc deleted file mode 100644 index 0dc99860..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc +++ /dev/null @@ -1,205 +0,0 @@ -#include "common/base/logging/logger.h" -#include "pcan_client.h" - -#include -#include -#include -#include -#include "cmvr/msgs/error_code.pb.h" -#include "cstdio" - -namespace cmvr { - namespace device { -#define CAN_ID_MASK 0x1FFFF800U // can_filter mask -#define CAN_STANDARD_MAX_ID 0x7FFU - - using cmvr::msgs::ErrorCode; - using cmvr::msgs::CANCardParameter; - PcanClient::PcanClient(const config::SocketCanConfig &cfg) { - port_ = static_cast(cfg.channel_id()); - interface_ = CANCardParameter::NATIVE; - enable_can_err_check_ = false; - } - - PcanClient::~PcanClient() { - stop(); - } - - bool PcanClient::init() { - - -#define LPCSTR const char* - /// - /// Sets a TPCANDevice value. The input can be numeric, in hexadecimal or decimal format, or as string denoting - /// a TPCANDevice value name. - /// - LPCSTR DeviceType = "PCAN_PCI"; - /// - /// Sets value in range of a double. The input can be hexadecimal or decimal format. - /// - LPCSTR DeviceID = ""; - /// - /// Sets a zero-based index value in range of a double. The input can be hexadecimal or decimal format. - /// - LPCSTR ControllerNumber = ""; - /// - /// Sets a valid Internet Protocol address - /// - LPCSTR IPAddress = ""; - /// - /// Sets a valid GUID for a PCAN device - /// - LPCSTR DeviceGUID = ""; - - - char sParameters[260]; - if (DeviceType != "") - snprintf(sParameters, sizeof(sParameters), "%s=%s", LOOKUP_DEVICE_TYPE, DeviceType); - if (DeviceID != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_DEVICE_ID, DeviceID); - } - if (ControllerNumber != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_CONTROLLER_NUMBER, ControllerNumber); - } - if (IPAddress != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_IP_ADDRESS, IPAddress); - } - - if (DeviceGUID != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_DEVICE_GUID, DeviceGUID); - } - - TPCANHandle handle; - TPCANStatus stsResult = CAN_LookUpChannel((LPSTR)sParameters, &handle); - TPCANStatus ret = CAN_Initialize(PcanHandle, Bitrate); - if (ret != PCAN_ERROR_OK) { - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return false; - } - - TPCANStatus state = CAN_GetStatus(PcanHandle); - if (state & PCAN_ERROR_BUSOFF) { - // 进入 bus-off,尝试复位总线 - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return false; - } - - return true; - } - - bool PcanClient::start() { - is_started_ = true; - return true; - } - - bool PcanClient::stop() { - if (is_started_) { - is_started_ = false; - CAN_Uninitialize(dev_handler_); - CMVR_LOG(INFO) << "close socket can ok. port:" << port_; - } - return true; - } - - cmvr::msgs::ErrorCode PcanClient::send(const std::vector &frames, int32_t *const frame_num) { - if (frame_num == nullptr) { - CMVR_LOG(FATAL) << "frame_num is null"; - } - if (frames.size() != static_cast(*frame_num)) { - CMVR_LOG(FATAL) << "frames size does not match frame_num"; - } - - if (!is_started_) { - CMVR_LOG(ERROR) << "Nvidia can client has not been initiated! Please init first!"; - return ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - for (size_t i = 0; i < frames.size() && i < MAX_CAN_SEND_FRAME_LEN; ++i) { - if (frames[i].len > CANBUS_MESSAGE_LENGTH || frames[i].len < 0) { - CMVR_LOG(ERROR) << "frames[" << i << "].len = " << frames[i].len - << ", which is not equal to can message data length (" - << CANBUS_MESSAGE_LENGTH << ")."; - return ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - if (frames[i].id > CAN_STANDARD_MAX_ID) { - send_frames_[i].ID = (frames[i].id & CAN_EFF_MASK) | CAN_EFF_FLAG; - } else { - send_frames_[i].ID = (frames[i].id & CAN_SFF_MASK); - } - // CMVR_LOG(INFO) << "send can id is " << send_frames_[i].can_id; - send_frames_[i].LEN = frames[i].len; - std::memcpy(send_frames_[i].DATA, frames[i].data, frames[i].len); - send_frames_[i].MSGTYPE = PCAN_MESSAGE_EXTENDED; - // Synchronous transmission of CAN messages - TPCANStatus ret = CAN_Write(PcanHandle, &send_frames_[i]); - if (ret != PCAN_ERROR_OK) { - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return ErrorCode::CAN_CLIENT_ERROR_BASE; - } - } - - return ErrorCode::OK; - } - - cmvr::msgs::ErrorCode PcanClient::receive(std::vector *const frames, int32_t *const frame_num) { - if (!is_started_) { - CMVR_LOG(ERROR) << "Nvidia can client is not init! Please init first!"; - return ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - - if (*frame_num > MAX_CAN_RECV_FRAME_LEN || *frame_num < 0) { - CMVR_LOG(ERROR) << "recv can frame num not in range[0, " << MAX_CAN_RECV_FRAME_LEN - << "], frame_num:" << *frame_num; - // TODO(Authors): check the difference of returning frame_num/error_code - return ErrorCode::CAN_CLIENT_ERROR_FRAME_NUM; - } - TPCANTimestamp CANTimeStamp; - for (int32_t i = 0; i < *frame_num && i < MAX_CAN_RECV_FRAME_LEN; ++i) { - CanFrame cf; - - // We execute the "Read" function of the PCANBasic - TPCANStatus ret = CAN_Read(PcanHandle, &recv_frames_[i], &CANTimeStamp); - if (ret != PCAN_ERROR_OK) { - - CMVR_LOG(ERROR) << "receive message failed, error code: " << ret; - return ErrorCode::CAN_CLIENT_ERROR_BASE; - } - if (recv_frames_[i].LEN > CANBUS_MESSAGE_LENGTH || - recv_frames_[i].LEN < 0) { - CMVR_LOG(ERROR) << "recv_frames_[" << i - << "].can_dlc = " << recv_frames_[i].LEN - << ", which is not equal to can message data length (" - << CANBUS_MESSAGE_LENGTH << ")."; - return ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - if (recv_frames_[i].ID > CAN_STANDARD_MAX_ID) { - cf.id = enable_can_err_check_ - ? recv_frames_[i].ID & CAN_EFF_MASK | CAN_ERR_FLAG - : recv_frames_[i].ID & CAN_EFF_MASK; - } else { - cf.id = (recv_frames_[i].ID & CAN_SFF_MASK); - } - CMVR_LOG(INFO) << "Socket can receive can id is " << recv_frames_[i].ID; - cf.len = recv_frames_[i].LEN; - std::memcpy(cf.data, recv_frames_[i].DATA, recv_frames_[i].LEN); - frames->push_back(cf); - } - return ErrorCode::OK; - } - - std::string PcanClient::getErrorString(const int32_t status) { - return ""; - } - } // namespace device -} // namespace cmvr diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h b/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h deleted file mode 100644 index 94401e65..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h +++ /dev/null @@ -1,86 +0,0 @@ -// -// Created by lgv on 2025/8/7. -// - -/** - * @file - * @brief Defines the SocketCanClientRaw class which inherits AbstractCanbus. - */ -#pragma once - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include "cmvr/msgs/error_code.pb.h" -#include "cmvr/msgs/can_card_parameter.pb.h" -#include "cmvr/config/motor_config/motor_config.pb.h" - -#include "gflags/gflags.h" -#include "../../abstract_canbus.h" -#include "canbus/common/canbus_consts.h" - -#include - -namespace cmvr { - namespace device { - - class PcanClient final : public AbstractCanbus { - public: - explicit PcanClient(const config::SocketCanConfig &cfg); - ~PcanClient(); - std::string typeName() const override { return "PcanClient"; } - bool init() override; - bool start() override; - bool stop() override; - - /** - * @brief Send messages - * @param frames The messages to send. - * @param frame_num The amount of messages to send. - * @return The status of the sending action - */ - cmvr::msgs::ErrorCode send(const std::vector &frames, - int32_t *const frame_num) override; - - /** - * @brief Receive messages - * @param frames The messages to receive. - * @param frame_num The amount of messages to receive. - * @return The status of the receiving action - */ - cmvr::msgs::ErrorCode receive(std::vector *const frames, - int32_t *const frame_num) override; - - /** - * @brief Get the error string. - * @param status The status to get the error string. - */ - std::string getErrorString(const int32_t status) override; - private: - int dev_handler_ = 0; - cmvr::msgs::CANCardParameter::CANChannelId port_; - cmvr::msgs::CANCardParameter::CANInterface interface_; - TPCANMsg send_frames_[MAX_CAN_SEND_FRAME_LEN]; - TPCANMsg recv_frames_[MAX_CAN_RECV_FRAME_LEN]; - - - // - bool enable_can_err_check_{false}; - const TPCANHandle PcanHandle = PCAN_USBBUS1; - const TPCANBaudrate Bitrate = PCAN_BAUD_1M; - }; - } -} diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp b/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp deleted file mode 100644 index e493b851..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "common/base/logging/logger.h" -// -// Created by lgv on 2025/8/7. -// -#include "cmvr/msgs/error_code.pb.h" -#include "cmvr/msgs/can_card_parameter.pb.h" -#include "canbus/can_client/pcan/pcan_client.h" -#include "gtest/gtest.h" -namespace cmvr { - namespace device { - using cmvr::msgs::ErrorCode; - using cmvr::msgs::CANCardParameter; - - TEST(PcanClienTest, simple_test) { - CANCardParameter param; - param.set_brand(CANCardParameter::SOCKET_CAN_RAW); - param.set_channel_id(CANCardParameter::CHANNEL_ID_ZERO); - - config::SocketCanConfig cfg; - cfg.set_channel_id(0); - PcanClient socket_can_client(cfg); - - socket_can_client.init(); - - // EXPECT_EQ(socket_can_client.start(), ErrorCode::CAN_CLIENT_ERROR_BASE); - socket_can_client.start(); - std::vector frames; - // int32_t num = 0; - // EXPECT_EQ(socket_can_client.send(frames, &num), - // ErrorCode::OK); - // ++num; - // EXPECT_EQ(socket_can_client.receive(&frames, &num), - // ErrorCode::OK); - // CMVR_LOG(INFO) << frames.at(0).CanFrameString(); - CanFrame can_frame; - can_frame.id = 0x123; - can_frame.len = 8; - memset(can_frame.data, 0xA3, sizeof(can_frame.data)); - frames.clear(); - frames.push_back(can_frame); - EXPECT_EQ(socket_can_client.sendSingleFrame(frames), - ErrorCode::OK); - socket_can_client.stop(); - } - } -} diff --git a/cmvr-es/devices/dexhand/abstract_dexhand.h b/cmvr-es/devices/dexhand/abstract_dexhand.h index 9cdb53fb..a68048e8 100644 --- a/cmvr-es/devices/dexhand/abstract_dexhand.h +++ b/cmvr-es/devices/dexhand/abstract_dexhand.h @@ -156,6 +156,17 @@ namespace cmvr::device { lifecycle == Status::STREAMING; } + // Stops command-driven activity without changing the device lifecycle + // or closing its transport. Implementations must return true only after + // no pre-stop activity can continue. Motion-capable hands without a + // reliable hold/idle command deliberately fail closed. + virtual bool stopOperationalActivity() { return false; } + + // Restores an activity paused by stopOperationalActivity(). This is + // called only after a new command has crossed the system admission + // boundary. Most motion-capable hands need no separate resume command. + virtual bool resumeOperationalActivity() { return true; } + virtual void setAngles(const std::vector& finger_joint_angles) = 0; virtual void setTactilePollingRegion(FingerType finger, TactileRegion region) { setTactilePollingRegions({TactileRegionKey{finger, region}}); diff --git a/cmvr-es/devices/gripper/abstract_gripper.h b/cmvr-es/devices/gripper/abstract_gripper.h index 728d094b..d4dcfed1 100644 --- a/cmvr-es/devices/gripper/abstract_gripper.h +++ b/cmvr-es/devices/gripper/abstract_gripper.h @@ -23,6 +23,11 @@ namespace cmvr::device{ virtual void setPosition(float position, float vel) {} virtual void setForce(float value) {} + // Stops command-driven gripper activity while preserving the device + // lifecycle. Backends must explicitly confirm this contract before + // SystemService::StopAll can report success. + virtual bool stopOperationalActivity() { return false; } + protected: GripperState state_; }; diff --git a/cmvr-es/devices/motor/README.md b/cmvr-es/devices/motor/README.md new file mode 100644 index 00000000..46f4e279 --- /dev/null +++ b/cmvr-es/devices/motor/README.md @@ -0,0 +1,36 @@ +# Motor 设备模块 + +`devices/motor/` 提供电机管理、协议适配、总线 runtime 和厂商驱动。Service、 +RobotArm 和业务 Task 只依赖 `MotorManager`/`AbstractMotor` 的稳定接口,不应 +直接访问 CAN、EtherCAT、MuJoCo 或厂商 SDK。 + +返回 [Devices 模块指南](../README.md) 或 [项目总览](../../../README.md)。 + +## 目录职责 + +| 目录 | 职责 | +| --- | --- | +| `manager/` | 创建 MotorGroup,按 `motor_id`/`joint_name` 暴露 `AbstractMotor` | +| `bus_runtime/` | 连接、收发和总线生命周期 | +| `drivers/` | CANopen、EtherCAT 和 MuJoCo 等具体后端 | + +## 当前后端 + +- CAN + TI5 CANopen; +- EtherCAT + EYOU CiA 402; +- MuJoCo 仿真电机。 + +配置示例: + +- [`ti5_motors.pb.txt`](../../config/devices/motor/ti5_motors.pb.txt) +- [`ethercat_motors.pb.txt`](../../config/devices/motor/ethercat_motors.pb.txt) +- [`mujoco_motors.pb.txt`](../../config/devices/motor/mujoco_motors.pb.txt) + +对外接口与控制权语义见 [MotorService 文档](../../service/README.md#motorservice)。 + +## 安全边界 + +- MotorService 是单轴 API,不提供多轴同扫描周期的原子 commit; +- 软件 `emergencyStop` 和 Quick Stop 不具备功能安全等级; +- 真实设备必须具有经风险评估确定的硬接线急停、安全继电器和驱动器安全链; +- 新硬件配置保持 `enable: false`,完成方向、限位和故障注入验证后才能启用。 diff --git a/cmvr-es/devices/speaker/abstract_speaker.h b/cmvr-es/devices/speaker/abstract_speaker.h index ab24542d..cfdb62d9 100644 --- a/cmvr-es/devices/speaker/abstract_speaker.h +++ b/cmvr-es/devices/speaker/abstract_speaker.h @@ -21,6 +21,11 @@ namespace cmvr::device{ virtual int getVolume() const {return 0;} virtual void pause() {} virtual void resume() {} + // Stops the current file or streamed playback without changing the + // device lifecycle. SystemService StopAll and SpeakerService use this + // typed operation; implementations should return only after their + // playback workers can no longer emit audio. + virtual bool stopPlayback() { return false; } virtual bool pushAudioFrame(const AudioStreamFrameData& frame_data) { return false; } virtual void stopStreaming() {} diff --git a/cmvr-es/manager/README.md b/cmvr-es/manager/README.md index 7ef1429b..95b2cd5c 100644 --- a/cmvr-es/manager/README.md +++ b/cmvr-es/manager/README.md @@ -6,13 +6,20 @@ ## 当前管理器 +管理模块目录统一使用 `*_manager` 后缀,主管理类使用 `*Manager` 后缀。工厂、适配器、 +账本、快照和结果结构体属于管理器内部的支撑类型,保留其职责名称,不强行改成 +`*Manager`。 + | 目录 | CMake target | 职责 | | --- | --- | --- | +| [`control_authority_manager/`](control_authority_manager/) | `cmvr_es::control_authority_manager` | 控制权租约、代际、dispatch fence 和 quarantine | | [`device_manager/`](device_manager/) | `cmvr_es::device_manager` | 按配置创建、初始化、查询和批量启停设备 | +| [`safety_manager/`](safety_manager/) | `cmvr_es::safety_manager` | Sensor/Control 安全准入、StopAll、恢复和命令账本 | | [`task_manager/`](task_manager/) | `cmvr_es::task_manager` | 创建任务、校验运行模式、统一启停和调度周期任务 | -| [`media_source_hub/`](media_source_hub/) | `cmvr_es::media_source_hub`、`cmvr_es::device_media_source_adapter` | 实时媒体源注册、按需启停和多消费者分发 | +| [`media_source_manager/`](media_source_manager/) | `cmvr_es::media_source_manager`、`cmvr_es::device_media_source_adapter` | 实时媒体源注册、按需启停和多消费者分发 | -`manager/` 当前没有聚合 `CMakeLists.txt`,三个子目录由 [`../CMakeLists.txt`](../CMakeLists.txt) 分别加入。新增 manager 时必须显式更新该文件。 +`manager/` 当前没有聚合 `CMakeLists.txt`,所有模块由 [`../CMakeLists.txt`](../CMakeLists.txt) +按依赖顺序加入。新增 manager 时必须同时更新目录、target、依赖顺序和本 README。 ## 进程生命周期 @@ -30,7 +37,8 @@ - DeviceManager 构造不会自动调用全部设备的 `start()`; - 当前主退出路径没有调用 `DeviceManager::stop()`; -- `SystemService/StopAll` 会调用 DeviceManager stop; +- `SystemService/StopAll` 只停止当前运动、控制和媒体活动,不调用 + `DeviceManager::stop()`,成功返回后可继续接受新命令; - `DeviceManager::destroyInstance()` 不调用设备 stop,销毁前必须先显式停止; - `TaskManager::destroyInstance()` 会调用 `stopRunTask()`,但 manager 未处于 running 状态时该调用会直接返回; - DeviceManager 和 TaskManager 都是首次配置生效的单例,不支持热加载。 @@ -135,12 +143,12 @@ - 有顺序依赖的工作应放入同一协调任务或显式建模; - task 返回后,其内部状态并发安全由具体实现负责。 -## MediaSourceHub +## MediaSourceManager 关键文件: -- [`media_source_hub/include/media_source_hub.h`](media_source_hub/include/media_source_hub.h) -- [`media_source_hub/src/device_media_source_adapter.cpp`](media_source_hub/src/device_media_source_adapter.cpp) +- [`media_source_manager/include/media_source_manager.h`](media_source_manager/include/media_source_manager.h) +- [`media_source_manager/src/device_media_source_adapter.cpp`](media_source_manager/src/device_media_source_adapter.cpp) - [`../common/media/media_frame.h`](../common/media/media_frame.h) - [`../common/base/ring_buffer.h`](../common/base/ring_buffer.h) @@ -151,7 +159,8 @@ | 摄像头彩色流 | `/video/color` | 64 | | 麦克风主流 | `/audio/main` | 256 | -当前 gRPC RGB/麦克风流和 QUIC 彩色/麦克风轨道使用 Hub;gRPC Depth/RGBD 仍直接读取设备帧。 +当前 gRPC RGB/麦克风流和 QUIC 彩色/麦克风轨道使用 MediaSourceManager;gRPC Depth/RGBD +仍直接读取设备帧。 ### 注册新媒体源 @@ -210,7 +219,7 @@ ring generation 不等于 `TrackDescriptor::generation`,ring 的 `ReadResult.s ## 新增第四种 Manager -1. 先确认能力不是 DeviceManager、TaskManager 或 MediaSourceHub 的子职责; +1. 先确认能力不是 DeviceManager、TaskManager 或 MediaSourceManager 的子职责; 2. 定义所有权、初始化、start/stop 和线程模型; 3. 避免新增无必要的全局单例; 4. 新建独立目录、头文件、实现和 CMake target; @@ -220,16 +229,6 @@ ring generation 不等于 `TrackDescriptor::generation`,ring 的 `ReadResult.s ## 测试 -MediaSourceHub: - -```bash -cmake --build build --target media_source_hub_test -ctest \ - --test-dir build \ - -R '^media_source_hub_test$' \ - --output-on-failure -``` - DeviceManager 已有 `device_manager_snapshot_test`,覆盖全量状态表、生命周期失败、 异常限长、排序和值快照并发读取。TaskManager 仍缺少独立 CTest。修改其行为时 至少补充: diff --git a/cmvr-es/manager/control_authority_manager/CMakeLists.txt b/cmvr-es/manager/control_authority_manager/CMakeLists.txt new file mode 100644 index 00000000..115d0698 --- /dev/null +++ b/cmvr-es/manager/control_authority_manager/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(control_authority_manager STATIC + src/control_authority_manager.cpp +) +target_compile_features(control_authority_manager PUBLIC cxx_std_17) +target_include_directories(control_authority_manager + PUBLIC + ${PROJECT_SOURCE_DIR}/cmvr-es +) + +add_library( + cmvr_es::control_authority_manager + ALIAS control_authority_manager +) +install(TARGETS control_authority_manager ARCHIVE DESTINATION lib) diff --git a/cmvr-es/manager/control_authority_manager/include/control_authority_manager.h b/cmvr-es/manager/control_authority_manager/include/control_authority_manager.h new file mode 100644 index 00000000..ceba5057 --- /dev/null +++ b/cmvr-es/manager/control_authority_manager/include/control_authority_manager.h @@ -0,0 +1,170 @@ +#ifndef CMVR_ES_CONTROL_AUTHORITY_MANAGER_H +#define CMVR_ES_CONTROL_AUTHORITY_MANAGER_H + +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::control { + +struct ControlLeaseToken { + std::string resource_id; + std::string owner_id; + std::uint64_t generation{0}; + + bool valid() const noexcept + { + return !resource_id.empty() && + !owner_id.empty() && + generation != 0U; + } +}; + +struct ControlAcquireResult { + bool acquired{false}; + ControlLeaseToken token; + std::string detail; +}; + +class ControlDispatchGuard; + +// Process-wide, transport-independent control ownership. The generation in a +// token prevents a delayed release from an old network session from releasing +// a newer lease on the same arm. +class ControlAuthorityManager { +public: + using Duration = std::chrono::milliseconds; + + static ControlAuthorityManager& instance(); + + ControlAcquireResult tryAcquire( + const std::string& resource_id, + const std::string& owner_id, + Duration ttl); + + // Atomically invalidates a normal control lease and joins a safety + // barrier. Each safety caller receives an independent token; normal + // control remains blocked until the last safety token is released. + ControlAcquireResult preemptAcquire( + const std::string& resource_id, + const std::string& owner_id, + Duration ttl); + + // Converts the expected normal lease into a safety barrier only while it + // is still the current lease. A stale token never preempts a successor or + // joins an existing safety barrier. + ControlAcquireResult preemptAcquireIfCurrent( + const ControlLeaseToken& expected_token, + const std::string& owner_id, + Duration ttl); + + // Waits for normal lease handlers displaced by the current safety barrier + // to release their tokens and for their in-flight dispatches to finish. + // Returns false on timeout or when safety_token is no longer a holder of + // the current entry. + bool waitForPreemptedRelease( + const ControlLeaseToken& safety_token, + Duration timeout); + + // Permanently blocks the resource only if the expected normal lease is + // still current. A later safety holder may clear this fail-closed state + // only after it has independently confirmed the preempted handler exited. + bool quarantineIfCurrent( + const ControlLeaseToken& expected_token) noexcept; + + // Abandons a safety token while retaining its barrier. A retired token can + // no longer be validated, released, or used as a recovery authority. This + // lets a failed stop path discard local token ownership without silently + // reopening the resource. + bool retireSafetyHolder( + const ControlLeaseToken& safety_token) noexcept; + + // Clears retired safety holders and a tokenless quarantine after a newer, + // active safety holder has confirmed every preempted normal handler has + // exited. Other active safety holders are deliberately preserved. + bool recoverRetiredSafetyHolders( + const ControlLeaseToken& recovery_token) noexcept; + + bool renew(const ControlLeaseToken& token, Duration ttl); + bool validate(const ControlLeaseToken& token); + + // Use only around a bounded device-command submission. Never retain this + // guard while waiting for physical motion or another long-running task. + ControlDispatchGuard tryBeginDispatch( + const ControlLeaseToken& token); + void release(const ControlLeaseToken& token) noexcept; + + // Safety/control paths which do not possess a lease use this query to + // reject mutating commands. Read-only state and stop/torque-off commands + // are intentionally allowed by their callers. + bool isLeased(const std::string& resource_id); + void revoke(const std::string& resource_id) noexcept; + + // Test/process teardown hook. Runtime code should release/revoke exact + // resources instead of clearing unrelated ownership. + void clear() noexcept; + +private: + friend class ControlDispatchGuard; + + struct SafetyHolder { + std::string owner_id; + bool retired{false}; + }; + + struct Entry; + + static void quarantine_(Entry& entry) noexcept; + bool expired_(const Entry& entry) const noexcept; + static bool isSafetyHolder_( + const Entry& entry, + const ControlLeaseToken& token) noexcept; + static bool isActiveSafetyHolder_( + const Entry& entry, + const ControlLeaseToken& token) noexcept; + static bool canErase_(const Entry& entry) noexcept; + static void invalidateToDispatchFence_(Entry& entry) noexcept; + void endDispatch_(const std::shared_ptr& entry) noexcept; + + std::mutex mutex_; + std::condition_variable release_cv_; + std::unordered_map> entries_; + std::uint64_t next_generation_{0}; +}; + +// Tracks one bounded backend dispatch without retaining the process-wide +// authority lock. Safety preemption invalidates the lease immediately, while +// waitForPreemptedRelease() joins both the displaced handler and its in-flight +// dispatches before the safety operation reaches the device. +class ControlDispatchGuard final { +public: + ControlDispatchGuard() noexcept = default; + ~ControlDispatchGuard() noexcept; + + ControlDispatchGuard(ControlDispatchGuard&& other) noexcept; + ControlDispatchGuard& operator=(ControlDispatchGuard&& other) noexcept; + + ControlDispatchGuard(const ControlDispatchGuard&) = delete; + ControlDispatchGuard& operator=(const ControlDispatchGuard&) = delete; + + bool acquired() const noexcept { return entry_ != nullptr; } + +private: + friend class ControlAuthorityManager; + + ControlDispatchGuard( + ControlAuthorityManager* manager, + std::shared_ptr entry) noexcept; + void reset_() noexcept; + + ControlAuthorityManager* manager_{nullptr}; + std::shared_ptr entry_; +}; + +} // namespace cmvr::control + +#endif // CMVR_ES_CONTROL_AUTHORITY_MANAGER_H diff --git a/cmvr-es/manager/control_authority_manager/src/control_authority_manager.cpp b/cmvr-es/manager/control_authority_manager/src/control_authority_manager.cpp new file mode 100644 index 00000000..19063685 --- /dev/null +++ b/cmvr-es/manager/control_authority_manager/src/control_authority_manager.cpp @@ -0,0 +1,682 @@ +#include "manager/control_authority_manager/include/control_authority_manager.h" + +#include + +namespace cmvr::control { + +struct ControlAuthorityManager::Entry { + std::string resource_id; + std::string owner_id; + std::uint64_t generation{0}; + std::chrono::steady_clock::time_point deadline; + bool preemptible{true}; + bool quarantined{false}; + bool quarantined_normal_pending{false}; + bool dispatch_fence_only{false}; + std::uint64_t in_flight_dispatches{0}; + std::unordered_map safety_holders; + std::unordered_map + preempted_normal_holders; +}; + +ControlDispatchGuard::ControlDispatchGuard( + ControlAuthorityManager* const manager, + std::shared_ptr entry) noexcept + : manager_(manager), + entry_(std::move(entry)) +{ +} + +ControlDispatchGuard::~ControlDispatchGuard() noexcept +{ + reset_(); +} + +ControlDispatchGuard::ControlDispatchGuard( + ControlDispatchGuard&& other) noexcept + : manager_(std::exchange(other.manager_, nullptr)), + entry_(std::move(other.entry_)) +{ +} + +ControlDispatchGuard& ControlDispatchGuard::operator=( + ControlDispatchGuard&& other) noexcept +{ + if (this != &other) { + reset_(); + manager_ = std::exchange(other.manager_, nullptr); + entry_ = std::move(other.entry_); + } + return *this; +} + +void ControlDispatchGuard::reset_() noexcept +{ + if (entry_ == nullptr) { + return; + } + auto entry = std::move(entry_); + auto* const manager = std::exchange(manager_, nullptr); + manager->endDispatch_(entry); +} + +ControlAuthorityManager& ControlAuthorityManager::instance() +{ + static ControlAuthorityManager manager; + return manager; +} + +ControlAcquireResult ControlAuthorityManager::tryAcquire( + const std::string& resource_id, + const std::string& owner_id, + const Duration ttl) +{ + if (resource_id.empty() || owner_id.empty() || + ttl <= Duration::zero()) { + return {false, {}, "invalid control lease request"}; + } + + std::lock_guard lock(mutex_); + const auto existing = entries_.find(resource_id); + if (existing != entries_.end()) { + auto& entry = *existing->second; + if (!expired_(entry)) { + if (entry.dispatch_fence_only) { + return { + false, + {}, + "control resource still has an in-flight dispatch"}; + } + return { + false, + {}, + "control resource is already leased by " + + entry.owner_id}; + } + if (entry.in_flight_dispatches != 0U) { + invalidateToDispatchFence_(entry); + return { + false, + {}, + "control resource still has an in-flight dispatch"}; + } + entries_.erase(existing); + } + + ControlLeaseToken token; + token.resource_id = resource_id; + token.owner_id = owner_id; + token.generation = ++next_generation_; + + auto entry = std::make_shared(); + entry->resource_id = resource_id; + entry->owner_id = owner_id; + entry->generation = token.generation; + entry->deadline = std::chrono::steady_clock::now() + ttl; + entries_.emplace(resource_id, std::move(entry)); + return {true, std::move(token), {}}; +} + +ControlAcquireResult ControlAuthorityManager::preemptAcquire( + const std::string& resource_id, + const std::string& owner_id, + const Duration ttl) +{ + if (resource_id.empty() || owner_id.empty() || + ttl <= Duration::zero()) { + return {false, {}, "invalid control barrier request"}; + } + + std::lock_guard lock(mutex_); + const auto existing = entries_.find(resource_id); + if (existing != entries_.end() && + !existing->second->preemptible && + !existing->second->dispatch_fence_only) { + ControlLeaseToken token; + token.resource_id = resource_id; + token.owner_id = owner_id; + token.generation = ++next_generation_; + existing->second->safety_holders.emplace( + token.generation, + SafetyHolder{token.owner_id, false}); + return {true, std::move(token), {}}; + } + + const bool replacing_normal = + existing != entries_.end() && existing->second->preemptible; + try { + ControlLeaseToken token; + token.resource_id = resource_id; + token.owner_id = owner_id; + token.generation = ++next_generation_; + + std::unordered_map safety_holders; + safety_holders.emplace( + token.generation, + SafetyHolder{owner_id, false}); + std::string safety_owner = owner_id; + std::unordered_map + preempted_normal_holders; + if (replacing_normal) { + preempted_normal_holders.emplace( + existing->second->generation, + existing->second->owner_id); + } + + std::shared_ptr entry; + if (existing == entries_.end()) { + entry = std::make_shared(); + entry->resource_id = resource_id; + entry->owner_id.swap(safety_owner); + entry->generation = token.generation; + entry->deadline = + std::chrono::steady_clock::time_point::max(); + entry->preemptible = false; + entry->safety_holders.swap(safety_holders); + entry->preempted_normal_holders.swap( + preempted_normal_holders); + entries_.emplace(resource_id, entry); + } else { + entry = existing->second; + entry->owner_id.swap(safety_owner); + entry->generation = token.generation; + entry->deadline = + std::chrono::steady_clock::time_point::max(); + entry->preemptible = false; + entry->quarantined = false; + entry->quarantined_normal_pending = false; + entry->dispatch_fence_only = false; + entry->safety_holders.swap(safety_holders); + entry->preempted_normal_holders.swap( + preempted_normal_holders); + } + return {true, std::move(token), {}}; + } catch (...) { + if (replacing_normal && existing->second->preemptible) { + quarantine_(*existing->second); + } + throw; + } +} + +ControlAcquireResult ControlAuthorityManager::preemptAcquireIfCurrent( + const ControlLeaseToken& expected_token, + const std::string& owner_id, + const Duration ttl) +{ + if (!expected_token.valid() || owner_id.empty() || + ttl <= Duration::zero()) { + return {false, {}, "invalid conditional control barrier request"}; + } + + std::lock_guard lock(mutex_); + const auto existing = entries_.find(expected_token.resource_id); + if (existing == entries_.end() || + expired_(*existing->second) || + !existing->second->preemptible || + existing->second->owner_id != expected_token.owner_id || + existing->second->generation != expected_token.generation) { + return { + false, + {}, + "expected control lease is no longer current"}; + } + + try { + ControlLeaseToken token; + token.resource_id = expected_token.resource_id; + token.owner_id = owner_id; + token.generation = ++next_generation_; + + std::unordered_map safety_holders; + safety_holders.emplace( + token.generation, + SafetyHolder{owner_id, false}); + std::string safety_owner = owner_id; + std::unordered_map + preempted_normal_holders; + preempted_normal_holders.emplace( + existing->second->generation, + existing->second->owner_id); + + auto& entry = *existing->second; + entry.owner_id.swap(safety_owner); + entry.generation = token.generation; + entry.deadline = std::chrono::steady_clock::time_point::max(); + entry.preemptible = false; + entry.quarantined = false; + entry.quarantined_normal_pending = false; + entry.dispatch_fence_only = false; + entry.safety_holders.swap(safety_holders); + entry.preempted_normal_holders.swap( + preempted_normal_holders); + return {true, std::move(token), {}}; + } catch (...) { + if (existing->second->preemptible) { + quarantine_(*existing->second); + } + throw; + } +} + +bool ControlAuthorityManager::waitForPreemptedRelease( + const ControlLeaseToken& safety_token, + const Duration timeout) +{ + if (!safety_token.valid() || timeout < Duration::zero()) { + return false; + } + + std::unique_lock lock(mutex_); + const auto currentState = [this, &safety_token]() { + const auto found = entries_.find(safety_token.resource_id); + if (found == entries_.end() || + !isActiveSafetyHolder_(*found->second, safety_token)) { + return -1; + } + return !found->second->quarantined_normal_pending && + found->second->preempted_normal_holders.empty() && + found->second->in_flight_dispatches == 0U + ? 1 + : 0; + }; + + if (currentState() < 0) { + return false; + } + release_cv_.wait_for( + lock, + timeout, + [¤tState]() { return currentState() != 0; }); + return currentState() == 1; +} + +bool ControlAuthorityManager::quarantineIfCurrent( + const ControlLeaseToken& expected_token) noexcept +{ + if (!expected_token.valid()) { + return false; + } + try { + std::lock_guard lock(mutex_); + const auto existing = entries_.find(expected_token.resource_id); + if (existing == entries_.end() || + expired_(*existing->second) || + !existing->second->preemptible || + existing->second->owner_id != expected_token.owner_id || + existing->second->generation != expected_token.generation) { + return false; + } + quarantine_(*existing->second); + return true; + } catch (...) { + return false; + } +} + +bool ControlAuthorityManager::retireSafetyHolder( + const ControlLeaseToken& safety_token) noexcept +{ + if (!safety_token.valid()) { + return false; + } + try { + std::lock_guard lock(mutex_); + const auto existing = entries_.find(safety_token.resource_id); + if (existing == entries_.end() || + existing->second->preemptible || + existing->second->dispatch_fence_only) { + return false; + } + const auto holder = existing->second->safety_holders.find( + safety_token.generation); + if (holder == existing->second->safety_holders.end() || + holder->second.owner_id != safety_token.owner_id) { + return false; + } + holder->second.retired = true; + release_cv_.notify_all(); + return true; + } catch (...) { + return false; + } +} + +bool ControlAuthorityManager::recoverRetiredSafetyHolders( + const ControlLeaseToken& recovery_token) noexcept +{ + if (!recovery_token.valid()) { + return false; + } + try { + std::lock_guard lock(mutex_); + const auto existing = entries_.find(recovery_token.resource_id); + if (existing == entries_.end() || + !isActiveSafetyHolder_(*existing->second, recovery_token) || + existing->second->quarantined_normal_pending || + !existing->second->preempted_normal_holders.empty() || + existing->second->in_flight_dispatches != 0U) { + return false; + } + + for (auto holder = existing->second->safety_holders.begin(); + holder != existing->second->safety_holders.end();) { + if (holder->second.retired) { + holder = existing->second->safety_holders.erase(holder); + } else { + ++holder; + } + } + existing->second->quarantined = false; + release_cv_.notify_all(); + return true; + } catch (...) { + return false; + } +} + +bool ControlAuthorityManager::renew( + const ControlLeaseToken& token, + const Duration ttl) +{ + if (!token.valid() || ttl <= Duration::zero()) { + return false; + } + std::lock_guard lock(mutex_); + const auto found = entries_.find(token.resource_id); + if (found == entries_.end()) { + return false; + } + if (expired_(*found->second)) { + if (found->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*found->second); + } else { + entries_.erase(found); + } + return false; + } + if (!found->second->preemptible) { + const auto holder = found->second->safety_holders.find( + token.generation); + return holder != found->second->safety_holders.end() && + holder->second.owner_id == token.owner_id && + !holder->second.retired; + } + if (found->second->owner_id != token.owner_id || + found->second->generation != token.generation) { + return false; + } + found->second->deadline = std::chrono::steady_clock::now() + ttl; + return true; +} + +bool ControlAuthorityManager::validate( + const ControlLeaseToken& token) +{ + if (!token.valid()) { + return false; + } + std::lock_guard lock(mutex_); + const auto found = entries_.find(token.resource_id); + if (found == entries_.end()) { + return false; + } + if (expired_(*found->second)) { + if (found->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*found->second); + } else { + entries_.erase(found); + } + return false; + } + if (!found->second->preemptible) { + const auto holder = found->second->safety_holders.find( + token.generation); + return holder != found->second->safety_holders.end() && + holder->second.owner_id == token.owner_id && + !holder->second.retired; + } + return found->second->owner_id == token.owner_id && + found->second->generation == token.generation; +} + +ControlDispatchGuard ControlAuthorityManager::tryBeginDispatch( + const ControlLeaseToken& token) +{ + if (!token.valid()) { + return {}; + } + std::lock_guard lock(mutex_); + const auto found = entries_.find(token.resource_id); + if (found == entries_.end()) { + return {}; + } + if (expired_(*found->second)) { + if (found->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*found->second); + } else { + entries_.erase(found); + } + return {}; + } + if (!found->second->preemptible || + found->second->owner_id != token.owner_id || + found->second->generation != token.generation) { + return {}; + } + ++found->second->in_flight_dispatches; + return ControlDispatchGuard(this, found->second); +} + +void ControlAuthorityManager::release( + const ControlLeaseToken& token) noexcept +{ + if (!token.valid()) { + return; + } + try { + std::lock_guard lock(mutex_); + const auto found = entries_.find(token.resource_id); + if (found == entries_.end()) { + return; + } + auto& entry = *found->second; + if (!entry.preemptible) { + if (entry.dispatch_fence_only) { + return; + } + const auto holder = entry.safety_holders.find(token.generation); + if (holder != entry.safety_holders.end() && + holder->second.owner_id == token.owner_id) { + if (holder->second.retired) { + return; + } + entry.safety_holders.erase(holder); + if (canErase_(entry)) { + entries_.erase(found); + } + release_cv_.notify_all(); + return; + } + + const auto preempted = entry.preempted_normal_holders.find( + token.generation); + if (preempted != entry.preempted_normal_holders.end() && + preempted->second == token.owner_id) { + entry.preempted_normal_holders.erase(preempted); + if (canErase_(entry)) { + entries_.erase(found); + } + release_cv_.notify_all(); + return; + } + + if (entry.quarantined_normal_pending && + entry.owner_id == token.owner_id && + entry.generation == token.generation) { + entry.quarantined_normal_pending = false; + if (canErase_(entry)) { + entries_.erase(found); + } + release_cv_.notify_all(); + } + } else if (entry.owner_id == token.owner_id && + entry.generation == token.generation) { + if (entry.in_flight_dispatches != 0U) { + invalidateToDispatchFence_(entry); + } else { + entries_.erase(found); + } + release_cv_.notify_all(); + } + } catch (...) { + } +} + +bool ControlAuthorityManager::isLeased( + const std::string& resource_id) +{ + if (resource_id.empty()) { + return false; + } + std::lock_guard lock(mutex_); + const auto found = entries_.find(resource_id); + if (found == entries_.end()) { + return false; + } + if (expired_(*found->second)) { + if (found->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*found->second); + return true; + } + entries_.erase(found); + return false; + } + return true; +} + +void ControlAuthorityManager::revoke( + const std::string& resource_id) noexcept +{ + try { + std::lock_guard lock(mutex_); + const auto found = entries_.find(resource_id); + if (found == entries_.end()) { + return; + } + if (found->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*found->second); + } else { + entries_.erase(found); + } + release_cv_.notify_all(); + } catch (...) { + } +} + +void ControlAuthorityManager::clear() noexcept +{ + try { + std::lock_guard lock(mutex_); + for (auto entry = entries_.begin(); entry != entries_.end();) { + if (entry->second->in_flight_dispatches != 0U) { + invalidateToDispatchFence_(*entry->second); + ++entry; + } else { + entry = entries_.erase(entry); + } + } + release_cv_.notify_all(); + } catch (...) { + } +} + +bool ControlAuthorityManager::expired_(const Entry& entry) const noexcept +{ + return !entry.quarantined && + std::chrono::steady_clock::now() >= entry.deadline; +} + +bool ControlAuthorityManager::isSafetyHolder_( + const Entry& entry, + const ControlLeaseToken& token) noexcept +{ + if (entry.preemptible || entry.dispatch_fence_only) { + return false; + } + const auto holder = entry.safety_holders.find(token.generation); + return holder != entry.safety_holders.end() && + holder->second.owner_id == token.owner_id; +} + +bool ControlAuthorityManager::isActiveSafetyHolder_( + const Entry& entry, + const ControlLeaseToken& token) noexcept +{ + if (entry.preemptible || entry.dispatch_fence_only) { + return false; + } + const auto holder = entry.safety_holders.find(token.generation); + return holder != entry.safety_holders.end() && + holder->second.owner_id == token.owner_id && + !holder->second.retired; +} + +bool ControlAuthorityManager::canErase_(const Entry& entry) noexcept +{ + if (entry.in_flight_dispatches != 0U) { + return false; + } + if (entry.dispatch_fence_only) { + return true; + } + return !entry.preemptible && + entry.safety_holders.empty() && + entry.preempted_normal_holders.empty() && + !entry.quarantined_normal_pending && + !entry.quarantined; +} + +void ControlAuthorityManager::invalidateToDispatchFence_( + Entry& entry) noexcept +{ + entry.owner_id.clear(); + entry.generation = 0U; + entry.deadline = std::chrono::steady_clock::time_point::max(); + entry.preemptible = false; + entry.quarantined = false; + entry.quarantined_normal_pending = false; + entry.dispatch_fence_only = true; + entry.safety_holders.clear(); + entry.preempted_normal_holders.clear(); +} + +void ControlAuthorityManager::endDispatch_( + const std::shared_ptr& entry) noexcept +{ + try { + std::lock_guard lock(mutex_); + if (entry->in_flight_dispatches == 0U) { + return; + } + --entry->in_flight_dispatches; + const auto found = entries_.find(entry->resource_id); + if (found != entries_.end() && found->second == entry && + canErase_(*entry)) { + entries_.erase(found); + } + release_cv_.notify_all(); + } catch (...) { + } +} + +void ControlAuthorityManager::quarantine_(Entry& entry) noexcept +{ + entry.quarantined_normal_pending = entry.preemptible; + entry.deadline = std::chrono::steady_clock::time_point::max(); + entry.preemptible = false; + entry.quarantined = true; + entry.dispatch_fence_only = false; +} + +} // namespace cmvr::control diff --git a/cmvr-es/manager/device_manager/CMakeLists.txt b/cmvr-es/manager/device_manager/CMakeLists.txt index a9ed557a..195be88f 100644 --- a/cmvr-es/manager/device_manager/CMakeLists.txt +++ b/cmvr-es/manager/device_manager/CMakeLists.txt @@ -1,5 +1,6 @@ add_library(device_manager STATIC src/device_factory.cpp + src/device_safety_adapters.cpp src/device_manager.cpp ) @@ -7,6 +8,7 @@ target_include_directories(device_manager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(device_manager PRIVATE cmvr_es::proto + cmvr_es::safety_manager cmvr_es::device::camera cmvr_es::device::agv cmvr_es::device::speaker @@ -42,9 +44,16 @@ if(BUILD_TESTING) "${CMAKE_BINARY_DIR}/cmvr_compiler_runtime") list(JOIN _device_manager_test_library_dirs ":" _device_manager_test_library_path) + set(_device_manager_snapshot_test_environment + "LD_LIBRARY_PATH=${_device_manager_test_library_path}") + if(CMVR_TEST_SYSTEM_LIBSTDCXX) + list(APPEND _device_manager_snapshot_test_environment + "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") + endif() set_tests_properties(device_manager_snapshot_test PROPERTIES ENVIRONMENT - "LD_LIBRARY_PATH=${_device_manager_test_library_path}" + "${_device_manager_snapshot_test_environment}" ) endif() + endif() diff --git a/cmvr-es/manager/device_manager/include/device_safety_adapters.h b/cmvr-es/manager/device_manager/include/device_safety_adapters.h new file mode 100644 index 00000000..359d7f4e --- /dev/null +++ b/cmvr-es/manager/device_manager/include/device_safety_adapters.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +#include "devices/abstract_device.h" +#include "manager/safety_manager/include/safety_participant.h" + +namespace cmvr::device { + +safety::DeviceSafetyRegistration makeDeviceSafetyRegistration( + const std::shared_ptr& device, + std::chrono::milliseconds configured_maximum_age = + std::chrono::milliseconds::zero(), + std::chrono::milliseconds configured_stop_timeout = + std::chrono::milliseconds::zero()); + +} // namespace cmvr::device diff --git a/cmvr-es/manager/device_manager/src/device_safety_adapters.cpp b/cmvr-es/manager/device_manager/src/device_safety_adapters.cpp new file mode 100644 index 00000000..9afdfa6c --- /dev/null +++ b/cmvr-es/manager/device_manager/src/device_safety_adapters.cpp @@ -0,0 +1,1129 @@ +#include "manager/device_manager/include/device_safety_adapters.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "devices/agv/abstract_agv.h" +#include "devices/arm/robot_arm.h" +#include "devices/battery/abstract_battery.h" +#include "devices/biohead/abstract_biohead.h" +#include "devices/camera/abstract_camera.h" +#include "devices/dexhand/abstract_dexhand.h" +#include "devices/gripper/abstract_gripper.h" +#include "devices/microphone/abstract_microphone.h" +#include "devices/motor/manager/include/motor_manager.h" +#include "devices/speaker/abstract_speaker.h" +#include "manager/control_authority_manager/include/control_authority_manager.h" +#include "manager/safety_manager/include/device_safety_endpoint.h" + +namespace cmvr::device { + +namespace { + +using safety::AdmissionPermit; +using safety::BarrierToken; +using safety::BlockerScope; +using safety::CommandIntent; +using safety::DeviceSafetyDescriptor; +using safety::DeviceSafetyEndpoint; +using safety::DeviceSafetySnapshot; +using safety::HardwareCheckResult; +using safety::ParticipantDescriptor; +using safety::ParticipantPhase; +using safety::ParticipantResult; +using safety::RecoveryCheckResult; +using safety::RecoveryContext; +using safety::RecoveryRequirement; +using safety::SafetyBlocker; +using safety::SafetyClock; +using safety::SafetyCondition; +using safety::SafetyOperationContext; +using safety::SafetyParticipant; +using safety::SafetyPolicyFamily; +using safety::SafetyReason; +using safety::SafetySnapshotPublisher; +using safety::TriState; + +using Probe = std::function; +using Operation = std::function; +using RecoveryOperation = + std::function; + +TriState tri(const bool value) noexcept +{ + return value ? TriState::True : TriState::False; +} + +bool agvStopResultAccepted(const AgvResult& result) noexcept +{ + return result.ok() || result.code == AgvErrorCode::UnsupportedCommand; +} + +bool armQuiescentForSafety(const ArmState& state) noexcept +{ + return state.protective_stopped || state.emergency_stopped || + (!state.moving && !state.program_running); +} + +SafetyReason armRecoveryReason(const ArmErrorCode code) noexcept +{ + switch (code) { + case ArmErrorCode::NotConnected: + case ArmErrorCode::ConnectionFailed: + return SafetyReason::DeviceDisconnected; + case ArmErrorCode::Timeout: + return SafetyReason::ParticipantTimeout; + case ArmErrorCode::RobotInEmergencyStop: + return SafetyReason::EmergencyStopActive; + case ArmErrorCode::RobotInProtectiveStop: + return SafetyReason::ProtectiveStopActive; + case ArmErrorCode::RobotInFault: + return SafetyReason::DeviceFault; + case ArmErrorCode::RobotNotReady: + case ArmErrorCode::RobotNotPowered: + return SafetyReason::DeviceNotReady; + case ArmErrorCode::UnsupportedCommand: + return SafetyReason::UnsupportedCommand; + case ArmErrorCode::OK: + return SafetyReason::None; + default: + return SafetyReason::DeviceFault; + } +} + +SafetyReason agvRecoveryReason(const AgvErrorCode code) noexcept +{ + switch (code) { + case AgvErrorCode::NotConnected: + case AgvErrorCode::ConnectionFailed: + return SafetyReason::DeviceDisconnected; + case AgvErrorCode::Timeout: + return SafetyReason::ParticipantTimeout; + case AgvErrorCode::EmergencyStopped: + return SafetyReason::EmergencyStopActive; + case AgvErrorCode::Fault: + return SafetyReason::DeviceFault; + case AgvErrorCode::UnsupportedCommand: + return SafetyReason::UnsupportedCommand; + case AgvErrorCode::OK: + return SafetyReason::None; + default: + return SafetyReason::DeviceFault; + } +} + +SafetyBlocker blocker( + const SafetyReason reason, + const std::string& source) +{ + return { + reason, + BlockerScope::Device, + RecoveryRequirement::HardwareReleaseRequired, + source, + {}, + 0, + 0}; +} + +DeviceSafetySnapshot baseSnapshot( + const std::string& id, + const std::uint64_t generation, + const std::uint64_t sequence) +{ + DeviceSafetySnapshot snapshot; + snapshot.device_id = id; + snapshot.device_generation = generation; + snapshot.sample_sequence = sequence; + snapshot.observed_at = SafetyClock::now(); + return snapshot; +} + +DeviceSafetyDescriptor defaultDescriptor(const AbstractDevice& device) +{ + DeviceSafetyDescriptor descriptor; + descriptor.device_id = device.id(); + descriptor.kind = device.kind(); + descriptor.maximum_snapshot_age = std::chrono::milliseconds(1000); + switch (device.kind()) { + case DeviceKind::AGV: + case DeviceKind::Arm: + case DeviceKind::BioHead: + case DeviceKind::DexHand: + case DeviceKind::Gripper: + case DeviceKind::Motor: + case DeviceKind::MotorSystem: + case DeviceKind::MujocoWorld: + case DeviceKind::Robot: + descriptor.default_policy = SafetyPolicyFamily::Control; + descriptor.requires_safe_stop = true; + descriptor.maximum_snapshot_age = std::chrono::milliseconds(500); + break; + case DeviceKind::Camera: + case DeviceKind::Microphone: + case DeviceKind::Speaker: + descriptor.default_policy = SafetyPolicyFamily::Sensor; + descriptor.requires_safe_stop = true; + break; + case DeviceKind::Battery: + case DeviceKind::CanBus: + case DeviceKind::MujocoViewer: + case DeviceKind::Unknown: + descriptor.default_policy = SafetyPolicyFamily::Sensor; + descriptor.requires_safe_stop = false; + break; + } + descriptor.supports_active_refresh = true; + return descriptor; +} + +class LegacyDeviceSafetyEndpoint final : public DeviceSafetyEndpoint { +public: + LegacyDeviceSafetyEndpoint( + DeviceSafetyDescriptor descriptor, + Probe probe, + RecoveryOperation operational_recovery) + : descriptor_(std::move(descriptor)), + probe_(std::move(probe)), + operational_recovery_(std::move(operational_recovery)), + poll_interval_(std::clamp( + descriptor_.maximum_snapshot_age / 2, + std::chrono::milliseconds(50), + std::chrono::milliseconds(500))), + worker_([this] { workerLoop_(); }) + { + } + + ~LegacyDeviceSafetyEndpoint() override + { + { + std::lock_guard lock(mutex_); + stopping_ = true; + refresh_requested_ = true; + } + refresh_.notify_all(); + if (worker_.joinable()) { + worker_.join(); + } + } + + DeviceSafetyDescriptor descriptor() const override + { + return descriptor_; + } + + void bindPublisher(SafetySnapshotPublisher publisher) override + { + std::lock_guard lock(mutex_); + publisher_ = std::move(publisher); + } + + void requestSafetyRefresh() noexcept override + { + try { + { + std::lock_guard lock(mutex_); + refresh_requested_ = true; + } + refresh_.notify_one(); + } catch (...) { + } + } + + void onDeviceGenerationChanged( + const std::uint64_t generation) noexcept override + { + generation_.store(generation, std::memory_order_release); + sequence_.store(0, std::memory_order_release); + requestSafetyRefresh(); + } + + HardwareCheckResult validateBeforeDispatch( + const AdmissionPermit& permit) override + { + if (permit.intent == CommandIntent::Observe || + permit.intent == CommandIntent::Stop || + permit.intent == CommandIntent::ResetFault) { + return {true, SafetyReason::None, {}}; + } + DeviceSafetySnapshot snapshot; + try { + snapshot = sample_(); + } catch (const std::exception& error) { + return {false, SafetyReason::InternalError, error.what()}; + } catch (...) { + return { + false, + SafetyReason::InternalError, + "legacy final hardware check threw an unknown exception"}; + } + if (snapshot.device_generation != permit.device_generation) { + return { + false, + SafetyReason::GenerationMismatch, + "device generation changed during final hardware check"}; + } + if (snapshot.condition == SafetyCondition::Unknown) { + return { + false, + SafetyReason::SafetyStateMissing, + "hardware safety state is unknown at dispatch"}; + } + if (snapshot.condition == SafetyCondition::Unsafe) { + return { + false, + SafetyReason::HardwareUnsafe, + "hardware safety state is unsafe at dispatch"}; + } + if (snapshot.connected != TriState::True) { + return { + false, + SafetyReason::DeviceDisconnected, + "device connection is not confirmed at dispatch"}; + } + if (descriptor_.default_policy == SafetyPolicyFamily::Control) { + if (snapshot.emergency_stop_active != TriState::False) { + return { + false, + SafetyReason::EmergencyStopActive, + "emergency stop is active or unknown at dispatch"}; + } + if (snapshot.protective_stop_active != TriState::False) { + return { + false, + SafetyReason::ProtectiveStopActive, + "protective stop is active or unknown at dispatch"}; + } + if (snapshot.fault_active != TriState::False) { + return { + false, + SafetyReason::DeviceFault, + "device fault is active or unknown at dispatch"}; + } + const bool safe_start_from_restricted = + permit.intent == CommandIntent::StartActivity && + snapshot.condition == SafetyCondition::Restricted; + if (snapshot.operational_ready != TriState::True && + !safe_start_from_restricted) { + return { + false, + SafetyReason::DeviceNotReady, + "device is not operationally ready at dispatch"}; + } + } + return {true, SafetyReason::None, {}}; + } + + RecoveryCheckResult reconcileAdmissionState( + const RecoveryContext&) override + { + // The legacy adapter has no operation which powers, enables, or moves + // hardware. A fresh snapshot was already verified by Coordinator. + return {true, SafetyReason::None, {}}; + } + + RecoveryCheckResult restoreOperationalState( + const RecoveryContext& context) override + { + if (!operational_recovery_) { + return { + false, + SafetyReason::UnsupportedCommand, + "device does not support operational recovery"}; + } + return operational_recovery_(context); + } + +private: + DeviceSafetySnapshot sample_() + { + const auto generation = generation_.load(std::memory_order_acquire); + const auto sequence = + sequence_.fetch_add(1, std::memory_order_acq_rel) + 1U; + auto snapshot = probe_(generation, sequence); + snapshot.device_id = descriptor_.device_id; + snapshot.device_generation = generation; + snapshot.sample_sequence = sequence; + if (snapshot.observed_at == SafetyClock::time_point{}) { + snapshot.observed_at = SafetyClock::now(); + } + SafetySnapshotPublisher publisher; + { + std::lock_guard lock(mutex_); + publisher = publisher_; + } + if (publisher) { + (void)publisher(snapshot); + } + return snapshot; + } + + void workerLoop_() + { + std::unique_lock lock(mutex_); + while (!stopping_) { + refresh_.wait_for(lock, poll_interval_, [this] { + return stopping_ || refresh_requested_; + }); + if (stopping_) { + return; + } + refresh_requested_ = false; + lock.unlock(); + try { + (void)sample_(); + } catch (...) { + DeviceSafetySnapshot unknown = baseSnapshot( + descriptor_.device_id, + generation_.load(std::memory_order_acquire), + sequence_.fetch_add(1, std::memory_order_acq_rel) + 1U); + unknown.condition = SafetyCondition::Unknown; + unknown.blockers.push_back(blocker( + SafetyReason::SafetyStateMissing, + descriptor_.device_id)); + SafetySnapshotPublisher publisher; + { + std::lock_guard publisher_lock(mutex_); + publisher = publisher_; + } + if (publisher) { + (void)publisher(std::move(unknown)); + } + } + lock.lock(); + } + } + + DeviceSafetyDescriptor descriptor_; + Probe probe_; + RecoveryOperation operational_recovery_; + const std::chrono::milliseconds poll_interval_; + std::atomic generation_{1}; + std::atomic sequence_{0}; + std::mutex mutex_; + std::condition_variable refresh_; + SafetySnapshotPublisher publisher_; + bool refresh_requested_{true}; + bool stopping_{false}; + std::thread worker_; +}; + +class CallbackSafetyParticipant final : public SafetyParticipant { +public: + CallbackSafetyParticipant( + ParticipantDescriptor descriptor, + bool control_resource, + Operation stop, + Operation verify) + : descriptor_(std::move(descriptor)), + control_resource_(control_resource), + stop_(std::move(stop)), + verify_(std::move(verify)) + { + } + + ParticipantDescriptor descriptor() const override + { + return descriptor_; + } + + BarrierToken beginBarrier( + const SafetyOperationContext& context) override + { + BarrierToken token; + token.participant_id = descriptor_.participant_id; + token.operation_id = context.operation_id; + token.safety_epoch = context.safety_epoch; + token.generation = + generation_.fetch_add(1, std::memory_order_relaxed) + 1U; + + if (!control_resource_) { + return token; + } + const auto acquired = control::ControlAuthorityManager::instance() + .preemptAcquire( + descriptor_.participant_id, + "safety:" + context.operation_id, + std::chrono::hours(24)); + if (!acquired.acquired) { + return {}; + } + try { + std::lock_guard lock(mutex_); + control_barriers_.emplace(token.generation, acquired.token); + } catch (...) { + control::ControlAuthorityManager::instance().release( + acquired.token); + throw; + } + return token; + } + + ParticipantResult requestQuiesce( + const BarrierToken&, + const SafetyOperationContext&) override + { + return stop_ ? stop_() : ParticipantResult{ + false, + SafetyReason::UnsupportedCommand, + "device has no safe-stop operation"}; + } + + ParticipantResult verifyQuiescent( + const BarrierToken& token, + const SafetyOperationContext& context) override + { + bool handler_drained = true; + if (control_resource_) { + control::ControlLeaseToken barrier; + { + std::lock_guard lock(mutex_); + const auto found = control_barriers_.find(token.generation); + if (found == control_barriers_.end()) { + return { + false, + SafetyReason::StopUnconfirmed, + "control barrier is no longer active"}; + } + barrier = found->second; + } + handler_drained = control::ControlAuthorityManager::instance() + .waitForPreemptedRelease( + barrier, + std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + std::max( + std::chrono::milliseconds::zero(), + std::chrono::duration_cast< + std::chrono::milliseconds>( + context.deadline - SafetyClock::now())))); + } + + // A preempted handler may have crossed its driver boundary after the + // first stop request. Repeat the typed stop after the dispatch fence + // before trusting the device's final quiescence report. + const auto final_stop = stop_ ? stop_() : ParticipantResult{ + false, + SafetyReason::UnsupportedCommand, + "device has no final safe-stop operation"}; + if (!handler_drained) { + std::string detail = + "preempted control handler did not leave its dispatch fence"; + if (!final_stop.success && !final_stop.detail.empty()) { + detail += "; final stop failed: " + final_stop.detail; + } + return { + false, + SafetyReason::ParticipantTimeout, + std::move(detail)}; + } + if (!final_stop.success) { + return final_stop; + } + return verify_ ? verify_() : ParticipantResult{ + false, + SafetyReason::StopUnconfirmed, + "device has no quiescence verification"}; + } + + RecoveryCheckResult recoverAdmission( + const BarrierToken&, + const RecoveryContext&) override + { + return {true, SafetyReason::None, {}}; + } + + ParticipantResult releaseBarrier( + const BarrierToken& token) noexcept override + { + if (!control_resource_) { + return {true, SafetyReason::None, {}}; + } + try { + control::ControlLeaseToken barrier; + { + std::lock_guard lock(mutex_); + const auto found = control_barriers_.find(token.generation); + if (found == control_barriers_.end()) { + return { + false, + SafetyReason::StopUnconfirmed, + "control barrier is no longer active"}; + } + barrier = found->second; + control_barriers_.erase(found); + } + control::ControlAuthorityManager::instance().release(barrier); + return {true, SafetyReason::None, {}}; + } catch (...) { + return { + false, + SafetyReason::InternalError, + "control barrier release threw an exception"}; + } + } + +private: + ParticipantDescriptor descriptor_; + bool control_resource_{false}; + Operation stop_; + Operation verify_; + std::atomic generation_{0}; + std::mutex mutex_; + std::unordered_map + control_barriers_; +}; + +Probe probeFor(const std::shared_ptr& device) +{ + if (const auto arm = std::dynamic_pointer_cast(device)) { + return [arm](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(arm->id(), generation, sequence); + const auto state = arm->getRobotState(); + snapshot.connected = tri(state.connected); + snapshot.operational_ready = tri( + state.connected && state.powered_on && + !state.fault && !state.emergency_stopped && + !state.protective_stopped); + const bool quiescent = armQuiescentForSafety(state); + snapshot.quiescent = tri(quiescent); + snapshot.motion_active = tri(!quiescent); + snapshot.actuator_enabled = tri(state.powered_on); + snapshot.emergency_stop_active = tri(state.emergency_stopped); + snapshot.protective_stop_active = tri(state.protective_stopped); + snapshot.fault_active = tri(state.fault); + snapshot.condition = !state.connected + ? SafetyCondition::Unknown + : state.fault || state.emergency_stopped || + state.protective_stopped + ? SafetyCondition::Unsafe + : state.powered_on + ? SafetyCondition::Nominal + : SafetyCondition::Restricted; + if (state.emergency_stopped) { + snapshot.blockers.push_back(blocker( + SafetyReason::EmergencyStopActive, arm->id())); + } + if (state.protective_stopped) { + snapshot.blockers.push_back(blocker( + SafetyReason::ProtectiveStopActive, arm->id())); + } + if (state.fault) { + snapshot.blockers.push_back(blocker( + SafetyReason::DeviceFault, arm->id())); + } + return snapshot; + }; + } + + if (const auto agv = std::dynamic_pointer_cast(device)) { + return [agv](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(agv->id(), generation, sequence); + const auto state = agv->runtimeState(); + const auto navigation = agv->navigationStatus(); + const bool active_navigation = + navigation.state == AgvTaskState::Waiting || + navigation.state == AgvTaskState::Running || + navigation.state == AgvTaskState::Paused; + snapshot.connected = tri(state.connected); + snapshot.operational_ready = tri( + state.connected && state.localized && !state.fault && + !state.emergency_stopped); + snapshot.quiescent = tri(!state.moving && !active_navigation); + snapshot.motion_active = tri(state.moving || active_navigation); + snapshot.actuator_enabled = TriState::Unknown; + snapshot.emergency_stop_active = tri(state.emergency_stopped); + snapshot.protective_stop_active = TriState::False; + snapshot.fault_active = tri(state.fault); + snapshot.condition = !state.connected + ? SafetyCondition::Unknown + : state.fault || state.emergency_stopped + ? SafetyCondition::Unsafe + : SafetyCondition::Nominal; + return snapshot; + }; + } + + if (const auto hand = std::dynamic_pointer_cast(device)) { + return [hand](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(hand->id(), generation, sequence); + const auto state = hand->state(); + const bool connected = + state == AbstractDexHand::Status::INITIALIZED || + state == AbstractDexHand::Status::STREAMING || + state == AbstractDexHand::Status::STOPPED; + snapshot.connected = tri(connected); + snapshot.operational_ready = tri(connected); + snapshot.quiescent = state == AbstractDexHand::Status::STOPPED || + state == AbstractDexHand::Status::INITIALIZED + ? TriState::True + : TriState::Unknown; + snapshot.motion_active = TriState::Unknown; + snapshot.actuator_enabled = TriState::Unknown; + snapshot.fault_active = tri( + state == AbstractDexHand::Status::FAULT); + snapshot.condition = !connected + ? state == AbstractDexHand::Status::FAULT + ? SafetyCondition::Unsafe + : SafetyCondition::Unknown + : SafetyCondition::Nominal; + return snapshot; + }; + } + + if (const auto motors = std::dynamic_pointer_cast(device)) { + return [motors](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(motors->id(), generation, sequence); + const auto& motor_map = motors->motorsMap(); + if (motor_map.empty()) { + snapshot.condition = SafetyCondition::Unknown; + snapshot.blockers.push_back(blocker( + SafetyReason::SafetyStateMissing, motors->id())); + return snapshot; + } + bool quiescent = true; + for (const auto& [joint, motor] : motor_map) { + (void)joint; + if (!motor) { + snapshot.condition = SafetyCondition::Unknown; + return snapshot; + } + quiescent = quiescent && std::abs(motor->getQd()) < 1e-3; + } + snapshot.connected = TriState::True; + snapshot.operational_ready = TriState::True; + snapshot.quiescent = tri(quiescent); + snapshot.motion_active = tri(!quiescent); + snapshot.condition = SafetyCondition::Nominal; + return snapshot; + }; + } + + if (const auto camera = std::dynamic_pointer_cast(device)) { + return [camera](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(camera->id(), generation, sequence); + CameraState state{}; + camera->getState(state); + snapshot.connected = tri(state.is_initialized && state.is_opened); + snapshot.operational_ready = tri( + state.is_initialized && state.is_opened && !state.is_error); + snapshot.quiescent = tri( + !state.is_streaming && !state.is_recording); + snapshot.motion_active = TriState::Unknown; + snapshot.fault_active = tri(state.is_error); + snapshot.condition = state.is_error + ? SafetyCondition::Unsafe + : state.is_initialized + ? SafetyCondition::Nominal + : SafetyCondition::Unknown; + return snapshot; + }; + } + + if (const auto microphone = + std::dynamic_pointer_cast(device)) { + return [microphone](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot( + microphone->id(), generation, sequence); + MicrophoneState state{}; + microphone->getState(state); + snapshot.connected = tri(state.is_initialized); + snapshot.operational_ready = tri( + state.is_initialized && !state.is_error); + snapshot.quiescent = tri(!state.is_recording); + snapshot.fault_active = tri(state.is_error); + snapshot.condition = state.is_error + ? SafetyCondition::Unsafe + : state.is_initialized + ? SafetyCondition::Nominal + : SafetyCondition::Unknown; + return snapshot; + }; + } + + if (const auto speaker = + std::dynamic_pointer_cast(device)) { + return [speaker](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(speaker->id(), generation, sequence); + SpeakerState state{}; + speaker->getState(state); + snapshot.connected = tri(state.is_initialized); + snapshot.operational_ready = tri(state.is_initialized); + snapshot.quiescent = tri( + !state.is_running && !state.is_decoding); + snapshot.condition = state.is_initialized + ? SafetyCondition::Nominal + : SafetyCondition::Unknown; + return snapshot; + }; + } + + if (const auto head = std::dynamic_pointer_cast(device)) { + return [head](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(head->id(), generation, sequence); + RobotState state{}; + head->getState(state); + snapshot.connected = state.error + ? TriState::False + : TriState::True; + snapshot.operational_ready = tri(!state.error); + snapshot.quiescent = TriState::Unknown; + snapshot.motion_active = TriState::Unknown; + snapshot.fault_active = tri(state.error); + snapshot.condition = state.error + ? SafetyCondition::Unsafe + : SafetyCondition::Nominal; + return snapshot; + }; + } + + if (const auto battery = + std::dynamic_pointer_cast(device)) { + return [battery](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(battery->id(), generation, sequence); + BatteryState state{}; + battery->getState(state); + const bool fault = state.health == Lifecycle::ERROR || + state.health == Lifecycle::ESTOP; + snapshot.connected = state.health == Lifecycle::INIT + ? TriState::Unknown + : TriState::True; + snapshot.operational_ready = tri(!fault); + snapshot.quiescent = TriState::True; + snapshot.fault_active = tri(fault); + snapshot.condition = fault + ? SafetyCondition::Unsafe + : state.health == Lifecycle::INIT + ? SafetyCondition::Unknown + : SafetyCondition::Nominal; + return snapshot; + }; + } + + return [id = device->id()](const std::uint64_t generation, + const std::uint64_t sequence) { + auto snapshot = baseSnapshot(id, generation, sequence); + snapshot.condition = SafetyCondition::Unknown; + snapshot.blockers.push_back(blocker( + SafetyReason::SafetyStateMissing, id)); + return snapshot; + }; +} + +RecoveryOperation operationalRecoveryFor( + const std::shared_ptr& device) +{ + if (const auto arm = std::dynamic_pointer_cast(device)) { + return [arm](const RecoveryContext& context) { + if (SafetyClock::now() >= context.deadline) { + return RecoveryCheckResult{ + false, + SafetyReason::ParticipantTimeout, + "operational recovery deadline expired before clearFault"}; + } + const auto result = arm->clearFault(); + return RecoveryCheckResult{ + result.ok(), + armRecoveryReason(result.code), + result.ok() ? std::string{} : result.message}; + }; + } + if (const auto agv = std::dynamic_pointer_cast(device)) { + return [agv](const RecoveryContext& context) { + if (SafetyClock::now() >= context.deadline) { + return RecoveryCheckResult{ + false, + SafetyReason::ParticipantTimeout, + "operational recovery deadline expired before clearFault"}; + } + const auto result = agv->clearFault(); + return RecoveryCheckResult{ + result.ok(), + agvRecoveryReason(result.code), + result.ok() ? std::string{} : result.message}; + }; + } + return {}; +} + +std::shared_ptr participantFor( + const std::shared_ptr& device, + const DeviceSafetyDescriptor& safety_descriptor, + const std::chrono::milliseconds timeout) +{ + Operation stop; + Operation verify; + + if (const auto arm = std::dynamic_pointer_cast(device)) { + stop = [arm] { + auto result = arm->stopMotion(); + if (!result.ok()) { + result = arm->emergencyStop(); + } + return ParticipantResult{ + result.ok(), + result.ok() ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + result.message}; + }; + verify = [arm] { + const auto state = arm->getRobotState(); + const bool stopped = armQuiescentForSafety(state); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::DeviceStillMoving, + stopped ? std::string{} + : "RobotArm still reports active motion"}; + }; + } else if (const auto agv = + std::dynamic_pointer_cast(device)) { + stop = [agv] { + const auto cancel = agv->cancelNavigation(); + const auto velocity = agv->stopVelocityControl(); + const auto mapping = agv->stopMapping(); + const auto confirmed = agv->confirmMotionStopped(); + const bool stopped = + agvStopResultAccepted(cancel) && + agvStopResultAccepted(velocity) && + agvStopResultAccepted(mapping) && confirmed.ok(); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : confirmed.ok() ? SafetyReason::StopUnconfirmed + : SafetyReason::DeviceStillMoving, + stopped ? std::string{} + : confirmed.message.empty() + ? "AGV operational stop was not confirmed" + : confirmed.message}; + }; + verify = [agv] { + const auto confirmed = agv->confirmMotionStopped(); + return ParticipantResult{ + confirmed.ok(), + confirmed.ok() ? SafetyReason::None + : SafetyReason::DeviceStillMoving, + confirmed.message}; + }; + } else if (const auto hand = + std::dynamic_pointer_cast(device)) { + stop = [hand] { + const bool stopped = hand->stopOperationalActivity(); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "DexHand did not confirm operational stop"}; + }; + verify = stop; + } else if (const auto motors = + std::dynamic_pointer_cast(device)) { + stop = [motors] { + bool stopped = true; + for (const auto& [joint, motor] : motors->motorsMap()) { + (void)joint; + stopped = motor && motor->quickStop() && stopped; + } + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "one or more motors did not acknowledge Quick Stop"}; + }; + verify = [motors] { + bool stopped = !motors->motorsMap().empty(); + for (const auto& [joint, motor] : motors->motorsMap()) { + (void)joint; + stopped = stopped && motor && std::abs(motor->getQd()) < 1e-3; + } + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::DeviceStillMoving, + stopped ? std::string{} + : "motor velocity has not converged to zero"}; + }; + } else if (const auto camera = + std::dynamic_pointer_cast(device)) { + stop = [camera] { + CameraState state{}; + camera->getState(state); + if (state.is_recording) { + camera->stopRecording(); + } + // Some backends use the default operational hook and report + // false even when no such activity exists. The observable final + // capture state is authoritative for this generic adapter. + (void)camera->stopOperationalActivity(); + camera->getState(state); + const bool stopped = !state.is_streaming && !state.is_recording; + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "camera activity did not stop"}; + }; + verify = [camera] { + CameraState state{}; + camera->getState(state); + const bool stopped = !state.is_streaming && !state.is_recording; + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "camera still reports active capture or recording"}; + }; + } else if (const auto microphone = + std::dynamic_pointer_cast(device)) { + stop = [microphone] { + microphone->stopStreaming(); + microphone->stopRecording(); + return ParticipantResult{true, SafetyReason::None, {}}; + }; + verify = [microphone] { + MicrophoneState state{}; + microphone->getState(state); + return ParticipantResult{ + !state.is_recording, + !state.is_recording ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + state.is_recording + ? "microphone still reports active recording" + : std::string{}}; + }; + } else if (const auto speaker = + std::dynamic_pointer_cast(device)) { + stop = [speaker] { + const bool stopped = speaker->stopPlayback(); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "speaker playback did not stop"}; + }; + verify = [speaker] { + SpeakerState state{}; + speaker->getState(state); + const bool stopped = !state.is_running && !state.is_decoding; + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "speaker still reports active playback"}; + }; + } else if (const auto head = + std::dynamic_pointer_cast(device)) { + stop = [head] { + const bool stopped = head->stopOperationalActivity(); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "BioHead did not confirm operational stop"}; + }; + verify = stop; + } else if (const auto gripper = + std::dynamic_pointer_cast(device)) { + stop = [gripper] { + const bool stopped = gripper->stopOperationalActivity(); + return ParticipantResult{ + stopped, + stopped ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + stopped ? std::string{} + : "gripper did not confirm operational stop"}; + }; + verify = stop; + } + + if (!stop || !verify) { + return {}; + } + ParticipantDescriptor descriptor; + descriptor.participant_id = device->id(); + descriptor.phase = safety_descriptor.default_policy == + SafetyPolicyFamily::Control + ? ParticipantPhase::Actuator + : ParticipantPhase::PeripheralActivity; + descriptor.required = true; + descriptor.timeout = timeout > std::chrono::milliseconds::zero() + ? timeout + : std::chrono::seconds(5); + return std::make_shared( + std::move(descriptor), + safety_descriptor.default_policy == SafetyPolicyFamily::Control, + std::move(stop), + std::move(verify)); +} + +} // namespace + +safety::DeviceSafetyRegistration makeDeviceSafetyRegistration( + const std::shared_ptr& device, + const std::chrono::milliseconds configured_maximum_age, + const std::chrono::milliseconds configured_stop_timeout) +{ + if (!device) { + return {}; + } + + safety::DeviceSafetyRegistration registration; + if (const auto endpoint_provider = + std::dynamic_pointer_cast( + device)) { + registration.endpoint = endpoint_provider->safetyEndpoint(); + } + if (registration.endpoint) { + registration.descriptor = registration.endpoint->descriptor(); + } else { + registration.descriptor = defaultDescriptor(*device); + registration.endpoint = std::make_shared( + registration.descriptor, + probeFor(device), + operationalRecoveryFor(device)); + } + + if (configured_maximum_age > std::chrono::milliseconds::zero()) { + registration.descriptor.maximum_snapshot_age = std::min( + registration.descriptor.maximum_snapshot_age, + configured_maximum_age); + } + + if (const auto participant_provider = + std::dynamic_pointer_cast( + device)) { + registration.participant = participant_provider->safetyParticipant(); + } + if (!registration.participant) { + registration.participant = participantFor( + device, registration.descriptor, configured_stop_timeout); + } + return registration; +} + +} // namespace cmvr::device diff --git a/cmvr-es/manager/media_source_manager/CMakeLists.txt b/cmvr-es/manager/media_source_manager/CMakeLists.txt new file mode 100644 index 00000000..4d80215a --- /dev/null +++ b/cmvr-es/manager/media_source_manager/CMakeLists.txt @@ -0,0 +1,45 @@ +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + cmake_minimum_required(VERSION 3.22) + project(cmvr_media_source_manager LANGUAGES CXX) + add_subdirectory( + ${CMAKE_CURRENT_SOURCE_DIR}/../../service/grpc/stop_all + ${CMAKE_CURRENT_BINARY_DIR}/stop_all + ) +endif() + +add_library(media_source_manager STATIC + src/media_source_manager.cpp +) + +target_compile_features(media_source_manager PUBLIC cxx_std_17) +target_include_directories(media_source_manager + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../.. +) +target_link_libraries(media_source_manager + PUBLIC + cmvr_es::stop_all_admission_gate +) + +add_library(cmvr_es::media_source_manager ALIAS media_source_manager) + +if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + add_library(device_media_source_adapter STATIC + src/device_media_source_adapter.cpp + ) + target_compile_features(device_media_source_adapter PUBLIC cxx_std_17) + target_include_directories(device_media_source_adapter + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../.. + ) + target_link_libraries(device_media_source_adapter + PUBLIC + cmvr_es::media_source_manager + cmvr_es::common + cmvr_es::proto + cmvr_es::logging + cmvr_es::safety_manager + ) + add_library(cmvr_es::device_media_source_adapter ALIAS device_media_source_adapter) + +endif() diff --git a/cmvr-es/manager/safety_manager/CMakeLists.txt b/cmvr-es/manager/safety_manager/CMakeLists.txt new file mode 100644 index 00000000..2c704db1 --- /dev/null +++ b/cmvr-es/manager/safety_manager/CMakeLists.txt @@ -0,0 +1,18 @@ +add_library(safety_manager STATIC + src/command_ledger.cpp + src/safety_manager.cpp + src/safety_reason.cpp + src/safety_snapshot_store.cpp +) + +target_include_directories(safety_manager PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/cmvr-es +) + +target_link_libraries(safety_manager PUBLIC + cmvr_es::control_authority_manager +) + +add_library(cmvr_es::safety_manager ALIAS safety_manager) +install(TARGETS safety_manager LIBRARY DESTINATION lib) diff --git a/cmvr-es/manager/safety_manager/include/command_ledger.h b/cmvr-es/manager/safety_manager/include/command_ledger.h new file mode 100644 index 00000000..f47a7214 --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/command_ledger.h @@ -0,0 +1,130 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "manager/safety_manager/include/safety_types.h" + +namespace cmvr::safety { + +struct CommandKey { + std::string effective_principal_id; + std::string command_id; + + bool operator==(const CommandKey& other) const noexcept + { + return effective_principal_id == other.effective_principal_id && + command_id == other.command_id; + } +}; + +struct CommandOutcome { + CommandLifecycle lifecycle{CommandLifecycle::Failed}; + SafetyReason reason{SafetyReason::InternalError}; + std::string detail; + std::string serialized_response; + std::uint64_t safety_epoch{0}; + std::uint64_t device_generation{0}; + bool hardware_submission_possible{false}; +}; + +enum class CommandReservationStatus { + AcceptedNew, + JoinedInFlight, + CachedResult, + CommandIdConflict, + ResultEvicted, + LedgerExhausted, + Invalid, +}; + +class CommandLedger final { +private: + struct State; + +public: + struct Config { + std::size_t result_capacity{4096}; + std::size_t total_id_capacity{256U * 1024U}; + }; + + class Ticket final { + public: + Ticket() = default; + bool valid() const noexcept { return state_ != nullptr; } + + private: + friend class CommandLedger; + explicit Ticket(std::shared_ptr state) + : state_(std::move(state)) + { + } + + std::shared_ptr state_; + }; + + struct Reservation { + CommandReservationStatus status{CommandReservationStatus::Invalid}; + Ticket ticket; + std::optional cached_outcome; + }; + + CommandLedger(); + explicit CommandLedger(Config config); + + Reservation reserve(CommandKey key, std::string payload_hash); + bool setLifecycle(const Ticket& ticket, + CommandLifecycle lifecycle, + std::uint64_t safety_epoch = 0, + std::uint64_t device_generation = 0, + bool hardware_submission_possible = false); + bool complete(const Ticket& ticket, CommandOutcome outcome); + std::optional wait( + const Ticket& ticket, + SafetyClock::time_point deadline = SafetyClock::time_point::max()) const; + std::optional lookup( + const CommandKey& key, + const std::string& payload_hash) const; + + std::size_t acceptedIdCount() const; + std::size_t liveRecordCount() const; + std::size_t retiredIdCount() const; + +private: + struct KeyHash { + std::size_t operator()(const CommandKey& key) const noexcept; + }; + + struct State { + CommandKey key; + std::string payload_hash; + mutable std::mutex mutex; + mutable std::condition_variable condition; + CommandLifecycle lifecycle{CommandLifecycle::Reserved}; + std::optional outcome; + std::uint64_t safety_epoch{0}; + std::uint64_t device_generation{0}; + bool hardware_submission_possible{false}; + bool terminal{false}; + }; + + static bool validKey_(const CommandKey& key) noexcept; + void trimTerminalResultsLocked_(); + + const Config config_; + mutable std::mutex mutex_; + std::unordered_map, KeyHash> records_; + std::unordered_map retired_ids_; + std::vector terminal_order_; + std::size_t terminal_result_count_{0}; +}; + +const char* toString(CommandReservationStatus status) noexcept; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/device_safety_endpoint.h b/cmvr-es/manager/safety_manager/include/device_safety_endpoint.h new file mode 100644 index 00000000..c060b8b7 --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/device_safety_endpoint.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include + +#include "manager/safety_manager/include/safety_types.h" + +namespace cmvr::safety { + +using SafetySnapshotPublisher = + std::function; + +class DeviceSafetyEndpoint { +public: + virtual ~DeviceSafetyEndpoint() = default; + + virtual DeviceSafetyDescriptor descriptor() const = 0; + virtual void bindPublisher(SafetySnapshotPublisher publisher) = 0; + virtual void requestSafetyRefresh() noexcept = 0; + // Called after a backend/session restart. Implementations must publish + // subsequent samples with this generation or remain fail-closed. + virtual void onDeviceGenerationChanged( + std::uint64_t generation) noexcept + { + (void)generation; + } + virtual HardwareCheckResult validateBeforeDispatch( + const AdmissionPermit& permit) = 0; + // Explicit operator-authorized recovery which may power or enable the + // device. RecoverSafetyState never calls this method; it is reserved for + // RestoreOperationalState transactions. + virtual RecoveryCheckResult restoreOperationalState( + const RecoveryContext&) + { + return { + false, + SafetyReason::UnsupportedCommand, + "device does not support operational recovery"}; + } + virtual RecoveryCheckResult reconcileAdmissionState( + const RecoveryContext& context) = 0; +}; + +class DeviceSafetyEndpointProvider { +public: + virtual ~DeviceSafetyEndpointProvider() = default; + virtual std::shared_ptr safetyEndpoint() = 0; +}; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/safety_manager.h b/cmvr-es/manager/safety_manager/include/safety_manager.h new file mode 100644 index 00000000..9c0fa3da --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/safety_manager.h @@ -0,0 +1,222 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "manager/safety_manager/include/command_ledger.h" +#include "manager/safety_manager/include/device_safety_endpoint.h" +#include "manager/safety_manager/include/safety_participant.h" + +namespace cmvr::safety { + +struct SafetyManagerConfig { + EnforcementMode enforcement_mode{EnforcementMode::Shadow}; + std::unordered_set enforced_device_ids; + std::chrono::milliseconds stop_all_timeout{15000}; + std::chrono::milliseconds recovery_timeout{10000}; + CommandLedger::Config command_ledger; + std::size_t event_history_capacity{2048}; + bool fail_startup_on_missing_control_capability{false}; +}; + +struct AdmissionResult { + AdmissionDecision decision; + std::optional permit; +}; + +struct StartupCoverageIssue { + std::string target_id; + SafetyReason reason{SafetyReason::None}; + std::string detail; +}; + +struct StartupCoverageResult { + bool ready{false}; + std::vector issues; +}; + +struct DeviceSafetyStateView { + DeviceSafetyDescriptor descriptor; + SafetySnapshotView safety; + device::ManagedDeviceState lifecycle{ + device::ManagedDeviceState::Unknown}; + device::DeviceHealthSnapshot health; + DeviceAdmissionState admission_state{DeviceAdmissionState::Observing}; + std::vector blockers; +}; + +struct ParticipantResultView { + bool recorded{false}; + bool success{false}; + SafetyReason reason{SafetyReason::None}; + std::string detail; +}; + +struct ParticipantSafetyStateView { + ParticipantDescriptor descriptor; + bool registered{false}; + bool barrier_active{false}; + bool barrier_retained{false}; + std::string operation_id; + std::uint64_t safety_epoch{0}; + ParticipantResultView last_request; + ParticipantResultView last_verify; + ParticipantResultView last_release; +}; + +struct SafetyManagerSnapshot { + SystemAdmissionState system_state{SystemAdmissionState::Starting}; + std::uint64_t safety_epoch{0}; + std::string service_instance_id; + EnforcementMode enforcement_mode{EnforcementMode::Shadow}; + std::string active_operation_id; + std::string active_operation_phase; + std::vector devices; + std::vector participants; + std::vector recent_events; +}; + +struct SafetyTargetResult { + std::string target_id; + bool success{false}; + SafetyReason reason{SafetyReason::None}; + std::string detail; + DeviceAdmissionState before_state{DeviceAdmissionState::Observing}; + DeviceAdmissionState after_state{DeviceAdmissionState::Observing}; +}; + +struct StopAllResult { + bool success{false}; + std::string operation_id; + std::uint64_t previous_safety_epoch{0}; + std::uint64_t current_safety_epoch{0}; + SystemAdmissionState system_state{SystemAdmissionState::Starting}; + std::vector targets; +}; + +enum class RecoveryResultCode { + Recovered, + VerifiedButStillBlocked, + BlockerRemains, + EpochMismatch, + NothingToRecover, + TimedOut, + Failed, +}; + +struct RecoveryRequest { + std::string recovery_id; + std::vector device_ids; + bool all_devices{false}; + std::uint64_t expected_safety_epoch{0}; + bool verify_only{true}; + bool restore_operational_state{false}; + std::string reason; + SafetyClock::time_point deadline{SafetyClock::time_point::max()}; + // Authorizes the state-changing part of recovery. Operational restore + // calls this before invoking device recovery; software-only recovery calls + // it after hardware verification and before releasing admission barriers. + // A false result leaves admission latched and prevents device recovery. + std::function authorize_clear; +}; + +struct RecoveryResult { + RecoveryResultCode result{RecoveryResultCode::Failed}; + std::string recovery_id; + std::uint64_t previous_safety_epoch{0}; + std::uint64_t current_safety_epoch{0}; + SystemAdmissionState system_state{SystemAdmissionState::Starting}; + std::vector targets; +}; + +class SafetyManager; + +class DispatchGuard final { +public: + DispatchGuard() noexcept = default; + ~DispatchGuard() noexcept; + DispatchGuard(DispatchGuard&& other) noexcept; + DispatchGuard& operator=(DispatchGuard&& other) noexcept; + DispatchGuard(const DispatchGuard&) = delete; + DispatchGuard& operator=(const DispatchGuard&) = delete; + + bool acquired() const noexcept { return coordinator_ != nullptr; } + const HardwareCheckResult& hardwareCheck() const noexcept + { + return hardware_check_; + } + +private: + friend class SafetyManager; + DispatchGuard(SafetyManager* coordinator, + std::string device_id, + HardwareCheckResult hardware_check) noexcept; + void reset_() noexcept; + + SafetyManager* coordinator_{nullptr}; + std::string device_id_; + HardwareCheckResult hardware_check_; +}; + +class SafetyManager final { +public: + explicit SafetyManager(SafetyManagerConfig config = {}); + ~SafetyManager(); + SafetyManager(const SafetyManager&) = delete; + SafetyManager& operator=(const SafetyManager&) = delete; + + bool registerDevice(DeviceSafetyRegistration registration); + bool registerParticipant(std::shared_ptr participant); + bool unregisterParticipant(const std::string& participant_id); + + void updateDeviceRuntimeState( + const std::string& device_id, + device::ManagedDeviceState lifecycle, + device::DeviceHealthSnapshot health = {}); + std::optional advanceDeviceGeneration( + const std::string& device_id); + StartupCoverageResult validateStartupCoverage( + SafetyClock::time_point deadline); + void markStartupComplete(); + + AdmissionResult admit(const AdmissionRequest& request); + // Lightweight session check. This validates the coordinator-owned epoch, + // generation, freshness, and admission state without calling the device + // endpoint or entering the hardware dispatch set. + HardwareCheckResult revalidatePermit( + const AdmissionPermit& permit) const; + DispatchGuard beginDispatch(const AdmissionPermit& permit); + void quarantineDevice(const std::string& device_id, + SafetyReason reason, + std::string operation_id = {}); + + StopAllResult stopAll( + std::string operation_id, + SafetyClock::time_point deadline = SafetyClock::time_point::max()); + RecoveryResult recover(const RecoveryRequest& request); + + SafetyManagerSnapshot snapshot() const; + CommandLedger& commandLedger() noexcept; + const std::string& serviceInstanceId() const noexcept; + const SafetyManagerConfig& config() const noexcept; + +private: + friend class DispatchGuard; + struct Impl; + bool publishSafetySnapshot(DeviceSafetySnapshot snapshot); + void beginShutdown() noexcept; + AdmissionDecision evaluate(const AdmissionRequest& request) const; + void endDispatch_(const std::string& device_id) noexcept; + std::unique_ptr impl_; +}; + +const char* toString(RecoveryResultCode value) noexcept; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/safety_participant.h b/cmvr-es/manager/safety_manager/include/safety_participant.h new file mode 100644 index 00000000..1a4557ce --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/safety_participant.h @@ -0,0 +1,88 @@ +#pragma once + +#include +#include +#include +#include + +#include "manager/safety_manager/include/safety_types.h" + +namespace cmvr::safety { + +class DeviceSafetyEndpoint; + +enum class ParticipantPhase { + Ingress, + Scheduler, + ControlSession, + Actuator, + PeripheralActivity, + Verification, +}; + +struct ParticipantDescriptor { + std::string participant_id; + ParticipantPhase phase{ParticipantPhase::Actuator}; + bool required{true}; + std::chrono::milliseconds timeout{5000}; +}; + +struct SafetyOperationContext { + std::string operation_id; + std::uint64_t safety_epoch{0}; + SafetyClock::time_point deadline{SafetyClock::time_point::max()}; +}; + +struct BarrierToken { + std::string participant_id; + std::string operation_id; + std::uint64_t safety_epoch{0}; + std::uint64_t generation{0}; + + bool valid() const noexcept + { + return !participant_id.empty() && !operation_id.empty() && + safety_epoch != 0 && generation != 0; + } +}; + +struct ParticipantResult { + bool success{false}; + SafetyReason reason{SafetyReason::StopUnconfirmed}; + std::string detail; +}; + +class SafetyParticipant { +public: + virtual ~SafetyParticipant() = default; + virtual ParticipantDescriptor descriptor() const = 0; + virtual BarrierToken beginBarrier( + const SafetyOperationContext& context) = 0; + virtual ParticipantResult requestQuiesce( + const BarrierToken& token, + const SafetyOperationContext& context) = 0; + virtual ParticipantResult verifyQuiescent( + const BarrierToken& token, + const SafetyOperationContext& context) = 0; + virtual RecoveryCheckResult recoverAdmission( + const BarrierToken& token, + const RecoveryContext& context) = 0; + // Commits the participant's admission reopening. A failed commit must + // leave that participant fail-closed and be retryable through recovery. + virtual ParticipantResult releaseBarrier( + const BarrierToken& token) noexcept = 0; +}; + +class SafetyParticipantProvider { +public: + virtual ~SafetyParticipantProvider() = default; + virtual std::shared_ptr safetyParticipant() = 0; +}; + +struct DeviceSafetyRegistration { + DeviceSafetyDescriptor descriptor; + std::shared_ptr endpoint; + std::shared_ptr participant; +}; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/safety_reason.h b/cmvr-es/manager/safety_manager/include/safety_reason.h new file mode 100644 index 00000000..61b44206 --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/safety_reason.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +namespace cmvr::safety { + +enum class SafetyReason { + None, + InvalidArgument, + Unauthenticated, + PermissionDenied, + RecoveryRpcDisabled, + DeviceNotFound, + DeviceUnavailable, + UnsupportedCommand, + SystemStarting, + SystemStopping, + SafetyLatched, + SafetyStateMissing, + SafetyStateStale, + HardwareUnsafe, + EmergencyStopActive, + ProtectiveStopActive, + DeviceDisconnected, + DeviceFault, + DeviceNotReady, + DeviceStillMoving, + ControlBusy, + GenerationMismatch, + CommandIdRequired, + CommandIdConflict, + ResultEvicted, + LedgerExhausted, + Backpressure, + DeadlineExceededBeforeDispatch, + OutcomeUnknown, + ParticipantTimeout, + StopUnconfirmed, + RecoveryEpochMismatch, + RecoveryReasonRequired, + RecoveryAuditFailed, + InternalError, +}; + +const char* toString(SafetyReason reason) noexcept; +bool retryWithSameCommandId(SafetyReason reason) noexcept; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/safety_snapshot_store.h b/cmvr-es/manager/safety_manager/include/safety_snapshot_store.h new file mode 100644 index 00000000..b52c1c4a --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/safety_snapshot_store.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "manager/safety_manager/include/safety_types.h" + +namespace cmvr::safety { + +class SafetySnapshotStore final { +public: + bool registerDevice(const DeviceSafetyDescriptor& descriptor, + std::uint64_t initial_generation = 1); + bool unregisterDevice(const std::string& device_id); + bool publish(DeviceSafetySnapshot snapshot); + bool markUnknown(const std::string& device_id, + SafetyReason reason, + std::string source_id = {}); + std::optional bumpGeneration( + const std::string& device_id); + + SafetySnapshotView get( + const std::string& device_id, + SafetyClock::time_point now = SafetyClock::now()) const; + std::vector snapshot( + SafetyClock::time_point now = SafetyClock::now()) const; + + bool waitForNewerSample( + const std::string& device_id, + std::uint64_t previous_sequence, + SafetyClock::time_point deadline, + SafetySnapshotView& result) const; + +private: + struct Slot { + DeviceSafetyDescriptor descriptor; + DeviceSafetySnapshot snapshot; + bool has_sample{false}; + }; + + static SafetySnapshotView viewOf_( + const Slot& slot, + SafetyClock::time_point now); + + mutable std::shared_mutex mutex_; + mutable std::condition_variable_any changed_; + std::unordered_map slots_; +}; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/include/safety_types.h b/cmvr-es/manager/safety_manager/include/safety_types.h new file mode 100644 index 00000000..743629bd --- /dev/null +++ b/cmvr-es/manager/safety_manager/include/safety_types.h @@ -0,0 +1,235 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "devices/device_types.h" +#include "manager/safety_manager/include/safety_reason.h" + +namespace cmvr::safety { + +using SafetyClock = std::chrono::steady_clock; + +enum class TriState { + Unknown, + False, + True, +}; + +enum class SafetyCondition { + Nominal, + Restricted, + Unsafe, + Unknown, +}; + +enum class CommandIntent { + Observe, + StartActivity, + Configure, + Actuate, + Stop, + ResetFault, + RecoverAdmission, +}; + +enum class SafetyPolicyFamily { + Sensor, + Control, +}; + +enum class BlockerScope { + Device, + System, +}; + +enum class RecoveryRequirement { + RefreshOnly, + ClearSoftwareLatch, + HardwareReleaseRequired, + ManualInspectionRequired, +}; + +enum class SystemAdmissionState { + Starting, + Open, + Stopping, + Latched, + Recovering, + ShuttingDown, +}; + +enum class DeviceAdmissionState { + Observing, + Open, + Blocked, + Quarantined, + Recovering, + Removed, +}; + +enum class EnforcementMode { + Legacy, + Shadow, + EnforceSelected, + EnforceAll, +}; + +enum class CommandLifecycle { + Received, + Reserved, + RejectedBeforeDispatch, + Admitted, + Dispatching, + AcceptedByHardware, + Completed, + Failed, + CanceledBeforeDispatch, + OutcomeUnknown, +}; + +struct SafetyBlocker { + SafetyReason reason{SafetyReason::None}; + BlockerScope scope{BlockerScope::Device}; + RecoveryRequirement recovery_requirement{ + RecoveryRequirement::RefreshOnly}; + std::string source_id; + std::string operation_id; + std::uint64_t first_observed_at_unix_ms{0}; + std::uint64_t last_observed_at_unix_ms{0}; +}; + +struct DeviceSafetySnapshot { + std::string device_id; + SafetyCondition condition{SafetyCondition::Unknown}; + std::uint64_t device_generation{0}; + std::uint64_t sample_sequence{0}; + SafetyClock::time_point observed_at{}; + std::uint64_t observed_at_unix_ms{0}; + + TriState connected{TriState::Unknown}; + TriState operational_ready{TriState::Unknown}; + TriState quiescent{TriState::Unknown}; + TriState motion_active{TriState::Unknown}; + TriState actuator_enabled{TriState::Unknown}; + TriState emergency_stop_active{TriState::Unknown}; + TriState protective_stop_active{TriState::Unknown}; + TriState fault_active{TriState::Unknown}; + + std::vector blockers; +}; + +struct DeviceSafetyDescriptor { + std::string device_id; + device::DeviceKind kind{device::DeviceKind::Unknown}; + SafetyPolicyFamily default_policy{SafetyPolicyFamily::Sensor}; + std::chrono::milliseconds maximum_snapshot_age{1000}; + bool requires_safe_stop{false}; + bool supports_active_refresh{false}; + bool supports_non_enabling_fault_reset{false}; +}; + +struct SafetySnapshotView { + DeviceSafetyDescriptor descriptor; + DeviceSafetySnapshot snapshot; + bool registered{false}; + bool has_sample{false}; + bool fresh{false}; + std::chrono::milliseconds sample_age{ + std::chrono::milliseconds::max()}; +}; + +struct CommandActor { + std::string principal_id{"anonymous"}; + bool authenticated{false}; + std::vector roles; +}; + +struct CommandDescriptor { + std::string full_method_name; + CommandIntent intent{CommandIntent::Observe}; + SafetyPolicyFamily policy_family{SafetyPolicyFamily::Sensor}; + bool mutating{false}; + bool safety_lane{false}; +}; + +struct AdmissionRequest { + CommandDescriptor command; + CommandActor actor; + std::string command_id; + std::string device_id; + std::optional expected_device_generation; + std::uint64_t authority_generation{0}; + SafetyClock::time_point deadline{SafetyClock::time_point::max()}; +}; + +struct AdmissionDecision { + bool allowed{false}; + bool policy_allowed{false}; + bool enforced{false}; + SafetyReason reason{SafetyReason::None}; + std::string detail; + std::uint64_t safety_epoch{0}; + std::uint64_t device_generation{0}; +}; + +struct AdmissionPermit { + AdmissionPermit() = default; + AdmissionPermit(AdmissionPermit&&) noexcept = default; + AdmissionPermit& operator=(AdmissionPermit&&) noexcept = default; + AdmissionPermit(const AdmissionPermit&) = delete; + AdmissionPermit& operator=(const AdmissionPermit&) = delete; + + std::string command_id; + std::string device_id; + CommandIntent intent{CommandIntent::Observe}; + std::uint64_t safety_epoch{0}; + std::uint64_t device_generation{0}; + std::uint64_t authority_generation{0}; + SafetyClock::time_point deadline{SafetyClock::time_point::max()}; + bool policy_allowed{false}; + bool enforced{false}; +}; + +struct HardwareCheckResult { + bool safe{false}; + SafetyReason reason{SafetyReason::SafetyStateMissing}; + std::string detail; +}; + +struct RecoveryContext { + std::string recovery_id; + std::string reason; + std::uint64_t safety_epoch{0}; + SafetyClock::time_point deadline{SafetyClock::time_point::max()}; + bool verify_only{true}; +}; + +struct RecoveryCheckResult { + bool reconciled{false}; + SafetyReason reason{SafetyReason::None}; + std::string detail; +}; + +struct SafetyEvent { + std::uint64_t sequence{0}; + std::uint64_t safety_epoch{0}; + std::uint64_t occurred_at_unix_ms{0}; + std::string source_id; + std::string operation_id; + SafetyReason reason{SafetyReason::None}; + std::string detail; +}; + +const char* toString(TriState value) noexcept; +const char* toString(SafetyCondition value) noexcept; +const char* toString(CommandIntent value) noexcept; +const char* toString(SafetyPolicyFamily value) noexcept; +const char* toString(SystemAdmissionState value) noexcept; +const char* toString(DeviceAdmissionState value) noexcept; +const char* toString(EnforcementMode value) noexcept; + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/src/command_ledger.cpp b/cmvr-es/manager/safety_manager/src/command_ledger.cpp new file mode 100644 index 00000000..95a28681 --- /dev/null +++ b/cmvr-es/manager/safety_manager/src/command_ledger.cpp @@ -0,0 +1,276 @@ +#include "manager/safety_manager/include/command_ledger.h" + +#include +#include +#include +#include +#include + +namespace cmvr::safety { + +namespace { + +constexpr std::size_t kMaxPrincipalIdLength = 256; +constexpr std::size_t kMaxCommandIdLength = 128; + +bool validIdentifier(const std::string& value, const std::size_t maximum) +{ + if (value.empty() || value.size() > maximum) { + return false; + } + return std::all_of( + value.begin(), value.end(), [](const unsigned char character) { + return std::isalnum(character) || character == '-' || + character == '_' || character == '.' || + character == ':' || character == '/'; + }); +} + +} // namespace + +CommandLedger::CommandLedger() + : CommandLedger(Config{}) +{ +} + +CommandLedger::CommandLedger(Config config) + : config_(config) +{ + if (config_.total_id_capacity == 0 || + config_.result_capacity > config_.total_id_capacity) { + throw std::invalid_argument("invalid CommandLedger capacity"); + } +} + +std::size_t CommandLedger::KeyHash::operator()( + const CommandKey& key) const noexcept +{ + const auto first = std::hash{}(key.effective_principal_id); + const auto second = std::hash{}(key.command_id); + return first ^ (second + 0x9e3779b9U + (first << 6U) + (first >> 2U)); +} + +bool CommandLedger::validKey_(const CommandKey& key) noexcept +{ + return validIdentifier( + key.effective_principal_id, kMaxPrincipalIdLength) && + validIdentifier(key.command_id, kMaxCommandIdLength); +} + +CommandLedger::Reservation CommandLedger::reserve( + CommandKey key, + std::string payload_hash) +{ + if (!validKey_(key) || payload_hash.empty()) { + return {}; + } + + std::lock_guard lock(mutex_); + const auto live = records_.find(key); + if (live != records_.end()) { + const auto& state = live->second; + std::lock_guard state_lock(state->mutex); + if (state->payload_hash != payload_hash) { + return {CommandReservationStatus::CommandIdConflict, {}, {}}; + } + if (state->terminal && state->outcome.has_value()) { + return { + CommandReservationStatus::CachedResult, + Ticket(state), + state->outcome}; + } + return { + CommandReservationStatus::JoinedInFlight, + Ticket(state), + {}}; + } + + const auto retired = retired_ids_.find(key); + if (retired != retired_ids_.end()) { + return { + retired->second == payload_hash + ? CommandReservationStatus::ResultEvicted + : CommandReservationStatus::CommandIdConflict, + {}, + {}}; + } + + if (records_.size() + retired_ids_.size() >= + config_.total_id_capacity) { + return {CommandReservationStatus::LedgerExhausted, {}, {}}; + } + + auto state = std::make_shared(); + state->key = std::move(key); + state->payload_hash = std::move(payload_hash); + const auto inserted = records_.emplace(state->key, state); + if (!inserted.second) { + throw std::logic_error("CommandLedger duplicate insertion"); + } + return { + CommandReservationStatus::AcceptedNew, + Ticket(std::move(state)), + {}}; +} + +bool CommandLedger::setLifecycle( + const Ticket& ticket, + const CommandLifecycle lifecycle, + const std::uint64_t safety_epoch, + const std::uint64_t device_generation, + const bool hardware_submission_possible) +{ + if (!ticket.valid()) { + return false; + } + std::lock_guard ledger_lock(mutex_); + const auto found = records_.find(ticket.state_->key); + if (found == records_.end() || found->second != ticket.state_) { + return false; + } + std::lock_guard state_lock(ticket.state_->mutex); + if (ticket.state_->terminal) { + return false; + } + ticket.state_->lifecycle = lifecycle; + ticket.state_->safety_epoch = safety_epoch; + ticket.state_->device_generation = device_generation; + ticket.state_->hardware_submission_possible = + ticket.state_->hardware_submission_possible || + hardware_submission_possible; + return true; +} + +bool CommandLedger::complete(const Ticket& ticket, CommandOutcome outcome) +{ + if (!ticket.valid()) { + return false; + } + + std::lock_guard ledger_lock(mutex_); + const auto found = records_.find(ticket.state_->key); + if (found == records_.end() || found->second != ticket.state_) { + return false; + } + + { + std::lock_guard state_lock(ticket.state_->mutex); + if (ticket.state_->terminal) { + return false; + } + outcome.hardware_submission_possible = + outcome.hardware_submission_possible || + ticket.state_->hardware_submission_possible; + if (outcome.safety_epoch == 0) { + outcome.safety_epoch = ticket.state_->safety_epoch; + } + if (outcome.device_generation == 0) { + outcome.device_generation = ticket.state_->device_generation; + } + ticket.state_->lifecycle = outcome.lifecycle; + ticket.state_->outcome = std::move(outcome); + ticket.state_->terminal = true; + } + ticket.state_->condition.notify_all(); + terminal_order_.push_back(ticket.state_->key); + ++terminal_result_count_; + trimTerminalResultsLocked_(); + return true; +} + +void CommandLedger::trimTerminalResultsLocked_() +{ + std::size_t consumed = 0; + while (terminal_result_count_ > config_.result_capacity && + consumed < terminal_order_.size()) { + const auto key = terminal_order_[consumed++]; + const auto found = records_.find(key); + if (found == records_.end()) { + continue; + } + const auto& state = found->second; + std::lock_guard state_lock(state->mutex); + if (!state->terminal) { + continue; + } + retired_ids_.emplace(state->key, state->payload_hash); + records_.erase(found); + --terminal_result_count_; + } + if (consumed != 0) { + terminal_order_.erase( + terminal_order_.begin(), + terminal_order_.begin() + static_cast(consumed)); + } +} + +std::optional CommandLedger::wait( + const Ticket& ticket, + const SafetyClock::time_point deadline) const +{ + if (!ticket.valid()) { + return std::nullopt; + } + std::unique_lock lock(ticket.state_->mutex); + if (deadline == SafetyClock::time_point::max()) { + ticket.state_->condition.wait( + lock, [&ticket] { return ticket.state_->terminal; }); + } else if (!ticket.state_->condition.wait_until( + lock, deadline, + [&ticket] { return ticket.state_->terminal; })) { + return std::nullopt; + } + return ticket.state_->outcome; +} + +std::optional CommandLedger::lookup( + const CommandKey& key, + const std::string& payload_hash) const +{ + std::lock_guard lock(mutex_); + const auto found = records_.find(key); + if (found == records_.end()) { + return std::nullopt; + } + std::lock_guard state_lock(found->second->mutex); + if (found->second->payload_hash != payload_hash || + !found->second->terminal) { + return std::nullopt; + } + return found->second->outcome; +} + +std::size_t CommandLedger::acceptedIdCount() const +{ + std::lock_guard lock(mutex_); + return records_.size() + retired_ids_.size(); +} + +std::size_t CommandLedger::liveRecordCount() const +{ + std::lock_guard lock(mutex_); + return records_.size(); +} + +std::size_t CommandLedger::retiredIdCount() const +{ + std::lock_guard lock(mutex_); + return retired_ids_.size(); +} + +const char* toString(const CommandReservationStatus status) noexcept +{ + switch (status) { + case CommandReservationStatus::AcceptedNew: return "AcceptedNew"; + case CommandReservationStatus::JoinedInFlight: return "JoinedInFlight"; + case CommandReservationStatus::CachedResult: return "CachedResult"; + case CommandReservationStatus::CommandIdConflict: + return "CommandIdConflict"; + case CommandReservationStatus::ResultEvicted: return "ResultEvicted"; + case CommandReservationStatus::LedgerExhausted: return "LedgerExhausted"; + case CommandReservationStatus::Invalid: return "Invalid"; + } + return "Invalid"; +} + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/src/safety_manager.cpp b/cmvr-es/manager/safety_manager/src/safety_manager.cpp new file mode 100644 index 00000000..69e1e917 --- /dev/null +++ b/cmvr-es/manager/safety_manager/src/safety_manager.cpp @@ -0,0 +1,2518 @@ +#include "manager/safety_manager/include/safety_manager.h" +#include "manager/safety_manager/include/safety_snapshot_store.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::safety { + +namespace { + +std::uint64_t unixTimeMs() noexcept +{ + const auto value = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + return value > 0 ? static_cast(value) : 1U; +} + +std::string makeInstanceId() +{ + static std::atomic sequence{0}; + std::ostringstream output; + output << "safety-" << std::hex + << std::chrono::duration_cast( + SafetyClock::now().time_since_epoch()).count() + << '-' + << sequence.fetch_add(1, std::memory_order_relaxed) + 1U; + return output.str(); +} + +std::string makeOperationId(const char* prefix) +{ + static std::atomic sequence{0}; + return std::string(prefix) + '-' + std::to_string( + sequence.fetch_add(1, std::memory_order_relaxed) + 1U); +} + +bool hasTrue(const TriState value) noexcept +{ + return value == TriState::True; +} + +bool isControlIntent(const CommandIntent intent) noexcept +{ + return intent == CommandIntent::Actuate || + intent == CommandIntent::Configure || + intent == CommandIntent::StartActivity; +} + +std::chrono::milliseconds boundedRemaining( + const SafetyClock::time_point deadline, + const std::chrono::milliseconds maximum) +{ + const auto now = SafetyClock::now(); + if (now >= deadline) { + return std::chrono::milliseconds::zero(); + } + return std::min( + maximum, + std::chrono::duration_cast(deadline - now)); +} + +SafetyBlocker makeBlocker( + const SafetyReason reason, + const BlockerScope scope, + const RecoveryRequirement recovery, + std::string source, + std::string operation = {}) +{ + const auto now = unixTimeMs(); + return { + reason, + scope, + recovery, + std::move(source), + std::move(operation), + now, + now}; +} + +class OperationExecutor final { +public: + explicit OperationExecutor(const std::size_t worker_count) + { + const auto count = std::max(1, worker_count); + workers_.reserve(count); + for (std::size_t index = 0; index < count; ++index) { + workers_.emplace_back([this] { workerLoop_(); }); + } + } + + ~OperationExecutor() + { + { + std::lock_guard lock(mutex_); + stopping_ = true; + } + available_.notify_all(); + for (auto& worker : workers_) { + if (worker.joinable()) { + worker.join(); + } + } + } + + std::future submit( + std::function operation) + { + auto task = std::make_shared>( + [operation = std::move(operation)]() mutable { + try { + return operation(); + } catch (const std::exception& error) { + return ParticipantResult{ + false, SafetyReason::InternalError, error.what()}; + } catch (...) { + return ParticipantResult{ + false, + SafetyReason::InternalError, + "participant threw an unknown exception"}; + } + }); + auto future = task->get_future(); + { + std::lock_guard lock(mutex_); + if (stopping_) { + throw std::runtime_error("safety operation executor stopped"); + } + jobs_.push([task] { (*task)(); }); + } + available_.notify_one(); + return future; + } + +private: + void workerLoop_() + { + while (true) { + std::function job; + { + std::unique_lock lock(mutex_); + available_.wait(lock, [this] { + return stopping_ || !jobs_.empty(); + }); + if (stopping_ && jobs_.empty()) { + return; + } + job = std::move(jobs_.front()); + jobs_.pop(); + } + job(); + } + } + + std::mutex mutex_; + std::condition_variable available_; + std::queue> jobs_; + std::vector workers_; + bool stopping_{false}; +}; + +int phaseRank(const ParticipantPhase phase) noexcept +{ + switch (phase) { + case ParticipantPhase::Ingress: return 0; + case ParticipantPhase::Scheduler: return 1; + case ParticipantPhase::ControlSession: return 2; + case ParticipantPhase::Actuator: return 3; + case ParticipantPhase::PeripheralActivity: return 4; + case ParticipantPhase::Verification: return 5; + } + return 5; +} + +} // namespace + +struct SafetyManager::Impl { + struct PublisherBinding { + std::atomic active{true}; + SafetyManager* coordinator{nullptr}; + }; + + struct DeviceSlot { + DeviceSafetyDescriptor descriptor; + std::shared_ptr endpoint; + std::shared_ptr participant; + std::shared_ptr publisher_binding; + device::ManagedDeviceState lifecycle{ + device::ManagedDeviceState::Unknown}; + device::DeviceHealthSnapshot health; + DeviceAdmissionState admission_state{ + DeviceAdmissionState::Observing}; + std::vector software_blockers; + std::size_t in_flight_dispatches{0}; + bool quarantined{false}; + }; + + struct RetainedBarrier { + std::shared_ptr participant; + BarrierToken token; + }; + + struct ParticipantRuntime { + ParticipantDescriptor descriptor; + bool registered{false}; + bool barrier_active{false}; + bool barrier_retained{false}; + std::string operation_id; + std::uint64_t safety_epoch{0}; + ParticipantResultView last_request; + ParticipantResultView last_verify; + ParticipantResultView last_release; + }; + + struct StopRound { + std::mutex mutex; + std::condition_variable completed; + std::atomic done{false}; + StopAllResult result; + }; + + struct RecoveryRound { + std::mutex mutex; + std::condition_variable completed; + std::string fingerprint; + std::atomic done{false}; + RecoveryResult result; + }; + + explicit Impl(SafetyManagerConfig source) + : config(std::move(source)), + ledger(config.command_ledger), + service_instance_id(makeInstanceId()), + operation_executor(4) + { + if (config.stop_all_timeout <= std::chrono::milliseconds::zero() || + config.recovery_timeout <= std::chrono::milliseconds::zero() || + config.event_history_capacity == 0) { + throw std::invalid_argument("invalid SafetyManagerConfig"); + } + } + + bool isEnforced(const std::string& device_id) const + { + switch (config.enforcement_mode) { + case EnforcementMode::Legacy: + case EnforcementMode::Shadow: + return false; + case EnforcementMode::EnforceSelected: + return config.enforced_device_ids.count(device_id) != 0; + case EnforcementMode::EnforceAll: + return true; + } + return false; + } + + void addEventLocked( + const SafetyReason reason, + std::string source, + std::string operation, + std::string detail) + { + SafetyEvent event; + event.sequence = ++next_event_sequence; + event.safety_epoch = safety_epoch; + event.occurred_at_unix_ms = unixTimeMs(); + event.source_id = std::move(source); + event.operation_id = std::move(operation); + event.reason = reason; + event.detail = std::move(detail); + events.push_back(std::move(event)); + while (events.size() > config.event_history_capacity) { + events.pop_front(); + } + } + + DeviceAdmissionState admissionStateFor( + const DeviceSlot& slot, + const SafetySnapshotView& view) const + { + if (slot.admission_state == DeviceAdmissionState::Removed) { + return DeviceAdmissionState::Removed; + } + if (slot.quarantined) { + return DeviceAdmissionState::Quarantined; + } + if (!view.has_sample) { + return DeviceAdmissionState::Observing; + } + if (!view.fresh || + view.snapshot.condition == SafetyCondition::Unknown || + view.snapshot.condition == SafetyCondition::Unsafe || + view.snapshot.connected == TriState::False || + view.snapshot.fault_active == TriState::True || + slot.lifecycle == device::ManagedDeviceState::Error) { + return DeviceAdmissionState::Blocked; + } + if (slot.descriptor.default_policy == SafetyPolicyFamily::Control && + (view.snapshot.connected != TriState::True || + view.snapshot.operational_ready != TriState::True || + view.snapshot.emergency_stop_active != TriState::False || + view.snapshot.protective_stop_active != TriState::False || + view.snapshot.fault_active != TriState::False)) { + return DeviceAdmissionState::Blocked; + } + return DeviceAdmissionState::Open; + } + + bool hasGlobalLatchLocked() const + { + if (!retained_barriers.empty()) { + return true; + } + for (const auto& [id, slot] : devices) { + (void)id; + if (slot.quarantined) { + return true; + } + const auto view = snapshots.get(slot.descriptor.device_id); + for (const auto& blocker : view.snapshot.blockers) { + if (blocker.scope == BlockerScope::System) { + return true; + } + } + } + return false; + } + + SafetyManagerConfig config; + SafetySnapshotStore snapshots; + CommandLedger ledger; + const std::string service_instance_id; + + mutable std::mutex mutex; + std::condition_variable state_changed; + SystemAdmissionState system_state{SystemAdmissionState::Starting}; + std::uint64_t safety_epoch{1}; + std::unordered_map devices; + std::unordered_map> + participants; + std::unordered_map participant_runtime; + std::unordered_map retained_barriers; + std::deque events; + std::uint64_t next_event_sequence{0}; + std::string active_operation_id; + std::string active_operation_phase; + + std::mutex operation_execution_mutex; + OperationExecutor operation_executor; + std::mutex rounds_mutex; + std::shared_ptr active_stop_round; + std::unordered_map> + recovery_rounds; +}; + +DispatchGuard::DispatchGuard( + SafetyManager* coordinator, + std::string device_id, + HardwareCheckResult hardware_check) noexcept + : coordinator_(coordinator), + device_id_(std::move(device_id)), + hardware_check_(std::move(hardware_check)) +{ +} + +DispatchGuard::~DispatchGuard() noexcept +{ + reset_(); +} + +DispatchGuard::DispatchGuard(DispatchGuard&& other) noexcept + : coordinator_(std::exchange(other.coordinator_, nullptr)), + device_id_(std::move(other.device_id_)), + hardware_check_(std::move(other.hardware_check_)) +{ +} + +DispatchGuard& DispatchGuard::operator=(DispatchGuard&& other) noexcept +{ + if (this != &other) { + reset_(); + coordinator_ = std::exchange(other.coordinator_, nullptr); + device_id_ = std::move(other.device_id_); + hardware_check_ = std::move(other.hardware_check_); + } + return *this; +} + +void DispatchGuard::reset_() noexcept +{ + if (coordinator_ == nullptr) { + return; + } + auto* coordinator = std::exchange(coordinator_, nullptr); + coordinator->endDispatch_(device_id_); +} + +SafetyManager::SafetyManager(SafetyManagerConfig config) + : impl_(std::make_unique(std::move(config))) +{ +} + +SafetyManager::~SafetyManager() +{ + beginShutdown(); + std::vector> endpoints; + { + std::lock_guard lock(impl_->mutex); + endpoints.reserve(impl_->devices.size()); + for (auto& [id, slot] : impl_->devices) { + (void)id; + if (slot.publisher_binding) { + slot.publisher_binding->active.store( + false, std::memory_order_release); + } + if (slot.endpoint) { + endpoints.push_back(slot.endpoint); + } + } + } + for (const auto& endpoint : endpoints) { + endpoint->bindPublisher({}); + } +} + +bool SafetyManager::registerDevice(DeviceSafetyRegistration registration) +{ + if (registration.descriptor.device_id.empty() || + registration.descriptor.maximum_snapshot_age <= + std::chrono::milliseconds::zero()) { + return false; + } + if (registration.endpoint) { + const auto endpoint_descriptor = registration.endpoint->descriptor(); + if (endpoint_descriptor.device_id != + registration.descriptor.device_id || + endpoint_descriptor.kind != registration.descriptor.kind) { + return false; + } + } + if (registration.descriptor.default_policy == + SafetyPolicyFamily::Control && + impl_->config.fail_startup_on_missing_control_capability && + (!registration.endpoint || + (registration.descriptor.requires_safe_stop && + !registration.participant))) { + return false; + } + if (!impl_->snapshots.registerDevice(registration.descriptor)) { + return false; + } + + auto binding = std::make_shared(); + binding->coordinator = this; + { + std::lock_guard lock(impl_->mutex); + if (impl_->devices.count(registration.descriptor.device_id) != 0) { + impl_->snapshots.unregisterDevice( + registration.descriptor.device_id); + return false; + } + Impl::DeviceSlot slot; + slot.descriptor = registration.descriptor; + slot.endpoint = registration.endpoint; + slot.participant = registration.participant; + slot.publisher_binding = binding; + if (!slot.endpoint && + slot.descriptor.default_policy == SafetyPolicyFamily::Control) { + slot.software_blockers.push_back(makeBlocker( + SafetyReason::SafetyStateMissing, + BlockerScope::Device, + RecoveryRequirement::RefreshOnly, + slot.descriptor.device_id)); + } + impl_->devices.emplace(slot.descriptor.device_id, std::move(slot)); + if (registration.participant) { + const auto descriptor = registration.participant->descriptor(); + if (descriptor.participant_id.empty() || + impl_->participants.count(descriptor.participant_id) != 0) { + impl_->devices.erase(registration.descriptor.device_id); + impl_->snapshots.unregisterDevice( + registration.descriptor.device_id); + return false; + } + impl_->participants.emplace( + descriptor.participant_id, registration.participant); + auto& runtime = + impl_->participant_runtime[descriptor.participant_id]; + runtime.descriptor = descriptor; + runtime.registered = true; + } + impl_->addEventLocked( + SafetyReason::SafetyStateMissing, + registration.descriptor.device_id, + {}, + "device safety capability registered; awaiting a fresh sample"); + } + + if (registration.endpoint) { + std::weak_ptr weak_binding = binding; + registration.endpoint->bindPublisher( + [weak_binding](DeviceSafetySnapshot snapshot) { + const auto active = weak_binding.lock(); + if (!active || + !active->active.load(std::memory_order_acquire) || + active->coordinator == nullptr) { + return false; + } + return active->coordinator->publishSafetySnapshot( + std::move(snapshot)); + }); + registration.endpoint->requestSafetyRefresh(); + } else { + impl_->snapshots.markUnknown( + registration.descriptor.device_id, + SafetyReason::SafetyStateMissing); + } + return true; +} + +bool SafetyManager::registerParticipant( + std::shared_ptr participant) +{ + if (!participant) { + return false; + } + const auto descriptor = participant->descriptor(); + if (descriptor.participant_id.empty()) { + return false; + } + std::lock_guard lock(impl_->mutex); + if (!impl_->participants.emplace( + descriptor.participant_id, std::move(participant)).second) { + return false; + } + auto& runtime = impl_->participant_runtime[descriptor.participant_id]; + runtime.descriptor = descriptor; + runtime.registered = true; + return true; +} + +bool SafetyManager::unregisterParticipant( + const std::string& participant_id) +{ + std::lock_guard lock(impl_->mutex); + if (impl_->participants.erase(participant_id) == 0U) { + return false; + } + const auto runtime = impl_->participant_runtime.find(participant_id); + if (runtime != impl_->participant_runtime.end()) { + runtime->second.registered = false; + if (!runtime->second.barrier_active && + impl_->retained_barriers.count(participant_id) == 0U) { + impl_->participant_runtime.erase(runtime); + } + } + return true; +} + +void SafetyManager::updateDeviceRuntimeState( + const std::string& device_id, + const device::ManagedDeviceState lifecycle, + device::DeviceHealthSnapshot health) +{ + const auto view = impl_->snapshots.get(device_id); + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(device_id); + if (found == impl_->devices.end()) { + return; + } + found->second.lifecycle = lifecycle; + found->second.health = std::move(health); + found->second.admission_state = + impl_->admissionStateFor(found->second, view); + impl_->state_changed.notify_all(); +} + +bool SafetyManager::publishSafetySnapshot(DeviceSafetySnapshot snapshot) +{ + const std::string device_id = snapshot.device_id; + if (!impl_->snapshots.publish(std::move(snapshot))) { + return false; + } + const auto view = impl_->snapshots.get(device_id); + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(device_id); + if (found == impl_->devices.end()) { + return false; + } + const auto previous = found->second.admission_state; + found->second.admission_state = + impl_->admissionStateFor(found->second, view); + bool system_blocker = false; + for (const auto& blocker : view.snapshot.blockers) { + system_blocker = system_blocker || + blocker.scope == BlockerScope::System; + } + if (system_blocker && + impl_->system_state != SystemAdmissionState::Stopping && + impl_->system_state != SystemAdmissionState::Recovering && + impl_->system_state != SystemAdmissionState::ShuttingDown && + impl_->system_state != SystemAdmissionState::Latched) { + impl_->system_state = SystemAdmissionState::Latched; + ++impl_->safety_epoch; + impl_->addEventLocked( + SafetyReason::HardwareUnsafe, + device_id, + {}, + "system-scope hardware blocker latched admission"); + } else if (previous != found->second.admission_state) { + impl_->addEventLocked( + found->second.admission_state == DeviceAdmissionState::Open + ? SafetyReason::None + : SafetyReason::HardwareUnsafe, + device_id, + {}, + std::string("device admission state changed to ") + + toString(found->second.admission_state)); + } + impl_->state_changed.notify_all(); + return true; +} + +std::optional SafetyManager::advanceDeviceGeneration( + const std::string& device_id) +{ + const auto generation = impl_->snapshots.bumpGeneration(device_id); + if (!generation.has_value()) { + return std::nullopt; + } + std::shared_ptr endpoint; + { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(device_id); + if (found == impl_->devices.end()) { + return std::nullopt; + } + found->second.admission_state = DeviceAdmissionState::Observing; + endpoint = found->second.endpoint; + impl_->addEventLocked( + SafetyReason::GenerationMismatch, + device_id, + {}, + "device backend generation advanced; awaiting a fresh sample"); + impl_->state_changed.notify_all(); + } + if (endpoint) { + endpoint->onDeviceGenerationChanged(*generation); + endpoint->requestSafetyRefresh(); + } + return generation; +} + +StartupCoverageResult SafetyManager::validateStartupCoverage( + const SafetyClock::time_point deadline) +{ + struct Target { + DeviceSafetyDescriptor descriptor; + std::shared_ptr endpoint; + bool has_participant{false}; + }; + + StartupCoverageResult result; + std::vector targets; + std::unordered_set target_ids; + bool require_fresh_snapshot = false; + { + std::lock_guard lock(impl_->mutex); + const auto mode = impl_->config.enforcement_mode; + require_fresh_snapshot = + mode == EnforcementMode::EnforceSelected || + mode == EnforcementMode::EnforceAll; + + const auto add_target = [&](const Impl::DeviceSlot& slot) { + if (target_ids.insert(slot.descriptor.device_id).second) { + targets.push_back({ + slot.descriptor, + slot.endpoint, + static_cast(slot.participant)}); + } + }; + + if (mode == EnforcementMode::EnforceSelected) { + if (impl_->config.enforced_device_ids.empty()) { + result.issues.push_back({ + "system", + SafetyReason::InvalidArgument, + "ENFORCE_SELECTED requires at least one enforced_device_id"}); + } + for (const auto& id : impl_->config.enforced_device_ids) { + const auto found = impl_->devices.find(id); + if (found == impl_->devices.end()) { + result.issues.push_back({ + id, + SafetyReason::DeviceNotFound, + "enforced device is not registered"}); + continue; + } + add_target(found->second); + } + } + + if (mode == EnforcementMode::EnforceAll || + impl_->config.fail_startup_on_missing_control_capability) { + for (const auto& [id, slot] : impl_->devices) { + (void)id; + if (slot.descriptor.default_policy == + SafetyPolicyFamily::Control) { + add_target(slot); + } + } + } + } + + std::sort(targets.begin(), targets.end(), [](const auto& lhs, + const auto& rhs) { + return lhs.descriptor.device_id < rhs.descriptor.device_id; + }); + for (const auto& target : targets) { + if (!target.endpoint) { + result.issues.push_back({ + target.descriptor.device_id, + SafetyReason::SafetyStateMissing, + "enforced device has no final hardware safety endpoint"}); + } + if (target.descriptor.requires_safe_stop && + !target.has_participant) { + result.issues.push_back({ + target.descriptor.device_id, + SafetyReason::StopUnconfirmed, + "enforced device requires safe stop but has no participant"}); + } + if (require_fresh_snapshot && target.endpoint) { + target.endpoint->requestSafetyRefresh(); + } + } + + if (require_fresh_snapshot) { + for (;;) { + bool all_fresh = true; + for (const auto& target : targets) { + if (!target.endpoint) { + continue; + } + const auto view = impl_->snapshots.get( + target.descriptor.device_id); + if (!view.registered || !view.has_sample || !view.fresh) { + all_fresh = false; + break; + } + } + if (all_fresh || SafetyClock::now() >= deadline) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + + for (const auto& target : targets) { + if (!target.endpoint) { + continue; + } + const auto view = impl_->snapshots.get( + target.descriptor.device_id); + if (!view.registered || !view.has_sample) { + result.issues.push_back({ + target.descriptor.device_id, + SafetyReason::SafetyStateMissing, + "enforced device did not publish a startup safety snapshot"}); + } else if (!view.fresh) { + result.issues.push_back({ + target.descriptor.device_id, + SafetyReason::SafetyStateStale, + "enforced device startup safety snapshot is stale"}); + } + } + } + + std::sort(result.issues.begin(), result.issues.end(), + [](const auto& lhs, const auto& rhs) { + return lhs.target_id != rhs.target_id + ? lhs.target_id < rhs.target_id + : static_cast(lhs.reason) < + static_cast(rhs.reason); + }); + result.ready = result.issues.empty(); + return result; +} + +void SafetyManager::markStartupComplete() +{ + std::lock_guard lock(impl_->mutex); + if (impl_->system_state != SystemAdmissionState::Starting) { + return; + } + impl_->system_state = impl_->hasGlobalLatchLocked() + ? SystemAdmissionState::Latched + : SystemAdmissionState::Open; + impl_->addEventLocked( + impl_->system_state == SystemAdmissionState::Open + ? SafetyReason::None + : SafetyReason::SafetyLatched, + "system", + {}, + "startup safety reconciliation completed"); + impl_->state_changed.notify_all(); +} + +void SafetyManager::beginShutdown() noexcept +{ + if (!impl_) { + return; + } + try { + std::lock_guard lock(impl_->mutex); + if (impl_->system_state == SystemAdmissionState::ShuttingDown) { + return; + } + impl_->system_state = SystemAdmissionState::ShuttingDown; + ++impl_->safety_epoch; + impl_->addEventLocked( + SafetyReason::SystemStopping, + "system", + {}, + "safety coordinator is shutting down"); + impl_->state_changed.notify_all(); + } catch (...) { + } +} + +AdmissionDecision SafetyManager::evaluate( + const AdmissionRequest& request) const +{ + AdmissionDecision decision; + SystemAdmissionState system_state; + DeviceAdmissionState device_state{DeviceAdmissionState::Observing}; + std::uint64_t epoch = 0; + bool enforced = false; + bool device_exists = false; + { + std::lock_guard lock(impl_->mutex); + system_state = impl_->system_state; + epoch = impl_->safety_epoch; + enforced = impl_->isEnforced(request.device_id); + const auto found = impl_->devices.find(request.device_id); + if (found != impl_->devices.end()) { + device_exists = true; + device_state = found->second.admission_state; + } + } + decision.safety_epoch = epoch; + decision.enforced = enforced; + + const auto reject = [&](const SafetyReason reason, std::string detail) { + decision.policy_allowed = false; + decision.allowed = !decision.enforced; + decision.reason = reason; + decision.detail = std::move(detail); + return decision; + }; + const auto allow = [&]() { + decision.policy_allowed = true; + decision.allowed = true; + decision.reason = SafetyReason::None; + return decision; + }; + + if (request.command.intent == CommandIntent::Observe) { + return allow(); + } + if (request.command.intent == CommandIntent::Stop || + request.command.intent == CommandIntent::ResetFault || + request.command.intent == CommandIntent::RecoverAdmission || + request.command.safety_lane) { + return allow(); + } + if (request.deadline <= SafetyClock::now()) { + return reject( + SafetyReason::DeadlineExceededBeforeDispatch, + "command deadline expired before admission"); + } + if (system_state != SystemAdmissionState::Open) { + return reject( + system_state == SystemAdmissionState::Starting + ? SafetyReason::SystemStarting + : system_state == SystemAdmissionState::Stopping || + system_state == SystemAdmissionState::ShuttingDown + ? SafetyReason::SystemStopping + : SafetyReason::SafetyLatched, + std::string("system admission is ") + toString(system_state)); + } + if (request.device_id.empty() || !device_exists) { + return reject( + SafetyReason::DeviceNotFound, + "device is not registered with the safety coordinator"); + } + if (device_state == DeviceAdmissionState::Quarantined) { + return reject( + SafetyReason::SafetyLatched, + "device is quarantined after an uncertain result"); + } + + const auto view = impl_->snapshots.get(request.device_id); + if (!view.has_sample) { + return reject( + SafetyReason::SafetyStateMissing, + "device has not published a safety sample"); + } + decision.device_generation = view.snapshot.device_generation; + if (!view.fresh) { + return reject( + SafetyReason::SafetyStateStale, + "device safety sample is stale"); + } + if (request.expected_device_generation.has_value() && + *request.expected_device_generation != + view.snapshot.device_generation) { + return reject( + SafetyReason::GenerationMismatch, + "expected device generation does not match the active backend"); + } + if (view.snapshot.condition == SafetyCondition::Unknown) { + return reject( + SafetyReason::SafetyStateMissing, + "hardware safety condition is unknown"); + } + if (view.snapshot.connected != TriState::True) { + return reject( + SafetyReason::DeviceDisconnected, + "device connection is not confirmed"); + } + if (hasTrue(view.snapshot.emergency_stop_active)) { + return reject( + SafetyReason::EmergencyStopActive, + "hardware emergency stop is active"); + } + if (hasTrue(view.snapshot.protective_stop_active)) { + return reject( + SafetyReason::ProtectiveStopActive, + "hardware protective stop is active"); + } + if (hasTrue(view.snapshot.fault_active)) { + return reject(SafetyReason::DeviceFault, "device fault is active"); + } + if (view.snapshot.condition == SafetyCondition::Unsafe) { + return reject(SafetyReason::HardwareUnsafe, "hardware is unsafe"); + } + if (request.command.policy_family == SafetyPolicyFamily::Sensor) { + return allow(); + } + if (view.snapshot.emergency_stop_active != TriState::False) { + return reject( + SafetyReason::EmergencyStopActive, + "control device emergency stop state is active or unknown"); + } + if (view.snapshot.protective_stop_active != TriState::False) { + return reject( + SafetyReason::ProtectiveStopActive, + "control device protective stop state is active or unknown"); + } + if (view.snapshot.fault_active != TriState::False) { + return reject( + SafetyReason::DeviceFault, + "control device fault state is active or unknown"); + } + if (request.command.intent == CommandIntent::Actuate && + view.snapshot.condition != SafetyCondition::Nominal) { + return reject( + SafetyReason::HardwareUnsafe, + "control actuation requires nominal hardware safety state"); + } + const bool safe_start_from_restricted = + request.command.intent == CommandIntent::StartActivity && + view.snapshot.condition == SafetyCondition::Restricted; + if (isControlIntent(request.command.intent) && + view.snapshot.operational_ready != TriState::True && + !safe_start_from_restricted) { + return reject( + SafetyReason::DeviceNotReady, + "control device is not confirmed operationally ready"); + } + return allow(); +} + +AdmissionResult SafetyManager::admit(const AdmissionRequest& request) +{ + AdmissionResult result; + result.decision = evaluate(request); + if (!result.decision.allowed) { + return result; + } + AdmissionPermit permit; + permit.command_id = request.command_id; + permit.device_id = request.device_id; + permit.intent = request.command.intent; + permit.safety_epoch = result.decision.safety_epoch; + permit.device_generation = result.decision.device_generation; + permit.authority_generation = request.authority_generation; + permit.deadline = request.deadline; + permit.policy_allowed = result.decision.policy_allowed; + permit.enforced = result.decision.enforced; + result.permit.emplace(std::move(permit)); + return result; +} + +HardwareCheckResult SafetyManager::revalidatePermit( + const AdmissionPermit& permit) const +{ + const auto rejected = [](const SafetyReason reason, std::string detail) { + return HardwareCheckResult{false, reason, std::move(detail)}; + }; + const bool safety_lane = + permit.intent == CommandIntent::Stop || + permit.intent == CommandIntent::ResetFault || + permit.intent == CommandIntent::RecoverAdmission; + + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(permit.device_id); + if (found == impl_->devices.end()) { + return rejected( + SafetyReason::DeviceNotFound, + "device was removed after session admission"); + } + if (permit.deadline <= SafetyClock::now()) { + return rejected( + SafetyReason::DeadlineExceededBeforeDispatch, + "session deadline expired before dispatch"); + } + + const auto view = impl_->snapshots.get(permit.device_id); + const bool safe_start_from_restricted = + permit.intent == CommandIntent::StartActivity && view.fresh && + view.snapshot.condition == SafetyCondition::Restricted; + if (permit.enforced && !safety_lane && + (impl_->system_state != SystemAdmissionState::Open || + permit.safety_epoch != impl_->safety_epoch || + (found->second.admission_state != DeviceAdmissionState::Open && + !safe_start_from_restricted))) { + return rejected( + impl_->system_state == SystemAdmissionState::Stopping || + impl_->system_state == SystemAdmissionState::ShuttingDown + ? SafetyReason::SystemStopping + : SafetyReason::SafetyLatched, + "safety admission changed after session open"); + } + if (permit.enforced && !safety_lane && !view.fresh) { + return rejected( + SafetyReason::SafetyStateStale, + "device safety sample became stale during the session"); + } + if (permit.enforced && !safety_lane && + permit.device_generation != view.snapshot.device_generation) { + return rejected( + SafetyReason::GenerationMismatch, + "device generation changed during the session"); + } + return {true, SafetyReason::None, {}}; +} + +DispatchGuard SafetyManager::beginDispatch( + const AdmissionPermit& permit) +{ + const auto rejected = [&permit]( + const SafetyReason reason, + std::string detail) { + return DispatchGuard( + nullptr, + permit.device_id, + HardwareCheckResult{false, reason, std::move(detail)}); + }; + const bool safety_lane = + permit.intent == CommandIntent::Stop || + permit.intent == CommandIntent::ResetFault || + permit.intent == CommandIntent::RecoverAdmission; + std::shared_ptr endpoint; + { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(permit.device_id); + if (found == impl_->devices.end()) { + return rejected( + SafetyReason::DeviceNotFound, + "device was removed before dispatch"); + } + if (permit.deadline <= SafetyClock::now()) { + return rejected( + SafetyReason::DeadlineExceededBeforeDispatch, + "command deadline expired before dispatch"); + } + const auto view = impl_->snapshots.get(permit.device_id); + const bool safe_start_from_restricted = + permit.intent == CommandIntent::StartActivity && view.fresh && + view.snapshot.condition == SafetyCondition::Restricted; + if (permit.enforced && !safety_lane && + (impl_->system_state != SystemAdmissionState::Open || + permit.safety_epoch != impl_->safety_epoch || + (found->second.admission_state != DeviceAdmissionState::Open && + !safe_start_from_restricted))) { + return rejected( + impl_->system_state == SystemAdmissionState::Stopping || + impl_->system_state == + SystemAdmissionState::ShuttingDown + ? SafetyReason::SystemStopping + : SafetyReason::SafetyLatched, + "safety admission changed before dispatch"); + } + if (permit.enforced && !safety_lane && !view.fresh) { + return rejected( + SafetyReason::SafetyStateStale, + "device safety sample became stale before dispatch"); + } + if (permit.enforced && !safety_lane && + permit.device_generation != view.snapshot.device_generation) { + return rejected( + SafetyReason::GenerationMismatch, + "device generation changed before dispatch"); + } + ++found->second.in_flight_dispatches; + endpoint = found->second.endpoint; + } + + HardwareCheckResult hardware_check{ + true, SafetyReason::None, {}}; + if (permit.enforced) { + if (!endpoint) { + hardware_check = { + false, + SafetyReason::SafetyStateMissing, + "device has no final hardware safety endpoint"}; + } else { + try { + hardware_check = endpoint->validateBeforeDispatch(permit); + } catch (const std::exception& error) { + hardware_check = { + false, SafetyReason::InternalError, error.what()}; + } catch (...) { + hardware_check = { + false, + SafetyReason::InternalError, + "final hardware check threw an unknown exception"}; + } + } + } + if (!hardware_check.safe) { + endDispatch_(permit.device_id); + return DispatchGuard( + nullptr, permit.device_id, std::move(hardware_check)); + } + return DispatchGuard(this, permit.device_id, std::move(hardware_check)); +} + +void SafetyManager::endDispatch_(const std::string& device_id) noexcept +{ + try { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(device_id); + if (found != impl_->devices.end() && + found->second.in_flight_dispatches != 0) { + --found->second.in_flight_dispatches; + impl_->state_changed.notify_all(); + } + } catch (...) { + } +} + +void SafetyManager::quarantineDevice( + const std::string& device_id, + const SafetyReason reason, + std::string operation_id) +{ + std::lock_guard lock(impl_->mutex); + const auto found = impl_->devices.find(device_id); + if (found == impl_->devices.end()) { + return; + } + found->second.quarantined = true; + found->second.admission_state = DeviceAdmissionState::Quarantined; + found->second.software_blockers.push_back(makeBlocker( + reason, + BlockerScope::Device, + RecoveryRequirement::ClearSoftwareLatch, + device_id, + operation_id)); + impl_->addEventLocked( + reason, + device_id, + std::move(operation_id), + "device quarantined"); + impl_->state_changed.notify_all(); +} + +StopAllResult SafetyManager::stopAll( + std::string operation_id, + SafetyClock::time_point deadline) +{ + if (operation_id.empty()) { + operation_id = makeOperationId("stop"); + } + if (deadline == SafetyClock::time_point::max()) { + deadline = SafetyClock::now() + impl_->config.stop_all_timeout; + } + + std::shared_ptr round; + bool runner = false; + { + std::lock_guard lock(impl_->rounds_mutex); + if (impl_->active_stop_round && + !impl_->active_stop_round->done.load(std::memory_order_acquire)) { + round = impl_->active_stop_round; + } else { + round = std::make_shared(); + round->result.operation_id = std::move(operation_id); + impl_->active_stop_round = round; + runner = true; + } + } + + if (!runner) { + std::unique_lock lock(round->mutex); + if (!round->completed.wait_until( + lock, deadline, [&round] { + return round->done.load(std::memory_order_acquire); + })) { + StopAllResult timeout; + timeout.operation_id = round->result.operation_id; + timeout.success = false; + timeout.system_state = SystemAdmissionState::Stopping; + timeout.targets.push_back({ + "system", + false, + SafetyReason::ParticipantTimeout, + "caller timed out while joining the active StopAll round"}); + return timeout; + } + return round->result; + } + + StopAllResult result; + result.operation_id = round->result.operation_id; + std::unique_lock operation_lock(impl_->operation_execution_mutex); + + struct Work { + ParticipantDescriptor descriptor; + std::shared_ptr participant; + BarrierToken token; + std::future request_future; + std::future verify_future; + SafetyClock::time_point participant_deadline{ + SafetyClock::time_point::max()}; + bool request_completed{false}; + bool result_recorded{false}; + bool reused_retained_barrier{false}; + DeviceAdmissionState before{DeviceAdmissionState::Observing}; + }; + std::vector work; + { + std::lock_guard lock(impl_->mutex); + result.previous_safety_epoch = impl_->safety_epoch; + impl_->system_state = SystemAdmissionState::Stopping; + ++impl_->safety_epoch; + result.current_safety_epoch = impl_->safety_epoch; + impl_->active_operation_id = result.operation_id; + impl_->active_operation_phase = "barrier"; + impl_->addEventLocked( + SafetyReason::SystemStopping, + "system", + result.operation_id, + "StopAll entered the stopping state"); + work.reserve( + impl_->participants.size() + impl_->retained_barriers.size()); + for (const auto& [id, participant] : impl_->participants) { + Work item; + const auto retained = impl_->retained_barriers.find(id); + if (retained != impl_->retained_barriers.end()) { + item.participant = retained->second.participant; + item.token = retained->second.token; + item.reused_retained_barrier = true; + } else { + item.participant = participant; + } + item.descriptor = item.participant->descriptor(); + const auto device = impl_->devices.find(id); + if (device != impl_->devices.end()) { + item.before = device->second.admission_state; + } + work.push_back(std::move(item)); + } + for (const auto& [id, retained] : impl_->retained_barriers) { + if (impl_->participants.count(id) != 0) { + continue; + } + Work item; + item.participant = retained.participant; + item.descriptor = item.participant->descriptor(); + item.token = retained.token; + item.reused_retained_barrier = true; + const auto device = impl_->devices.find(id); + if (device != impl_->devices.end()) { + item.before = device->second.admission_state; + } + work.push_back(std::move(item)); + } + } + std::sort(work.begin(), work.end(), [](const auto& lhs, const auto& rhs) { + const auto left_phase = phaseRank(lhs.descriptor.phase); + const auto right_phase = phaseRank(rhs.descriptor.phase); + return left_phase != right_phase + ? left_phase < right_phase + : lhs.descriptor.participant_id < rhs.descriptor.participant_id; + }); + + SafetyOperationContext context{ + result.operation_id, + result.current_safety_epoch, + deadline}; + bool required_success = true; + for (auto& item : work) { + if (item.reused_retained_barrier) { + continue; + } + try { + item.token = item.participant->beginBarrier(context); + } catch (const std::exception& error) { + result.targets.push_back({ + item.descriptor.participant_id, + false, + SafetyReason::InternalError, + error.what(), + item.before, + item.before}); + item.result_recorded = true; + } catch (...) { + result.targets.push_back({ + item.descriptor.participant_id, + false, + SafetyReason::InternalError, + "beginBarrier threw an unknown exception", + item.before, + item.before}); + item.result_recorded = true; + } + if (!item.token.valid()) { + if (!item.result_recorded) { + result.targets.push_back({ + item.descriptor.participant_id, + false, + SafetyReason::StopUnconfirmed, + "participant did not establish its safety barrier", + item.before, + item.before}); + item.result_recorded = true; + } + if (item.descriptor.required) { + required_success = false; + } + continue; + } + { + std::lock_guard lock(impl_->mutex); + auto& runtime = impl_->participant_runtime[ + item.descriptor.participant_id]; + runtime.descriptor = item.descriptor; + runtime.registered = + impl_->participants.count( + item.descriptor.participant_id) != 0U; + runtime.barrier_active = true; + runtime.barrier_retained = item.reused_retained_barrier; + runtime.operation_id = item.token.operation_id; + runtime.safety_epoch = item.token.safety_epoch; + runtime.last_request = {}; + runtime.last_verify = {}; + runtime.last_release = {}; + } + } + + // Dispatch every physical stop request before waiting for a slow task, + // session, or driver. Phase ordering is applied to verification below. + for (int phase = 0; phase <= 5; ++phase) { + { + std::lock_guard lock(impl_->mutex); + impl_->active_operation_phase = + "request-phase-" + std::to_string(phase); + } + for (auto& item : work) { + if (phaseRank(item.descriptor.phase) != phase || + !item.token.valid()) { + continue; + } + const auto participant = item.participant; + const auto token = item.token; + item.participant_deadline = std::min( + deadline, SafetyClock::now() + item.descriptor.timeout); + item.request_future = impl_->operation_executor.submit( + [participant, token, context] { + return participant->requestQuiesce(token, context); + }); + } + } + + const auto record_result = [&](Work& item, + ParticipantResult participant_result) { + DeviceAdmissionState after = item.before; + { + std::lock_guard lock(impl_->mutex); + const auto device = impl_->devices.find( + item.descriptor.participant_id); + if (device != impl_->devices.end()) { + if (!participant_result.success && + item.descriptor.required) { + device->second.quarantined = true; + device->second.admission_state = + DeviceAdmissionState::Quarantined; + device->second.software_blockers.push_back(makeBlocker( + participant_result.reason, + BlockerScope::Device, + RecoveryRequirement::ClearSoftwareLatch, + item.descriptor.participant_id, + result.operation_id)); + } + after = device->second.admission_state; + } + } + result.targets.push_back({ + item.descriptor.participant_id, + participant_result.success, + participant_result.reason, + std::move(participant_result.detail), + item.before, + after}); + item.result_recorded = true; + if (!participant_result.success && item.descriptor.required) { + required_success = false; + } + }; + + const auto record_participant_result = [this]( + const std::string& participant_id, + const char* stage, + const ParticipantResult& participant_result) { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->participant_runtime.find(participant_id); + if (found == impl_->participant_runtime.end()) { + return; + } + ParticipantResultView value{ + true, + participant_result.success, + participant_result.reason, + participant_result.detail}; + if (std::strcmp(stage, "request") == 0) { + found->second.last_request = std::move(value); + } else if (std::strcmp(stage, "verify") == 0) { + found->second.last_verify = std::move(value); + } else { + found->second.last_release = std::move(value); + } + }; + + for (int phase = 0; phase <= 5; ++phase) { + for (auto& item : work) { + if (phaseRank(item.descriptor.phase) != phase || + !item.token.valid() || !item.request_future.valid()) { + continue; + } + if (item.request_future.wait_until(item.participant_deadline) != + std::future_status::ready) { + const ParticipantResult timed_out{ + false, + SafetyReason::ParticipantTimeout, + "participant did not dispatch its stop request before its deadline"}; + record_participant_result( + item.descriptor.participant_id, "request", timed_out); + record_result(item, timed_out); + continue; + } + const auto requested = item.request_future.get(); + record_participant_result( + item.descriptor.participant_id, "request", requested); + item.request_completed = true; + if (!requested.success) { + // A completed initial failure still receives a final stop in + // verification. This preserves the retry-after-fence safety + // contract while retaining fail-closed timeout behavior. + item.request_completed = true; + } + } + } + + // Verification is phase ordered so scheduler/session fences are drained + // before actuator and peripheral participants perform their final stop. + for (int phase = 0; phase <= 5; ++phase) { + { + std::lock_guard lock(impl_->mutex); + impl_->active_operation_phase = + "verify-phase-" + std::to_string(phase); + } + for (auto& item : work) { + if (phaseRank(item.descriptor.phase) != phase || + !item.token.valid() || !item.request_completed || + item.result_recorded) { + continue; + } + const auto participant = item.participant; + const auto token = item.token; + item.verify_future = impl_->operation_executor.submit( + [participant, token, context] { + return participant->verifyQuiescent(token, context); + }); + } + for (auto& item : work) { + if (phaseRank(item.descriptor.phase) != phase || + !item.verify_future.valid() || item.result_recorded) { + continue; + } + if (item.verify_future.wait_until(item.participant_deadline) != + std::future_status::ready) { + const ParticipantResult timed_out{ + false, + SafetyReason::ParticipantTimeout, + "participant did not confirm quiescence before its deadline"}; + record_participant_result( + item.descriptor.participant_id, "verify", timed_out); + record_result(item, timed_out); + } else { + const auto verified = item.verify_future.get(); + record_participant_result( + item.descriptor.participant_id, "verify", verified); + record_result(item, verified); + } + } + } + + { + std::unique_lock lock(impl_->mutex); + impl_->active_operation_phase = "dispatch-fence"; + const auto no_in_flight = [&] { + return std::all_of( + impl_->devices.begin(), impl_->devices.end(), + [](const auto& item) { + return item.second.in_flight_dispatches == 0; + }); + }; + if (!impl_->state_changed.wait_until(lock, deadline, no_in_flight)) { + required_success = false; + result.targets.push_back({ + "dispatch-fence", + false, + SafetyReason::ParticipantTimeout, + "an admitted command was still inside its device submission boundary"}); + } + } + + const auto retain_barrier = [&](const Work& item) { + std::lock_guard lock(impl_->mutex); + impl_->retained_barriers[item.descriptor.participant_id] = { + item.participant, item.token}; + auto& runtime = impl_->participant_runtime[ + item.descriptor.participant_id]; + runtime.descriptor = item.descriptor; + runtime.barrier_active = true; + runtime.barrier_retained = true; + runtime.operation_id = item.token.operation_id; + runtime.safety_epoch = item.token.safety_epoch; + }; + const auto forget_retained_barrier = [&](const Work& item) { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->retained_barriers.find( + item.descriptor.participant_id); + if (found != impl_->retained_barriers.end() && + found->second.token.operation_id == item.token.operation_id && + found->second.token.safety_epoch == item.token.safety_epoch && + found->second.token.generation == item.token.generation) { + impl_->retained_barriers.erase(found); + } + const auto runtime = impl_->participant_runtime.find( + item.descriptor.participant_id); + if (runtime != impl_->participant_runtime.end() && + runtime->second.operation_id == item.token.operation_id && + runtime->second.safety_epoch == item.token.safety_epoch) { + runtime->second.barrier_active = false; + runtime->second.barrier_retained = false; + if (!runtime->second.registered) { + impl_->participant_runtime.erase(runtime); + } + } + }; + const auto mark_release_failure = [&](Work& item, + ParticipantResult released) { + if (released.reason == SafetyReason::None) { + released.reason = SafetyReason::StopUnconfirmed; + } + const auto target = std::find_if( + result.targets.begin(), result.targets.end(), + [&item](const auto& candidate) { + return candidate.target_id == + item.descriptor.participant_id; + }); + if (target != result.targets.end()) { + target->success = false; + target->reason = released.reason; + target->detail = std::move(released.detail); + } else { + result.targets.push_back({ + item.descriptor.participant_id, + false, + released.reason, + std::move(released.detail), + item.before, + item.before}); + } + if (item.descriptor.required) { + required_success = false; + std::lock_guard lock(impl_->mutex); + const auto device = impl_->devices.find( + item.descriptor.participant_id); + if (device != impl_->devices.end()) { + device->second.quarantined = true; + device->second.admission_state = + DeviceAdmissionState::Quarantined; + device->second.software_blockers.push_back(makeBlocker( + released.reason, + BlockerScope::Device, + RecoveryRequirement::ClearSoftwareLatch, + item.descriptor.participant_id, + result.operation_id)); + } + } + }; + + // Commit admission reopening in reverse phase order. Ingress is therefore + // the final required barrier released; a failed subsystem commit keeps it + // closed and prevents a transient normal-command admission window. + for (auto current = work.rbegin(); current != work.rend(); ++current) { + auto& item = *current; + if (!item.token.valid()) { + continue; + } + const auto target = std::find_if( + result.targets.begin(), result.targets.end(), + [&item](const auto& candidate) { + return candidate.target_id == + item.descriptor.participant_id; + }); + const bool participant_verified = + target != result.targets.end() && target->success; + if (item.descriptor.required && + (!required_success || !participant_verified)) { + retain_barrier(item); + continue; + } + + const auto released = item.participant->releaseBarrier(item.token); + record_participant_result( + item.descriptor.participant_id, "release", released); + if (!released.success) { + mark_release_failure(item, released); + if (item.descriptor.required) { + retain_barrier(item); + } + } else { + forget_retained_barrier(item); + } + } + + { + std::lock_guard lock(impl_->mutex); + result.success = required_success; + impl_->system_state = required_success + ? SystemAdmissionState::Open + : SystemAdmissionState::Latched; + result.system_state = impl_->system_state; + impl_->active_operation_id.clear(); + impl_->active_operation_phase.clear(); + impl_->addEventLocked( + required_success + ? SafetyReason::None + : SafetyReason::StopUnconfirmed, + "system", + result.operation_id, + required_success + ? "StopAll confirmed all required participants quiescent" + : "StopAll left admission latched because a required participant was unconfirmed"); + impl_->state_changed.notify_all(); + } + + { + std::lock_guard lock(round->mutex); + round->result = result; + round->done.store(true, std::memory_order_release); + } + round->completed.notify_all(); + { + std::lock_guard lock(impl_->rounds_mutex); + if (impl_->active_stop_round == round) { + impl_->active_stop_round.reset(); + } + } + return result; +} + +RecoveryResult SafetyManager::recover(const RecoveryRequest& request) +{ + RecoveryResult invalid; + invalid.recovery_id = request.recovery_id; + if (request.recovery_id.empty() || request.reason.empty() || + (!request.all_devices && request.device_ids.empty()) || + (request.restore_operational_state && + (request.verify_only || !request.all_devices || + !request.authorize_clear))) { + invalid.result = RecoveryResultCode::Failed; + invalid.targets.push_back({ + "system", + false, + request.reason.empty() + ? SafetyReason::RecoveryReasonRequired + : SafetyReason::InvalidArgument, + request.restore_operational_state + ? "operational restore requires all_devices, latch clearing, and explicit authorization" + : "recovery_id, reason, and an explicit non-empty scope are required"}); + return invalid; + } + std::unordered_set unique_ids; + for (const auto& id : request.device_ids) { + if (id.empty() || !unique_ids.insert(id).second) { + invalid.result = RecoveryResultCode::Failed; + invalid.targets.push_back({ + id, + false, + SafetyReason::InvalidArgument, + "recovery device IDs must be non-empty and unique"}); + return invalid; + } + } + + std::vector fingerprint_ids = request.device_ids; + std::sort(fingerprint_ids.begin(), fingerprint_ids.end()); + std::ostringstream fingerprint; + fingerprint << request.expected_safety_epoch << ':' + << request.verify_only << ':' + << request.restore_operational_state << ':' + << request.all_devices << ':' + << request.reason; + for (const auto& id : fingerprint_ids) { + fingerprint << ':' << id; + } + + std::shared_ptr round; + bool runner = false; + { + std::lock_guard lock(impl_->rounds_mutex); + const auto found = impl_->recovery_rounds.find(request.recovery_id); + if (found != impl_->recovery_rounds.end()) { + round = found->second; + if (round->fingerprint != fingerprint.str()) { + invalid.result = RecoveryResultCode::Failed; + invalid.targets.push_back({ + "system", + false, + SafetyReason::CommandIdConflict, + "recovery_id is already associated with a different request"}); + return invalid; + } + } else { + round = std::make_shared(); + round->fingerprint = fingerprint.str(); + impl_->recovery_rounds.emplace(request.recovery_id, round); + runner = true; + } + } + + auto deadline = request.deadline; + if (deadline == SafetyClock::time_point::max()) { + deadline = SafetyClock::now() + impl_->config.recovery_timeout; + } + if (!runner) { + std::unique_lock lock(round->mutex); + if (!round->completed.wait_until( + lock, deadline, [&round] { + return round->done.load(std::memory_order_acquire); + })) { + invalid.result = RecoveryResultCode::TimedOut; + invalid.targets.push_back({ + "system", + false, + SafetyReason::ParticipantTimeout, + "caller timed out while joining the recovery transaction"}); + return invalid; + } + return round->result; + } + + RecoveryResult result; + result.recovery_id = request.recovery_id; + std::unique_lock operation_lock(impl_->operation_execution_mutex); + std::vector target_ids; + std::unordered_map + target_before_states; + SystemAdmissionState state_before_recovery{ + SystemAdmissionState::Starting}; + { + std::lock_guard lock(impl_->mutex); + result.previous_safety_epoch = impl_->safety_epoch; + state_before_recovery = impl_->system_state; + if (request.expected_safety_epoch != impl_->safety_epoch) { + result.result = RecoveryResultCode::EpochMismatch; + result.current_safety_epoch = impl_->safety_epoch; + result.system_state = impl_->system_state; + result.targets.push_back({ + "system", + false, + SafetyReason::RecoveryEpochMismatch, + "expected safety epoch does not match the active state"}); + } else if (impl_->system_state == + SystemAdmissionState::ShuttingDown) { + result.result = RecoveryResultCode::Failed; + result.current_safety_epoch = impl_->safety_epoch; + result.system_state = impl_->system_state; + result.targets.push_back({ + "system", + false, + SafetyReason::SystemStopping, + "recovery is unavailable during shutdown"}); + } else { + impl_->system_state = SystemAdmissionState::Recovering; + ++impl_->safety_epoch; + result.current_safety_epoch = impl_->safety_epoch; + impl_->active_operation_id = request.recovery_id; + impl_->active_operation_phase = "refresh"; + if (request.all_devices) { + target_ids.reserve(impl_->devices.size()); + for (auto& [id, slot] : impl_->devices) { + target_ids.push_back(id); + target_before_states.emplace(id, slot.admission_state); + if (slot.admission_state == + DeviceAdmissionState::Quarantined || + slot.admission_state == + DeviceAdmissionState::Blocked) { + slot.admission_state = + DeviceAdmissionState::Recovering; + } + } + } else { + target_ids = request.device_ids; + for (const auto& id : target_ids) { + const auto found = impl_->devices.find(id); + if (found != impl_->devices.end()) { + target_before_states.emplace( + id, found->second.admission_state); + } + if (found != impl_->devices.end() && + (found->second.admission_state == + DeviceAdmissionState::Quarantined || + found->second.admission_state == + DeviceAdmissionState::Blocked)) { + found->second.admission_state = + DeviceAdmissionState::Recovering; + } + } + } + impl_->addEventLocked( + SafetyReason::None, + "system", + request.recovery_id, + request.verify_only + ? "recovery verification started" + : request.restore_operational_state + ? "operational state restoration started" + : "software latch recovery started"); + } + } + + if (!result.targets.empty()) { + std::lock_guard lock(round->mutex); + round->result = result; + round->done.store(true, std::memory_order_release); + round->completed.notify_all(); + return result; + } + + struct Target { + std::string id; + std::shared_ptr endpoint; + DeviceAdmissionState before{DeviceAdmissionState::Observing}; + std::uint64_t previous_sequence{0}; + SafetyPolicyFamily policy{SafetyPolicyFamily::Sensor}; + }; + std::vector targets; + { + std::lock_guard lock(impl_->mutex); + for (const auto& id : target_ids) { + const auto found = impl_->devices.find(id); + if (found == impl_->devices.end()) { + result.targets.push_back({ + id, + false, + SafetyReason::DeviceNotFound, + "device is not registered", + DeviceAdmissionState::Removed, + DeviceAdmissionState::Removed}); + continue; + } + const auto view = impl_->snapshots.get(id); + const auto before = target_before_states.find(id); + targets.push_back({ + id, + found->second.endpoint, + before == target_before_states.end() + ? found->second.admission_state + : before->second, + view.snapshot.sample_sequence, + found->second.descriptor.default_policy}); + } + } + + for (const auto& target : targets) { + if (target.endpoint) { + target.endpoint->requestSafetyRefresh(); + } + } + + bool all_verified = result.targets.empty(); + RecoveryContext recovery_context{ + request.recovery_id, + request.reason, + result.current_safety_epoch, + deadline, + request.verify_only}; + bool clear_authorization_checked = false; + bool clear_authorized = true; + if (request.restore_operational_state && request.authorize_clear) { + clear_authorization_checked = true; + try { + clear_authorized = request.authorize_clear(); + } catch (...) { + clear_authorized = false; + } + } + if (request.restore_operational_state && !clear_authorized && + targets.empty()) { + all_verified = false; + result.targets.push_back({ + "system", + false, + SafetyReason::RecoveryAuditFailed, + "persistent recovery audit did not authorize operational restore"}); + } + + const auto validate_snapshot = []( + const SafetySnapshotView& view, + const SafetyPolicyFamily policy, + const bool require_operational_ready) { + if (!view.fresh) { + return RecoveryCheckResult{ + false, + SafetyReason::SafetyStateStale, + "refreshed safety sample is stale"}; + } + if (view.snapshot.condition == SafetyCondition::Unknown) { + return RecoveryCheckResult{ + false, + SafetyReason::SafetyStateMissing, + "hardware safety condition remains unknown"}; + } + if (view.snapshot.connected != TriState::True) { + return RecoveryCheckResult{ + false, + SafetyReason::DeviceDisconnected, + "device connection is not confirmed"}; + } + if (policy == SafetyPolicyFamily::Control) { + if (view.snapshot.emergency_stop_active != TriState::False) { + return RecoveryCheckResult{ + false, + SafetyReason::EmergencyStopActive, + "emergency stop is active or unknown"}; + } + if (view.snapshot.protective_stop_active != TriState::False) { + return RecoveryCheckResult{ + false, + SafetyReason::ProtectiveStopActive, + "protective stop is active or unknown"}; + } + if (view.snapshot.fault_active != TriState::False) { + return RecoveryCheckResult{ + false, + SafetyReason::DeviceFault, + "device fault remains active or unknown"}; + } + } else if (view.snapshot.fault_active == TriState::True) { + return RecoveryCheckResult{ + false, + SafetyReason::DeviceFault, + "device fault remains active"}; + } + if (view.snapshot.condition == SafetyCondition::Unsafe) { + return RecoveryCheckResult{ + false, + SafetyReason::HardwareUnsafe, + "hardware safety condition remains unsafe"}; + } + if (policy == SafetyPolicyFamily::Control && + view.snapshot.quiescent != TriState::True) { + return RecoveryCheckResult{ + false, + SafetyReason::DeviceStillMoving, + "control device has not confirmed a quiescent state"}; + } + if (require_operational_ready && + (view.snapshot.condition != SafetyCondition::Nominal || + view.snapshot.operational_ready != TriState::True)) { + return RecoveryCheckResult{ + false, + SafetyReason::DeviceNotReady, + "device did not confirm a nominal operational state"}; + } + return RecoveryCheckResult{true, SafetyReason::None, {}}; + }; + + if (request.restore_operational_state) { + std::lock_guard lock(impl_->mutex); + impl_->active_operation_phase = "restore_devices"; + } + for (const auto& target : targets) { + SafetyTargetResult target_result; + target_result.target_id = target.id; + target_result.before_state = target.before; + target_result.after_state = target.before; + + SafetySnapshotView view; + if (!target.endpoint) { + target_result.reason = SafetyReason::SafetyStateMissing; + target_result.detail = "device has no safety endpoint"; + } else if (!impl_->snapshots.waitForNewerSample( + target.id, + target.previous_sequence, + deadline, + view)) { + target_result.reason = SafetyReason::SafetyStateStale; + target_result.detail = + "active safety refresh did not publish a newer sample"; + } else { + RecoveryCheckResult checked; + if (!request.restore_operational_state) { + checked = validate_snapshot(view, target.policy, false); + } else if (!clear_authorized) { + checked = { + false, + SafetyReason::RecoveryAuditFailed, + "persistent recovery audit did not authorize operational restore"}; + } else if (!view.fresh) { + checked = { + false, + SafetyReason::SafetyStateStale, + "refreshed safety sample is stale"}; + } else if (view.snapshot.condition == SafetyCondition::Unknown) { + checked = { + false, + SafetyReason::SafetyStateMissing, + "hardware safety condition remains unknown"}; + } else if (view.snapshot.connected != TriState::True) { + checked = { + false, + SafetyReason::DeviceDisconnected, + "device connection is not confirmed"}; + } else if (target.policy == SafetyPolicyFamily::Control && + view.snapshot.emergency_stop_active != + TriState::False) { + checked = { + false, + SafetyReason::EmergencyStopActive, + "emergency stop must be released before operational recovery"}; + } else if (target.policy == SafetyPolicyFamily::Control && + view.snapshot.quiescent != TriState::True) { + checked = { + false, + SafetyReason::DeviceStillMoving, + "control device has not confirmed a quiescent state"}; + } else { + checked = validate_snapshot(view, target.policy, true); + if (!checked.reconciled) { + try { + checked = target.endpoint->restoreOperationalState( + recovery_context); + } catch (const std::exception& error) { + checked = { + false, SafetyReason::InternalError, error.what()}; + } catch (...) { + checked = { + false, + SafetyReason::InternalError, + "device operational recovery threw an unknown exception"}; + } + if (checked.reconciled) { + const auto restored_sequence = + view.snapshot.sample_sequence; + target.endpoint->requestSafetyRefresh(); + if (!impl_->snapshots.waitForNewerSample( + target.id, + restored_sequence, + deadline, + view)) { + checked = { + false, + SafetyReason::SafetyStateStale, + "operational recovery did not publish a newer safety sample"}; + } else { + checked = validate_snapshot( + view, target.policy, true); + } + } + } + } + target_result.success = checked.reconciled; + target_result.reason = checked.reason; + target_result.detail = std::move(checked.detail); + } + + if (!target_result.success) { + all_verified = false; + } + result.targets.push_back(std::move(target_result)); + } + + std::vector retained_candidate_ids; + const bool operational_hardware_verified = all_verified; + if (!request.verify_only && + (!request.restore_operational_state || + operational_hardware_verified)) { + const bool has_device_clear_candidate = std::any_of( + result.targets.begin(), result.targets.end(), + [](const auto& target) { return target.success; }); + { + std::lock_guard lock(impl_->mutex); + retained_candidate_ids.reserve( + impl_->retained_barriers.size()); + for (const auto& [id, retained] : impl_->retained_barriers) { + (void)retained; + const auto device = impl_->devices.find(id); + if (device == impl_->devices.end()) { + retained_candidate_ids.push_back(id); + continue; + } + const auto target = std::find_if( + result.targets.begin(), result.targets.end(), + [&id](const auto& candidate) { + return candidate.target_id == id && + candidate.success; + }); + if (target != result.targets.end()) { + retained_candidate_ids.push_back(id); + } + } + } + const bool has_clear_candidate = + has_device_clear_candidate || + !retained_candidate_ids.empty(); + if (has_clear_candidate && request.authorize_clear && + !clear_authorization_checked) { + clear_authorization_checked = true; + try { + clear_authorized = request.authorize_clear(); + } catch (...) { + clear_authorized = false; + } + } + if (!clear_authorized) { + for (auto& target : result.targets) { + if (!target.success) { + continue; + } + target.success = false; + target.reason = SafetyReason::RecoveryAuditFailed; + target.detail = + "persistent recovery audit did not authorize latch clear"; + } + for (const auto& id : retained_candidate_ids) { + const auto existing = std::find_if( + result.targets.begin(), result.targets.end(), + [&id](const auto& target) { + return target.target_id == id; + }); + if (existing == result.targets.end()) { + result.targets.push_back({ + id, + false, + SafetyReason::RecoveryAuditFailed, + "persistent recovery audit did not authorize subsystem latch clear", + DeviceAdmissionState::Quarantined, + DeviceAdmissionState::Quarantined}); + } + } + all_verified = false; + } else { + for (auto& target_result : result.targets) { + if (!target_result.success) { + continue; + } + const auto target = std::find_if( + targets.begin(), targets.end(), + [&target_result](const auto& candidate) { + return candidate.id == target_result.target_id; + }); + if (target == targets.end() || !target->endpoint) { + target_result.success = false; + target_result.reason = SafetyReason::SafetyStateMissing; + target_result.detail = + "device recovery endpoint disappeared"; + all_verified = false; + continue; + } + + RecoveryCheckResult reconciled{ + true, SafetyReason::None, {}}; + try { + reconciled = target->endpoint->reconcileAdmissionState( + recovery_context); + } catch (const std::exception& error) { + reconciled = { + false, SafetyReason::InternalError, error.what()}; + } catch (...) { + reconciled = { + false, + SafetyReason::InternalError, + "device recovery reconciliation threw an unknown exception"}; + } + target_result.success = reconciled.reconciled; + target_result.reason = reconciled.reason; + target_result.detail = reconciled.detail; + if (!target_result.success) { + all_verified = false; + } + } + } + } + + struct BarrierRecovery { + std::size_t target_index{0}; + std::shared_ptr participant; + BarrierToken token; + }; + std::vector barrier_recoveries; + if (!request.verify_only) { + std::lock_guard lock(impl_->mutex); + for (const auto& id : retained_candidate_ids) { + const auto barrier = impl_->retained_barriers.find(id); + if (barrier == impl_->retained_barriers.end()) { + continue; + } + auto target = std::find_if( + result.targets.begin(), result.targets.end(), + [&id](const auto& candidate) { + return candidate.target_id == id; + }); + if (target == result.targets.end()) { + result.targets.push_back({ + id, + true, + SafetyReason::None, + {}, + DeviceAdmissionState::Quarantined, + DeviceAdmissionState::Quarantined}); + target = std::prev(result.targets.end()); + } + if (!target->success) { + continue; + } + barrier_recoveries.push_back({ + static_cast( + std::distance(result.targets.begin(), target)), + barrier->second.participant, + barrier->second.token}); + } + } + for (const auto& pending : barrier_recoveries) { + RecoveryCheckResult recovered; + try { + recovered = pending.participant->recoverAdmission( + pending.token, recovery_context); + } catch (const std::exception& error) { + recovered = {false, SafetyReason::InternalError, error.what()}; + } catch (...) { + recovered = { + false, + SafetyReason::InternalError, + "participant recovery threw an unknown exception"}; + } + if (!recovered.reconciled) { + auto& target = result.targets[pending.target_index]; + target.success = false; + target.reason = recovered.reason; + target.detail = recovered.detail; + all_verified = false; + continue; + } + + bool release = false; + { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->retained_barriers.find( + pending.token.participant_id); + if (found != impl_->retained_barriers.end() && + found->second.token.operation_id == pending.token.operation_id && + found->second.token.safety_epoch == pending.token.safety_epoch && + found->second.token.generation == pending.token.generation) { + release = true; + } + } + if (release) { + const auto released = + pending.participant->releaseBarrier(pending.token); + { + std::lock_guard lock(impl_->mutex); + const auto runtime = impl_->participant_runtime.find( + pending.token.participant_id); + if (runtime != impl_->participant_runtime.end()) { + runtime->second.last_release = { + true, + released.success, + released.reason, + released.detail}; + } + } + if (!released.success) { + auto& target = result.targets[pending.target_index]; + target.success = false; + target.reason = released.reason == SafetyReason::None + ? SafetyReason::StopUnconfirmed + : released.reason; + target.detail = released.detail; + all_verified = false; + continue; + } + { + std::lock_guard lock(impl_->mutex); + const auto found = impl_->retained_barriers.find( + pending.token.participant_id); + if (found != impl_->retained_barriers.end() && + found->second.token.operation_id == + pending.token.operation_id && + found->second.token.safety_epoch == + pending.token.safety_epoch && + found->second.token.generation == + pending.token.generation) { + impl_->retained_barriers.erase(found); + const auto runtime = impl_->participant_runtime.find( + pending.token.participant_id); + if (runtime != impl_->participant_runtime.end()) { + runtime->second.barrier_active = false; + runtime->second.barrier_retained = false; + if (!runtime->second.registered) { + impl_->participant_runtime.erase(runtime); + } + } + } + } + result.targets[pending.target_index].after_state = + DeviceAdmissionState::Open; + } + } + + { + std::lock_guard lock(impl_->mutex); + impl_->active_operation_phase = "reconcile"; + for (auto& target : result.targets) { + const auto device = impl_->devices.find(target.target_id); + if (device == impl_->devices.end()) { + continue; + } + if (target.success && !request.verify_only && + (!request.restore_operational_state || all_verified)) { + device->second.quarantined = false; + device->second.software_blockers.clear(); + } + const auto view = impl_->snapshots.get(target.target_id); + device->second.admission_state = + impl_->admissionStateFor(device->second, view); + target.after_state = device->second.admission_state; + } + + const bool latch_remains = impl_->hasGlobalLatchLocked(); + if (request.verify_only) { + impl_->system_state = state_before_recovery == + SystemAdmissionState::Open && + !latch_remains + ? SystemAdmissionState::Open + : SystemAdmissionState::Latched; + result.result = all_verified + ? RecoveryResultCode::VerifiedButStillBlocked + : RecoveryResultCode::BlockerRemains; + } else if (all_verified && !latch_remains) { + impl_->system_state = SystemAdmissionState::Open; + result.result = RecoveryResultCode::Recovered; + } else { + impl_->system_state = SystemAdmissionState::Latched; + result.result = RecoveryResultCode::BlockerRemains; + } + result.system_state = impl_->system_state; + impl_->active_operation_id.clear(); + impl_->active_operation_phase.clear(); + impl_->addEventLocked( + result.result == RecoveryResultCode::Recovered + ? SafetyReason::None + : SafetyReason::SafetyLatched, + "system", + request.recovery_id, + std::string("recovery completed with result ") + + toString(result.result)); + impl_->state_changed.notify_all(); + } + + if (targets.empty() && result.targets.empty()) { + result.result = RecoveryResultCode::NothingToRecover; + } + { + std::lock_guard lock(round->mutex); + round->result = result; + round->done.store(true, std::memory_order_release); + } + round->completed.notify_all(); + return result; +} + +SafetyManagerSnapshot SafetyManager::snapshot() const +{ + SafetyManagerSnapshot result; + std::lock_guard lock(impl_->mutex); + result.system_state = impl_->system_state; + result.safety_epoch = impl_->safety_epoch; + result.service_instance_id = impl_->service_instance_id; + result.enforcement_mode = impl_->config.enforcement_mode; + result.active_operation_id = impl_->active_operation_id; + result.active_operation_phase = impl_->active_operation_phase; + result.devices.reserve(impl_->devices.size()); + for (const auto& [id, slot] : impl_->devices) { + DeviceSafetyStateView view; + view.descriptor = slot.descriptor; + view.safety = impl_->snapshots.get(id); + view.lifecycle = slot.lifecycle; + view.health = slot.health; + view.admission_state = slot.admission_state; + view.blockers = view.safety.snapshot.blockers; + view.blockers.insert( + view.blockers.end(), + slot.software_blockers.begin(), + slot.software_blockers.end()); + result.devices.push_back(std::move(view)); + } + std::sort(result.devices.begin(), result.devices.end(), + [](const auto& lhs, const auto& rhs) { + return lhs.descriptor.device_id < rhs.descriptor.device_id; + }); + result.participants.reserve(impl_->participant_runtime.size()); + for (const auto& [id, runtime] : impl_->participant_runtime) { + (void)id; + ParticipantSafetyStateView view; + view.descriptor = runtime.descriptor; + view.registered = runtime.registered; + view.barrier_active = runtime.barrier_active; + view.barrier_retained = runtime.barrier_retained; + view.operation_id = runtime.operation_id; + view.safety_epoch = runtime.safety_epoch; + view.last_request = runtime.last_request; + view.last_verify = runtime.last_verify; + view.last_release = runtime.last_release; + result.participants.push_back(std::move(view)); + } + std::sort(result.participants.begin(), result.participants.end(), + [](const auto& lhs, const auto& rhs) { + return lhs.descriptor.participant_id < + rhs.descriptor.participant_id; + }); + result.recent_events.assign(impl_->events.begin(), impl_->events.end()); + return result; +} + +CommandLedger& SafetyManager::commandLedger() noexcept +{ + return impl_->ledger; +} + +const std::string& SafetyManager::serviceInstanceId() const noexcept +{ + return impl_->service_instance_id; +} + +const SafetyManagerConfig& SafetyManager::config() const noexcept +{ + return impl_->config; +} + +const char* toString(const RecoveryResultCode value) noexcept +{ + switch (value) { + case RecoveryResultCode::Recovered: return "Recovered"; + case RecoveryResultCode::VerifiedButStillBlocked: + return "VerifiedButStillBlocked"; + case RecoveryResultCode::BlockerRemains: return "BlockerRemains"; + case RecoveryResultCode::EpochMismatch: return "EpochMismatch"; + case RecoveryResultCode::NothingToRecover: return "NothingToRecover"; + case RecoveryResultCode::TimedOut: return "TimedOut"; + case RecoveryResultCode::Failed: return "Failed"; + } + return "Failed"; +} + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/src/safety_reason.cpp b/cmvr-es/manager/safety_manager/src/safety_reason.cpp new file mode 100644 index 00000000..87e22e39 --- /dev/null +++ b/cmvr-es/manager/safety_manager/src/safety_reason.cpp @@ -0,0 +1,92 @@ +#include "manager/safety_manager/include/safety_reason.h" + +namespace cmvr::safety { + +const char* toString(const SafetyReason reason) noexcept +{ + switch (reason) { + case SafetyReason::None: return "NONE"; + case SafetyReason::InvalidArgument: return "INVALID_ARGUMENT"; + case SafetyReason::Unauthenticated: return "UNAUTHENTICATED"; + case SafetyReason::PermissionDenied: return "PERMISSION_DENIED"; + case SafetyReason::RecoveryRpcDisabled: return "RECOVERY_RPC_DISABLED"; + case SafetyReason::DeviceNotFound: return "DEVICE_NOT_FOUND"; + case SafetyReason::DeviceUnavailable: return "DEVICE_UNAVAILABLE"; + case SafetyReason::UnsupportedCommand: return "UNSUPPORTED_COMMAND"; + case SafetyReason::SystemStarting: return "SYSTEM_STARTING"; + case SafetyReason::SystemStopping: return "SYSTEM_STOPPING"; + case SafetyReason::SafetyLatched: return "SAFETY_LATCHED"; + case SafetyReason::SafetyStateMissing: return "SAFETY_STATE_MISSING"; + case SafetyReason::SafetyStateStale: return "SAFETY_STATE_STALE"; + case SafetyReason::HardwareUnsafe: return "HARDWARE_UNSAFE"; + case SafetyReason::EmergencyStopActive: return "EMERGENCY_STOP_ACTIVE"; + case SafetyReason::ProtectiveStopActive: return "PROTECTIVE_STOP_ACTIVE"; + case SafetyReason::DeviceDisconnected: return "DEVICE_DISCONNECTED"; + case SafetyReason::DeviceFault: return "DEVICE_FAULT"; + case SafetyReason::DeviceNotReady: return "DEVICE_NOT_READY"; + case SafetyReason::DeviceStillMoving: return "DEVICE_STILL_MOVING"; + case SafetyReason::ControlBusy: return "CONTROL_BUSY"; + case SafetyReason::GenerationMismatch: return "GENERATION_MISMATCH"; + case SafetyReason::CommandIdRequired: return "COMMAND_ID_REQUIRED"; + case SafetyReason::CommandIdConflict: return "COMMAND_ID_CONFLICT"; + case SafetyReason::ResultEvicted: return "RESULT_EVICTED"; + case SafetyReason::LedgerExhausted: return "LEDGER_EXHAUSTED"; + case SafetyReason::Backpressure: return "BACKPRESSURE"; + case SafetyReason::DeadlineExceededBeforeDispatch: + return "DEADLINE_EXCEEDED_BEFORE_DISPATCH"; + case SafetyReason::OutcomeUnknown: return "OUTCOME_UNKNOWN"; + case SafetyReason::ParticipantTimeout: return "PARTICIPANT_TIMEOUT"; + case SafetyReason::StopUnconfirmed: return "STOP_UNCONFIRMED"; + case SafetyReason::RecoveryEpochMismatch: return "RECOVERY_EPOCH_MISMATCH"; + case SafetyReason::RecoveryReasonRequired: return "RECOVERY_REASON_REQUIRED"; + case SafetyReason::RecoveryAuditFailed: return "RECOVERY_AUDIT_FAILED"; + case SafetyReason::InternalError: return "INTERNAL_ERROR"; + } + return "INTERNAL_ERROR"; +} + +bool retryWithSameCommandId(const SafetyReason reason) noexcept +{ + switch (reason) { + case SafetyReason::RecoveryRpcDisabled: + case SafetyReason::SystemStopping: + return true; + case SafetyReason::None: + case SafetyReason::InvalidArgument: + case SafetyReason::Unauthenticated: + case SafetyReason::PermissionDenied: + case SafetyReason::DeviceNotFound: + case SafetyReason::DeviceUnavailable: + case SafetyReason::UnsupportedCommand: + case SafetyReason::SystemStarting: + case SafetyReason::SafetyLatched: + case SafetyReason::SafetyStateMissing: + case SafetyReason::SafetyStateStale: + case SafetyReason::HardwareUnsafe: + case SafetyReason::EmergencyStopActive: + case SafetyReason::ProtectiveStopActive: + case SafetyReason::DeviceDisconnected: + case SafetyReason::DeviceFault: + case SafetyReason::DeviceNotReady: + case SafetyReason::DeviceStillMoving: + case SafetyReason::ControlBusy: + case SafetyReason::GenerationMismatch: + case SafetyReason::CommandIdRequired: + case SafetyReason::CommandIdConflict: + case SafetyReason::ResultEvicted: + case SafetyReason::LedgerExhausted: + case SafetyReason::Backpressure: + case SafetyReason::DeadlineExceededBeforeDispatch: + case SafetyReason::OutcomeUnknown: + case SafetyReason::ParticipantTimeout: + case SafetyReason::StopUnconfirmed: + case SafetyReason::RecoveryEpochMismatch: + case SafetyReason::RecoveryReasonRequired: + case SafetyReason::RecoveryAuditFailed: + case SafetyReason::InternalError: + return false; + } + return false; +} + +} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/src/safety_snapshot_store.cpp b/cmvr-es/manager/safety_manager/src/safety_snapshot_store.cpp new file mode 100644 index 00000000..5a80a38b --- /dev/null +++ b/cmvr-es/manager/safety_manager/src/safety_snapshot_store.cpp @@ -0,0 +1,305 @@ +#include "manager/safety_manager/include/safety_snapshot_store.h" + +#include +#include +#include +#include + +namespace cmvr::safety { + +namespace { + +std::uint64_t unixTimeMs() noexcept +{ + const auto value = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + return value > 0 ? static_cast(value) : 1U; +} + +} // namespace + +bool SafetySnapshotStore::registerDevice( + const DeviceSafetyDescriptor& descriptor, + const std::uint64_t initial_generation) +{ + if (descriptor.device_id.empty() || + descriptor.maximum_snapshot_age <= std::chrono::milliseconds::zero() || + initial_generation == 0) { + return false; + } + + Slot slot; + slot.descriptor = descriptor; + slot.snapshot.device_id = descriptor.device_id; + slot.snapshot.device_generation = initial_generation; + slot.snapshot.condition = SafetyCondition::Unknown; + + std::unique_lock lock(mutex_); + const auto inserted = slots_.emplace(descriptor.device_id, std::move(slot)); + if (inserted.second) { + changed_.notify_all(); + } + return inserted.second; +} + +bool SafetySnapshotStore::unregisterDevice(const std::string& device_id) +{ + std::unique_lock lock(mutex_); + const bool removed = slots_.erase(device_id) != 0; + if (removed) { + changed_.notify_all(); + } + return removed; +} + +bool SafetySnapshotStore::publish(DeviceSafetySnapshot snapshot) +{ + if (snapshot.device_id.empty() || snapshot.device_generation == 0 || + snapshot.sample_sequence == 0 || + snapshot.observed_at == SafetyClock::time_point{}) { + return false; + } + + std::unique_lock lock(mutex_); + const auto found = slots_.find(snapshot.device_id); + if (found == slots_.end()) { + return false; + } + + auto& slot = found->second; + const auto current_generation = slot.snapshot.device_generation; + if (snapshot.device_generation < current_generation) { + return false; + } + if (snapshot.device_generation == current_generation && + slot.has_sample && + snapshot.sample_sequence <= slot.snapshot.sample_sequence) { + return false; + } + if (snapshot.observed_at_unix_ms == 0) { + snapshot.observed_at_unix_ms = unixTimeMs(); + } + slot.snapshot = std::move(snapshot); + slot.has_sample = true; + changed_.notify_all(); + return true; +} + +bool SafetySnapshotStore::markUnknown( + const std::string& device_id, + const SafetyReason reason, + std::string source_id) +{ + std::unique_lock lock(mutex_); + const auto found = slots_.find(device_id); + if (found == slots_.end()) { + return false; + } + + auto& slot = found->second; + DeviceSafetySnapshot snapshot; + snapshot.device_id = device_id; + snapshot.device_generation = slot.snapshot.device_generation; + snapshot.sample_sequence = slot.snapshot.sample_sequence + 1U; + if (snapshot.sample_sequence == 0) { + snapshot.sample_sequence = 1U; + } + snapshot.observed_at = SafetyClock::now(); + snapshot.observed_at_unix_ms = unixTimeMs(); + snapshot.condition = SafetyCondition::Unknown; + snapshot.blockers.push_back(SafetyBlocker{ + reason, + BlockerScope::Device, + RecoveryRequirement::RefreshOnly, + source_id.empty() ? device_id : std::move(source_id), + {}, + snapshot.observed_at_unix_ms, + snapshot.observed_at_unix_ms}); + slot.snapshot = std::move(snapshot); + slot.has_sample = true; + changed_.notify_all(); + return true; +} + +std::optional SafetySnapshotStore::bumpGeneration( + const std::string& device_id) +{ + std::unique_lock lock(mutex_); + const auto found = slots_.find(device_id); + if (found == slots_.end()) { + return std::nullopt; + } + auto& slot = found->second; + if (slot.snapshot.device_generation == + std::numeric_limits::max()) { + return std::nullopt; + } + ++slot.snapshot.device_generation; + slot.snapshot.sample_sequence = 0; + slot.snapshot.observed_at = {}; + slot.snapshot.observed_at_unix_ms = 0; + slot.snapshot.condition = SafetyCondition::Unknown; + slot.snapshot.blockers.clear(); + slot.has_sample = false; + changed_.notify_all(); + return slot.snapshot.device_generation; +} + +SafetySnapshotView SafetySnapshotStore::viewOf_( + const Slot& slot, + const SafetyClock::time_point now) +{ + SafetySnapshotView view; + view.descriptor = slot.descriptor; + view.snapshot = slot.snapshot; + view.registered = true; + view.has_sample = slot.has_sample; + if (!slot.has_sample || + slot.snapshot.observed_at == SafetyClock::time_point{}) { + return view; + } + + const auto elapsed = now <= slot.snapshot.observed_at + ? SafetyClock::duration::zero() + : now - slot.snapshot.observed_at; + view.sample_age = std::chrono::duration_cast( + elapsed); + view.fresh = view.sample_age <= slot.descriptor.maximum_snapshot_age; + return view; +} + +SafetySnapshotView SafetySnapshotStore::get( + const std::string& device_id, + const SafetyClock::time_point now) const +{ + std::shared_lock lock(mutex_); + const auto found = slots_.find(device_id); + if (found == slots_.end()) { + return {}; + } + return viewOf_(found->second, now); +} + +std::vector SafetySnapshotStore::snapshot( + const SafetyClock::time_point now) const +{ + std::vector result; + std::shared_lock lock(mutex_); + result.reserve(slots_.size()); + for (const auto& [id, slot] : slots_) { + (void)id; + result.push_back(viewOf_(slot, now)); + } + std::sort(result.begin(), result.end(), [](const auto& lhs, const auto& rhs) { + return lhs.descriptor.device_id < rhs.descriptor.device_id; + }); + return result; +} + +bool SafetySnapshotStore::waitForNewerSample( + const std::string& device_id, + const std::uint64_t previous_sequence, + const SafetyClock::time_point deadline, + SafetySnapshotView& result) const +{ + std::unique_lock lock(mutex_); + const auto ready = [&]() { + const auto found = slots_.find(device_id); + return found == slots_.end() || + (found->second.has_sample && + found->second.snapshot.sample_sequence > previous_sequence); + }; + if (!changed_.wait_until(lock, deadline, ready)) { + return false; + } + const auto found = slots_.find(device_id); + if (found == slots_.end()) { + return false; + } + result = viewOf_(found->second, SafetyClock::now()); + return result.has_sample && + result.snapshot.sample_sequence > previous_sequence; +} + +const char* toString(const TriState value) noexcept +{ + switch (value) { + case TriState::Unknown: return "Unknown"; + case TriState::False: return "False"; + case TriState::True: return "True"; + } + return "Unknown"; +} + +const char* toString(const SafetyCondition value) noexcept +{ + switch (value) { + case SafetyCondition::Nominal: return "Nominal"; + case SafetyCondition::Restricted: return "Restricted"; + case SafetyCondition::Unsafe: return "Unsafe"; + case SafetyCondition::Unknown: return "Unknown"; + } + return "Unknown"; +} + +const char* toString(const CommandIntent value) noexcept +{ + switch (value) { + case CommandIntent::Observe: return "Observe"; + case CommandIntent::StartActivity: return "StartActivity"; + case CommandIntent::Configure: return "Configure"; + case CommandIntent::Actuate: return "Actuate"; + case CommandIntent::Stop: return "Stop"; + case CommandIntent::ResetFault: return "ResetFault"; + case CommandIntent::RecoverAdmission: return "RecoverAdmission"; + } + return "Observe"; +} + +const char* toString(const SafetyPolicyFamily value) noexcept +{ + switch (value) { + case SafetyPolicyFamily::Sensor: return "Sensor"; + case SafetyPolicyFamily::Control: return "Control"; + } + return "Sensor"; +} + +const char* toString(const SystemAdmissionState value) noexcept +{ + switch (value) { + case SystemAdmissionState::Starting: return "Starting"; + case SystemAdmissionState::Open: return "Open"; + case SystemAdmissionState::Stopping: return "Stopping"; + case SystemAdmissionState::Latched: return "Latched"; + case SystemAdmissionState::Recovering: return "Recovering"; + case SystemAdmissionState::ShuttingDown: return "ShuttingDown"; + } + return "Starting"; +} + +const char* toString(const DeviceAdmissionState value) noexcept +{ + switch (value) { + case DeviceAdmissionState::Observing: return "Observing"; + case DeviceAdmissionState::Open: return "Open"; + case DeviceAdmissionState::Blocked: return "Blocked"; + case DeviceAdmissionState::Quarantined: return "Quarantined"; + case DeviceAdmissionState::Recovering: return "Recovering"; + case DeviceAdmissionState::Removed: return "Removed"; + } + return "Observing"; +} + +const char* toString(const EnforcementMode value) noexcept +{ + switch (value) { + case EnforcementMode::Legacy: return "Legacy"; + case EnforcementMode::Shadow: return "Shadow"; + case EnforcementMode::EnforceSelected: return "EnforceSelected"; + case EnforcementMode::EnforceAll: return "EnforceAll"; + } + return "Legacy"; +} + +} // namespace cmvr::safety diff --git a/cmvr-es/service/README.md b/cmvr-es/service/README.md index 0ed71894..5c7c8c53 100644 --- a/cmvr-es/service/README.md +++ b/cmvr-es/service/README.md @@ -6,13 +6,33 @@ ## 当前结构 +`service/` 顶层只按传输协议保留两个子目录:`grpc/` 和 `quic_edge/`。gRPC +内部再按运行角色分层,避免把队列、停止控制、客户端和服务端实现混在同一层。 + +```text +service/ +├── grpc/ +│ ├── action/ # ActionQueue 校验、账本和 FIFO 执行器 +│ ├── client/ # 边缘端使用的 gRPC client +│ ├── server/ # gRPC service、协调器和安全扩展 +│ │ ├── include/ +│ │ ├── src/ +│ │ └── tests/ +│ └── stop_all/ # 高优先级 StopAll 通道 +└── quic_edge/ # QUIC client、控制状态机和媒体 packetizer +``` + | 目录 | 职责 | | --- | --- | -| `grpc/` | 入站设备控制、状态查询和兼容流式接口 | +| `grpc/action/` | SystemService ActionQueue 的校验、幂等账本和边缘端 FIFO 执行器 | +| `grpc/client/` | 面向边缘端内部调用的 gRPC client | +| `grpc/server/` | 入站设备控制、状态查询、兼容流式接口和安全控制面 | +| `grpc/stop_all/` | 不进入普通命令队列的高优先级停止通道 | | `quic_edge/` | 边缘端主动连接平台的 QUIC client、控制状态机和媒体 packetizer | | `quic_edge/tests/` | 已登记到 CTest 的 QUIC 协议测试 | -两个遗留 gRPC client test 位于 `grpc/src/*_client_test.cpp`,当前没有通过 `add_test()` 登记。 +两个遗留 gRPC client test 位于 `grpc/server/tests/*_client_test.cpp`,当前没有通过 +`add_test()` 登记;它们是历史可执行文件,不代表默认自动覆盖。 gRPC 和 QUIC 的职责边界: @@ -21,6 +41,104 @@ gRPC 和 QUIC 的职责边界: - 实时音视频使用 QUIC DATAGRAM; - `quic_edge/` 不是平台 Gateway,也不是浏览器服务器。 +## SystemService 设备清单 + +`SystemService/GetDeviceList` 返回 `DeviceManager` 的当前只读快照,只包含 +`enabled=true` 的设备。启用但创建、初始化、启动或健康检查失败的设备仍会返回, +并通过 `manager_state`、`health`、`has_error` 和 `error_message` 描述异常。 +接口同时返回稳定的 `device_type` 和仅用于展示/诊断的具体 `type_name`;调用方 +不得使用 `type_name` 做设备类别判断。 + +该 RPC 不修改配置、不动态注册设备,也不触发设备生命周期操作。启用 reflection +后可直接查询: + +```bash +grpcurl -plaintext \ + -d '{}' \ + 127.0.0.1:50052 \ + cmvr.api.SystemService/GetDeviceList +``` + +## SystemService ActionQueue + +`SystemService/ExecuteActionQueue` 接收一个完整的有限动作序列,在边缘端排队并 +逐步串行执行,所有步骤结束后返回最终结果。平台只需要提交一次请求,因此连续机械臂 +动作不会再受到每个单独 gRPC 往返和 Wi-Fi 抖动的影响。 + +当前 v1 仅允许以下 `ActionStep.command`: + +- 机械臂同步 `MoveJ`、`MoveL`; +- AGV 同步 `navigateToPose`、`navigateToStation`、`followPath`; +- 边缘端本地 `delay`。 + +机械臂和 AGV 请求复用各自已有的类型化 Request,目标设备仍由每一步的 +`header.device_id` 指定。所有运动步骤必须设置 `asynchronous=false`;`MoveL` v1 仅接受 +Base frame;AGV 后端还必须明确支持同步导航终态确认。`speedJ`、`speedL`、`servoJ`、 +AGV `translate`、速度控制、查询和流式 RPC 都不属于 ActionQueue v1。 + +ActionQueue 遵循以下执行语义: + +- 平台先调用 `GetSystemInfo` 读取 `action_service_instance_id`,并在每次提交和重试中填入 + `expected_service_instance_id`。ActionQueue 账本随服务实例重建;若断线期间边缘服务重启, + 旧实例 ID 会被拒绝,平台必须先对账,不能用新 ID 自动重放不确定的动作; +- `action_id` 是必填的全局唯一幂等键;同一服务实例内,相同内容的已受理请求不会重复下发 + 设备命令,相同 ID 但内容不同的请求必须拒绝。服务端缓存最近 4096 个完整结果,更早的 + 已执行 ID 由精确 retired-ID 账本 fail-closed 拒绝、不会重跑;单实例最多记录 + 262144 个已受理 ID,达到容量后仅拒绝新 ID,已有 ID 仍可查询; +- 入队前校验全部步骤、设备、参数和同步能力,校验失败时不会执行任何步骤; +- v1 每个请求最多 256 步、序列化大小最多 512 KiB、排队或执行中的 Action 最多 64 个、 + 同时提交或等待结果的 RPC 最多 256 个;Action 与单步超时上限均为 24 小时, + `total_timeout_ms=0` 使用 30 分钟默认值,AGV 路径最多 4096 段; +- `total_timeout_ms` 包含排队与执行时间,单步 `timeout_ms=0` 时继承 Action 剩余时间 + 或服务端默认值;所有超时值均由服务端施加上限; +- 任一步失败、取消或超时后立即停止序列,不再执行后续步骤;`completed_steps` 表示此前 + 成功完成的步骤数,`failed_step_index` 仅在存在对应失败步骤时出现; +- Action 一旦受理,不因平台连接中断而自动取消;断线只结束该 RPC waiter,边缘动作继续。 + 平台可用相同 `action_id` 重试并取得仍在缓存中的同一次执行结果; +- `StopAll`、机械臂 `stopMotion`、AGV `cancelNavigation` 和软件急停不进入 FIFO,必须 + 作为高优先级安全/抢占路径执行。它们仍不具备功能安全等级。 +- 机械臂步骤超时会立即走 typed `stopMotion` 并等待停车确认;若无法确认停车,设备控制权 + 保持隔离,不会继续后续步骤或接受新的普通控制命令;需先按设备安全流程确认状态,再 + 重启边缘服务恢复控制。 +- AGV 的取消 ACK、零速度 ACK 均不等于停稳;ActionQueue 和安全停止 RPC 只有在导航任务 + 终态且底盘连续零速度采样确认后才释放控制权,否则同样保留隔离。 + +已知的执行完成、业务失败、取消、超时和预校验拒绝由 `ActionResultCode` 与 +`CommandHeader.Feedback` 表达。`ActionDeduplicationStatus` 结构化区分新受理、合并等待、 +缓存结果、已淘汰结果、账本耗尽、ID 冲突和服务实例不匹配;平台不得通过解析错误字符串 +判断动作是否执行过。 +`ACTION_RESULT_CODE_UNSPECIFIED` 不得作为服务端最终结果。 + +## MotorService + +`MotorService` 将 gRPC 电机命令适配到已经由 `DeviceManager` 创建的 +`MotorManager` 和 `AbstractMotor`,不直接持有现场总线或厂商驱动。 + +关键文件: + +- Proto:[`../../protos/cmvr/api/motor_service.proto`](../../protos/cmvr/api/motor_service.proto) + 和 [`../../protos/cmvr/api/motor_command.proto`](../../protos/cmvr/api/motor_command.proto) +- 实现:[`grpc/server/include/grpc_motor_service.h`](grpc/server/include/grpc_motor_service.h) + 和 [`grpc/server/src/grpc_motor_service.cpp`](grpc/server/src/grpc_motor_service.cpp) +- 注册:[`../task/grpc_server_task/src/grpc_server_task.cpp`](../task/grpc_server_task/src/grpc_server_task.cpp) + +服务按单电机仲裁。同步 Profile 命令、Cyclic Position/Velocity 双向流、 +`setEnabled`、状态读取和软件 `emergencyStop` 共用同一控制权状态: + +- 同一电机已有 owner 时拒绝新的控制调用; +- cyclic 流首帧必须是 `open`,后续 setpoint sequence 必须严格递增; +- reader 使用 latest-wins 邮箱,客户端必须持续并发读取反馈; +- 取消、deadline、watchdog、非法帧、后端拒绝或写失败都会触发 Quick Stop; +- 任何清理 Quick Stop 未确认时,服务进入 fail-closed 锁存; +- 只有成功执行 `setEnabled(true)` 才解除服务内软件急停锁存; +- 服务层 Quick Stop 和 `emergencyStop` 都不具备功能安全等级。 + +AUBO 控制柜 IO 不经过 `MotorService`,由 +`ArmService/ExecuteJsonCommand` 转发到目标 `RobotArm`。厂商命令和安全约束见 +[AUBO 控制柜 IO](../devices/arm/aubo_arm/README.md)。 +旧的 `SystemService/ExecuteJsonCommand` 已移除;相机 PTZ 应使用类型化的 +`CameraService/ControlPtz`。 + ## 新增 gRPC Service 当前没有动态 service registry,必须完成以下全部步骤。 @@ -40,8 +158,9 @@ import 路径必须相对于 `protos/`。兼容规则见 [`../../protos/README.m ```text service/grpc/ -├── include/grpc_example_service.h -└── src/grpc_example_service.cpp +└── server/ + ├── include/grpc_example_service.h + └── src/grpc_example_service.cpp ``` 实现类继承生成的: @@ -103,7 +222,7 @@ cmvr::api::ExampleService::Service - 检查 `context->IsCancelled()`; - 检查 `Read()` / `Write()` 返回; -- 使用 RAII 或 MediaSourceHub Subscription 释放 producer lease; +- 使用 RAII 或 MediaSourceManager Subscription 释放 producer lease; - 不持有设备状态锁进行网络写; - 为 wait/read 使用有限 timeout; - 慢客户端不能阻塞设备生产线程; @@ -111,7 +230,7 @@ cmvr::api::ExampleService::Service - gRPC RGB 流在积压超过 `camera_stream_max_pending_frames` 或帧龄超过 `camera_stream_max_frame_age_ms` 时主动丢弃旧帧,请求 IDR,并从下一个关键帧恢复。 -当前仅 gRPC RGB 和麦克风流使用 MediaSourceHub;Depth/RGBD 仍直接读取设备帧。 +当前仅 gRPC RGB 和麦克风流使用 MediaSourceManager;Depth/RGBD 仍直接读取设备帧。 gRPC 相机实时流默认最多保留 2 帧积压、最大允许 250 ms 帧龄。两个配置项填 0 时使用上述默认值。该策略以低延迟为目标,不保证每个视频帧都到达客户端;控制命令 diff --git a/cmvr-es/service/grpc/CMakeLists.txt b/cmvr-es/service/grpc/CMakeLists.txt new file mode 100644 index 00000000..4214e37d --- /dev/null +++ b/cmvr-es/service/grpc/CMakeLists.txt @@ -0,0 +1,120 @@ + +add_library(service + stop_all/src/stop_operation_dispatcher.cpp + action/src/action_queue_executor.cpp + server/src/camera_ptz_activity_registry.cpp + server/src/media_activity_coordinator.cpp + server/src/motor_activity_coordinator.cpp + server/src/grpc_camera_service.cpp + server/src/grpc_command_transaction.cpp + server/src/grpc_error_logging_interceptor.cpp + server/src/grpc_recovery_audit.cpp + server/src/grpc_safety_proto.cpp + server/src/grpc_safety_participants.cpp + server/src/grpc_security.cpp + server/src/grpc_system_service.cpp + server/src/grpc_speaker_service.cpp + server/src/grpc_microphone_service.cpp + server/src/grpc_head_service.cpp + server/src/grpc_dexhand_service.cpp + server/src/grpc_arm_service.cpp + server/src/grpc_arm_teleop_service.cpp + server/src/grpc_robot_arm_teleop_backend.cpp + server/src/grpc_motor_service.cpp + server/src/grpc_agv_service.cpp + server/src/grpc_hlc_service.cpp + ../../task/grpc_server_task/src/grpc_server_task.cpp +) + +target_include_directories(service PUBLIC + ${CMAKE_SOURCE_DIR}/cmvr-es +) + +target_link_libraries(service PRIVATE + cmvr_es::proto + cmvr_es::stop_all_admission_gate + cmvr_es::camera_operational_activity_registry + osqp + cmvr_es::control_authority_manager + cmvr_es::device_manager + cmvr_es::task_manager + cmvr_es::algorithms::controller + cmvr_es::task + cmvr_es::media_source_manager + cmvr_es::device_media_source_adapter + protobuf::libprotobuf +) + +add_library(cmvr_es::service ALIAS service) +install(TARGETS service LIBRARY DESTINATION lib) + +if(BUILD_TESTING) + add_executable(grpc_camera_stream_policy_test + server/tests/grpc_camera_stream_policy_test.cpp + ) + target_include_directories(grpc_camera_stream_policy_test + PRIVATE + ${CMAKE_SOURCE_DIR}/cmvr-es + ) + add_test( + NAME grpc_camera_stream_policy_test + COMMAND grpc_camera_stream_policy_test + ) + set_tests_properties(grpc_camera_stream_policy_test PROPERTIES TIMEOUT 10) +endif() + +# -------------------------------------------------------- +# Unit test +# -------------------------------------------------------- +find_package(OpenCV REQUIRED) + +include_directories( + ${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/include +) + +link_directories( + ${CMAKE_SOURCE_DIR}/third_party/gtest/1.17.0/lib +) + + +add_executable(grpc_arm_client_test + server/tests/grpc_arm_client_test.cpp +) + + +target_link_libraries(grpc_arm_client_test + PRIVATE + cmvr_es::device::canbus + cmvr_es::device::ti5_canopen_motor_driver + osqp + gtest + gtest_main + pthread + glog + cmvr_es::proto + ccd + fcl + cmvr_es::device_manager + ${OpenCV_LIBS} +) + + +add_executable(grpc_hlc_client_test + server/tests/grpc_hlc_client_test.cpp +) + + +target_link_libraries(grpc_hlc_client_test + PRIVATE + cmvr_es::device::canbus + cmvr_es::device::ti5_canopen_motor_driver + osqp + gtest + gtest_main + pthread + glog + cmvr_es::proto + ccd + fcl + cmvr_es::device_manager +) diff --git a/cmvr-es/service/grpc/action/src/action_queue_executor.cpp b/cmvr-es/service/grpc/action/src/action_queue_executor.cpp new file mode 100644 index 00000000..d2175348 --- /dev/null +++ b/cmvr-es/service/grpc/action/src/action_queue_executor.cpp @@ -0,0 +1,2528 @@ +#include "service/grpc/action/include/action_queue_executor.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "common/base/logging/logger.h" +#include "devices/agv/abstract_agv.h" +#include "devices/arm/robot_arm.h" +#include "manager/control_authority_manager/include/control_authority_manager.h" +#include "manager/device_manager/include/device_manager.h" +#include "manager/safety_manager/include/safety_manager.h" +#include "service/grpc/stop_all/include/stop_all_admission_gate.h" + +namespace cmvr::service { +namespace { + +using Clock = std::chrono::steady_clock; +using Milliseconds = std::chrono::milliseconds; + +constexpr std::size_t kMaxSteps = 256; +constexpr std::size_t kMaxQueuedActions = 64; +constexpr std::size_t kMaxTerminalResults = 4096; +constexpr std::size_t kMaxRequestBytes = 512U * 1024U; +constexpr std::size_t kMaxIdentifierBytes = 128; +constexpr std::size_t kMaxPathSegments = 4096; +constexpr std::size_t kMaxConcurrentSubmitters = 256; +constexpr Milliseconds kDefaultTotalTimeout = std::chrono::minutes(30); +constexpr Milliseconds kMaximumTimeout = std::chrono::hours(24); +constexpr Milliseconds kLeaseRetryPeriod{10}; +constexpr Milliseconds kWaiterCancellationPollPeriod{20}; +constexpr Milliseconds kArmWatchdogPollPeriod{5}; +constexpr Milliseconds kArmIdleConfirmationPollPeriod{10}; +constexpr auto kConcurrentArmStopConfirmationTimeout = + std::chrono::seconds(7); +constexpr auto kControlLeaseTtl = std::chrono::hours(25); + +enum class PreparedStepKind { + ArmMoveJ, + ArmMoveL, + AgvNavigateToPose, + AgvNavigateToStation, + AgvFollowPath, + Delay, +}; + +struct PreparedStep { + PreparedStepKind kind{PreparedStepKind::Delay}; + std::string device_id; + std::shared_ptr arm; + std::shared_ptr agv; +}; + +struct PreparedAction { + std::vector steps; + std::vector resource_ids; +}; + +safety::CommandDescriptor safetyDescriptorFor( + const PreparedStepKind kind) +{ + using safety::CommandIntent; + using safety::SafetyPolicyFamily; + switch (kind) { + case PreparedStepKind::ArmMoveJ: + return {"/cmvr.api.ArmService/moveJ", CommandIntent::Actuate, + SafetyPolicyFamily::Control, true, false}; + case PreparedStepKind::ArmMoveL: + return {"/cmvr.api.ArmService/moveL", CommandIntent::Actuate, + SafetyPolicyFamily::Control, true, false}; + case PreparedStepKind::AgvNavigateToPose: + return {"/cmvr.api.AgvService/navigateToPose", + CommandIntent::Actuate, SafetyPolicyFamily::Control, + true, false}; + case PreparedStepKind::AgvNavigateToStation: + return {"/cmvr.api.AgvService/navigateToStation", + CommandIntent::Actuate, SafetyPolicyFamily::Control, + true, false}; + case PreparedStepKind::AgvFollowPath: + return {"/cmvr.api.AgvService/followPath", + CommandIntent::Actuate, SafetyPolicyFamily::Control, + true, false}; + case PreparedStepKind::Delay: + break; + } + return {}; +} + +const api::CommandHeader_Request* commandHeaderFor( + const api::ActionStep& step) +{ + switch (step.command_case()) { + case api::ActionStep::kArmMoveJ: + return &step.arm_move_j().header(); + case api::ActionStep::kArmMoveL: + return &step.arm_move_l().header(); + case api::ActionStep::kAgvNavigateToPose: + return &step.agv_navigate_to_pose().header(); + case api::ActionStep::kAgvNavigateToStation: + return &step.agv_navigate_to_station().header(); + case api::ActionStep::kAgvFollowPath: + return &step.agv_follow_path().header(); + case api::ActionStep::kDelay: + case api::ActionStep::COMMAND_NOT_SET: + return nullptr; + } + return nullptr; +} + +std::string actionStepCommandId( + const std::string& action_id, + const std::string& step_id) +{ + return "action:" + std::to_string(action_id.size()) + ':' + + action_id + ":step:" + std::to_string(step_id.size()) + ':' + + step_id; +} + +struct ValidationResult { + bool valid{false}; + std::string error; + int failed_step_index{-1}; + PreparedAction prepared; +}; + +struct RequestFingerprint { + std::array words{}; + std::uint64_t serialized_size{0}; + + bool operator==(const RequestFingerprint& other) const noexcept + { + return serialized_size == other.serialized_size && + words == other.words; + } + + bool operator!=(const RequestFingerprint& other) const noexcept + { + return !(*this == other); + } +}; + +std::uint64_t stableHash( + const std::string& value, + const std::uint64_t seed) noexcept +{ + std::uint64_t hash = 1469598103934665603ULL ^ seed; + for (const unsigned char byte : value) { + hash ^= static_cast(byte); + hash *= 1099511628211ULL; + } + hash ^= hash >> 33U; + hash *= 0xff51afd7ed558ccdULL; + hash ^= hash >> 33U; + hash *= 0xc4ceb9fe1a85ec53ULL; + hash ^= hash >> 33U; + return hash; +} + +std::string generateServiceInstanceId() +{ + std::array bytes{}; + std::size_t offset = 0; + while (offset < bytes.size()) { + const auto received = ::getrandom( + bytes.data() + offset, + bytes.size() - offset, + 0); + if (received < 0) { + if (errno == EINTR) { + continue; + } + throw std::system_error( + errno, + std::generic_category(), + "could not generate the ActionQueue service instance id"); + } + if (received == 0) { + throw std::runtime_error( + "could not generate the ActionQueue service instance id"); + } + offset += static_cast(received); + } + + // RFC 4122 variant and version bits make the epoch recognizable as a + // random UUID without reducing its collision resistance materially. + bytes[6] = static_cast((bytes[6] & 0x0fU) | 0x40U); + bytes[8] = static_cast((bytes[8] & 0x3fU) | 0x80U); + std::ostringstream stream; + stream << std::hex << std::setfill('0'); + for (std::size_t index = 0; index < bytes.size(); ++index) { + if (index == 4U || index == 6U || index == 8U || index == 10U) { + stream << '-'; + } + stream << std::setw(2) << static_cast(bytes[index]); + } + return stream.str(); +} + +std::size_t validatedAcceptedActionLimit(const std::size_t limit) +{ + if (limit == 0U) { + throw std::invalid_argument( + "ActionQueue accepted-action limit must be positive"); + } + return limit; +} + +void fillTerminalFeedback( + api::ActionQueueCommand_Feedback& feedback, + const std::string& action_id, + const api::ActionResultCode result, + const std::uint32_t completed_steps, + const std::string& message, + const int failed_step_index = -1) +{ + feedback.Clear(); + feedback.set_action_id(action_id); + feedback.set_result(result); + feedback.set_completed_steps(completed_steps); + if (failed_step_index >= 0) { + feedback.set_failed_step_index( + static_cast(failed_step_index)); + } + auto* header = feedback.mutable_header(); + header->set_success(result == api::ACTION_RESULT_CODE_COMPLETED); + header->set_error_message(message); + *header->mutable_timestamp() = + google::protobuf::util::TimeUtil::GetCurrentTime(); +} + +bool finite(const double value) noexcept +{ + return std::isfinite(value); +} + +bool finiteNonNegative(const double value) noexcept +{ + return finite(value) && value >= 0.0; +} + +bool validArmOptions( + const api::MotionOptions& options, + std::string& error) +{ + if (options.asynchronous()) { + error = "ActionQueue requires synchronous RobotArm motion"; + return false; + } + if (!finiteNonNegative(options.velocity()) || + !finiteNonNegative(options.acceleration()) || + !finiteNonNegative(options.blend_radius()) || + !finiteNonNegative(options.jerk())) { + error = "RobotArm motion options must be finite and non-negative"; + return false; + } + for (const double limit : options.joint_velocity_limits()) { + if (!finiteNonNegative(limit)) { + error = "RobotArm joint velocity limits must be finite and non-negative"; + return false; + } + } + return true; +} + +bool validAgvOptions( + const msgs::AgvMotionOptions& options, + std::string& error) +{ + if (options.asynchronous()) { + error = "ActionQueue requires synchronous AGV navigation"; + return false; + } + if (!finiteNonNegative(options.max_speed()) || + !finiteNonNegative(options.max_angular_speed()) || + !finiteNonNegative(options.max_acceleration()) || + !finiteNonNegative(options.max_angular_acceleration()) || + !finiteNonNegative(options.reach_distance()) || + !finiteNonNegative(options.reach_angle()) || + !finiteNonNegative(options.speed_ratio())) { + error = "AGV motion options must be finite and non-negative"; + return false; + } + if (options.speed_ratio() > 1.0) { + error = "AGV speed_ratio must be in [0, 1]"; + return false; + } + if (options.wait_timeout_ms() < 0 || + options.poll_interval_ms() < 0 || + options.blocked_timeout_ms() < 0) { + error = "AGV wait timeout, blocked timeout, and poll interval " + "must be non-negative"; + return false; + } + if (options.poll_interval_ms() > 5000) { + error = "AGV poll_interval_ms must not exceed 5000"; + return false; + } + if (options.wait_timeout_ms() > 0 && + options.poll_interval_ms() > options.wait_timeout_ms()) { + error = "AGV poll_interval_ms must not exceed wait_timeout_ms"; + return false; + } + return true; +} + +device::FrameType toFrameType(const api::ArmFrameType frame) +{ + switch (frame) { + case api::ARM_FRAME_BASE: + return device::FrameType::Base; + case api::ARM_FRAME_TOOL: + return device::FrameType::Tool; + case api::ARM_FRAME_WORLD: + return device::FrameType::World; + case api::ARM_FRAME_USER: + return device::FrameType::User; + } + return device::FrameType::Base; +} + +device::MotionOptions toArmMotionOptions( + const api::MotionOptions& source) +{ + device::MotionOptions destination; + destination.velocity = source.velocity(); + destination.acceleration = source.acceleration(); + destination.blend_radius = source.blend_radius(); + destination.jerk = source.jerk() > 0.0 ? source.jerk() : 5.0; + destination.joint_velocity_limits.assign( + source.joint_velocity_limits().begin(), + source.joint_velocity_limits().end()); + destination.asynchronous = source.asynchronous(); + return destination; +} + +device::AgvAdapterParams toAgvAdapterParams( + const msgs::AgvAdapterParams& source) +{ + device::AgvAdapterParams destination; + for (const auto& item : source.values()) { + destination.values.emplace(item.first, item.second); + } + return destination; +} + +device::AgvMotionOptions toAgvMotionOptions( + const msgs::AgvMotionOptions& source) +{ + device::AgvMotionOptions destination; + destination.max_speed = source.max_speed(); + destination.max_angular_speed = source.max_angular_speed(); + destination.max_acceleration = source.max_acceleration(); + destination.max_angular_acceleration = + source.max_angular_acceleration(); + destination.reach_distance = source.reach_distance(); + destination.reach_angle = source.reach_angle(); + destination.speed_ratio = + source.speed_ratio() > 0.0 ? source.speed_ratio() : 1.0; + destination.asynchronous = source.asynchronous(); + destination.wait_timeout_ms = source.wait_timeout_ms(); + destination.poll_interval_ms = source.poll_interval_ms(); + destination.blocked_timeout_ms = source.blocked_timeout_ms(); + return destination; +} + +std::string stepPrefix( + const int index, + const api::ActionStep& step) +{ + std::string prefix = "step " + std::to_string(index); + if (!step.step_id().empty()) { + prefix += " (" + step.step_id() + ")"; + } + return prefix + ": "; +} + +std::string canonicalRequest( + const api::ActionQueueCommand_Request& request) +{ + api::ActionQueueCommand_Request normalized(request); + normalized.DiscardUnknownFields(); + for (auto& step : *normalized.mutable_steps()) { + switch (step.command_case()) { + case api::ActionStep::kArmMoveJ: + step.mutable_arm_move_j() + ->mutable_header()->clear_timestamp(); + break; + case api::ActionStep::kArmMoveL: + step.mutable_arm_move_l() + ->mutable_header()->clear_timestamp(); + break; + case api::ActionStep::kAgvNavigateToPose: + step.mutable_agv_navigate_to_pose() + ->mutable_header()->clear_timestamp(); + break; + case api::ActionStep::kAgvNavigateToStation: + step.mutable_agv_navigate_to_station() + ->mutable_header()->clear_timestamp(); + break; + case api::ActionStep::kAgvFollowPath: + step.mutable_agv_follow_path() + ->mutable_header()->clear_timestamp(); + break; + case api::ActionStep::kDelay: + case api::ActionStep::COMMAND_NOT_SET: + break; + } + } + + std::string serialized; + google::protobuf::io::StringOutputStream stream(&serialized); + google::protobuf::io::CodedOutputStream coded_stream(&stream); + coded_stream.SetSerializationDeterministic(true); + if (!normalized.SerializeToCodedStream(&coded_stream)) { + return {}; + } + coded_stream.Trim(); + return serialized; +} + +std::optional fingerprintRequest( + const api::ActionQueueCommand_Request& request) +{ + const std::string serialized = canonicalRequest(request); + if (serialized.empty()) { + return std::nullopt; + } + RequestFingerprint fingerprint; + fingerprint.serialized_size = serialized.size(); + constexpr std::array seeds{ + 0xa4093822299f31d0ULL, + 0x082efa98ec4e6c89ULL, + 0x452821e638d01377ULL, + 0xbe5466cf34e90c6cULL}; + for (std::size_t index = 0; index < seeds.size(); ++index) { + fingerprint.words[index] = stableHash(serialized, seeds[index]); + } + return fingerprint; +} + +std::string validateRequestEnvelope( + const api::ActionQueueCommand_Request& request) +{ + if (request.action_id().empty()) { + return "action_id is required"; + } + if (request.action_id().size() > kMaxIdentifierBytes) { + return "action_id is too long"; + } + if (request.expected_service_instance_id().empty()) { + return "expected_service_instance_id is required; obtain it from GetSystemInfo"; + } + if (request.expected_service_instance_id().size() > + kMaxIdentifierBytes) { + return "expected_service_instance_id is too long"; + } + if (request.steps().empty()) { + return "ActionQueue requires at least one step"; + } + if (static_cast(request.steps_size()) > kMaxSteps) { + return "ActionQueue exceeds the maximum step count"; + } + if (request.ByteSizeLong() > kMaxRequestBytes) { + return "ActionQueue request exceeds the 512 KiB application limit"; + } + if (request.total_timeout_ms() > + static_cast(kMaximumTimeout.count())) { + return "ActionQueue total timeout exceeds the server limit"; + } + return {}; +} + +ValidationResult validateRequest( + device::DeviceManager& device_manager, + const api::ActionQueueCommand_Request& request) +{ + ValidationResult result; + result.error = validateRequestEnvelope(request); + if (!result.error.empty()) { + return result; + } + + std::unordered_set step_ids; + std::set resources; + result.prepared.steps.reserve( + static_cast(request.steps_size())); + + for (int index = 0; index < request.steps_size(); ++index) { + result.failed_step_index = index; + const auto& step = request.steps(index); + const std::string prefix = stepPrefix(index, step); + if (step.step_id().empty()) { + result.error = prefix + "step_id is required"; + return result; + } + if (step.step_id().size() > kMaxIdentifierBytes) { + result.error = prefix + "step_id is too long"; + return result; + } + if (!step_ids.emplace(step.step_id()).second) { + result.error = prefix + "step_id must be unique"; + return result; + } + if (step.timeout_ms() > + static_cast(kMaximumTimeout.count())) { + result.error = prefix + "timeout exceeds the server limit"; + return result; + } + + PreparedStep prepared; + std::string options_error; + switch (step.command_case()) { + case api::ActionStep::kArmMoveJ: { + prepared.kind = PreparedStepKind::ArmMoveJ; + const auto& command = step.arm_move_j(); + prepared.device_id = command.header().device_id(); + if (prepared.device_id.empty()) { + result.error = prefix + "RobotArm device_id is required"; + return result; + } + prepared.arm = device_manager.getDevice( + prepared.device_id); + if (!prepared.arm) { + result.error = prefix + "RobotArm device not found: " + + prepared.device_id; + return result; + } + if (!prepared.arm->supportsActionQueueMotion()) { + result.error = prefix + + "RobotArm backend does not support safe ActionQueue motion: " + + prepared.device_id; + return result; + } + if (!validArmOptions(command.options(), options_error)) { + result.error = prefix + options_error; + return result; + } + const auto dof = prepared.arm->getDof(); + if (dof == 0U || command.target().position_size() != + static_cast(dof)) { + result.error = prefix + + "MoveJ target size does not match RobotArm DOF"; + return result; + } + if (!command.options().joint_velocity_limits().empty() && + command.options().joint_velocity_limits_size() != + static_cast(dof)) { + result.error = prefix + + "MoveJ joint velocity limit size does not match RobotArm DOF"; + return result; + } + for (const double position : command.target().position()) { + if (!finite(position)) { + result.error = prefix + + "MoveJ target must contain finite values"; + return result; + } + } + resources.emplace(prepared.device_id); + break; + } + case api::ActionStep::kArmMoveL: { + prepared.kind = PreparedStepKind::ArmMoveL; + const auto& command = step.arm_move_l(); + prepared.device_id = command.header().device_id(); + if (prepared.device_id.empty()) { + result.error = prefix + "RobotArm device_id is required"; + return result; + } + prepared.arm = device_manager.getDevice( + prepared.device_id); + if (!prepared.arm) { + result.error = prefix + "RobotArm device not found: " + + prepared.device_id; + return result; + } + if (!prepared.arm->supportsActionQueueMotion()) { + result.error = prefix + + "RobotArm backend does not support safe ActionQueue motion: " + + prepared.device_id; + return result; + } + if (!validArmOptions(command.options(), options_error)) { + result.error = prefix + options_error; + return result; + } + if (!api::ArmFrameType_IsValid(command.frame())) { + result.error = prefix + "MoveL frame is invalid"; + return result; + } + if (command.frame() != api::ARM_FRAME_BASE) { + result.error = prefix + + "ActionQueue MoveL currently supports the Base frame only"; + return result; + } + const auto dof = prepared.arm->getDof(); + if (!command.options().joint_velocity_limits().empty() && + command.options().joint_velocity_limits_size() != + static_cast(dof)) { + result.error = prefix + + "MoveL joint velocity limit size does not match RobotArm DOF"; + return result; + } + const auto& target = command.target(); + if (!finite(target.x()) || !finite(target.y()) || + !finite(target.z()) || !finite(target.rx()) || + !finite(target.ry()) || !finite(target.rz())) { + result.error = prefix + + "MoveL target must contain finite values"; + return result; + } + resources.emplace(prepared.device_id); + break; + } + case api::ActionStep::kAgvNavigateToPose: { + prepared.kind = PreparedStepKind::AgvNavigateToPose; + const auto& command = step.agv_navigate_to_pose(); + prepared.device_id = command.header().device_id(); + if (prepared.device_id.empty()) { + result.error = prefix + "AGV device_id is required"; + return result; + } + prepared.agv = device_manager.getDevice( + prepared.device_id); + if (!prepared.agv) { + result.error = prefix + "AGV device not found: " + + prepared.device_id; + return result; + } + if (!prepared.agv->supportsSynchronousAction( + device::AgvActionKind::NavigateToPose)) { + result.error = prefix + + "AGV backend cannot confirm synchronous pose navigation: " + + prepared.device_id; + return result; + } + if (!validAgvOptions(command.options(), options_error)) { + result.error = prefix + options_error; + return result; + } + if (!finite(command.pose().x()) || + !finite(command.pose().y()) || + !finite(command.pose().theta())) { + result.error = prefix + + "AGV pose must contain finite values"; + return result; + } + resources.emplace(prepared.device_id); + break; + } + case api::ActionStep::kAgvNavigateToStation: { + prepared.kind = PreparedStepKind::AgvNavigateToStation; + const auto& command = step.agv_navigate_to_station(); + prepared.device_id = command.header().device_id(); + if (prepared.device_id.empty()) { + result.error = prefix + "AGV device_id is required"; + return result; + } + if (command.station_id().empty()) { + result.error = prefix + "AGV station_id is required"; + return result; + } + prepared.agv = device_manager.getDevice( + prepared.device_id); + if (!prepared.agv) { + result.error = prefix + "AGV device not found: " + + prepared.device_id; + return result; + } + if (!prepared.agv->supportsSynchronousAction( + device::AgvActionKind::NavigateToStation)) { + result.error = prefix + + "AGV backend cannot confirm synchronous station navigation: " + + prepared.device_id; + return result; + } + if (!validAgvOptions(command.options(), options_error)) { + result.error = prefix + options_error; + return result; + } + resources.emplace(prepared.device_id); + break; + } + case api::ActionStep::kAgvFollowPath: { + prepared.kind = PreparedStepKind::AgvFollowPath; + const auto& command = step.agv_follow_path(); + prepared.device_id = command.header().device_id(); + if (prepared.device_id.empty()) { + result.error = prefix + "AGV device_id is required"; + return result; + } + if (command.path().empty()) { + result.error = prefix + "AGV path must not be empty"; + return result; + } + if (static_cast(command.path_size()) > + kMaxPathSegments) { + result.error = prefix + "AGV path is too large"; + return result; + } + for (const auto& segment : command.path()) { + if (segment.source_station().empty() || + segment.target_station().empty()) { + result.error = prefix + + "AGV path station ids must not be empty"; + return result; + } + } + prepared.agv = device_manager.getDevice( + prepared.device_id); + if (!prepared.agv) { + result.error = prefix + "AGV device not found: " + + prepared.device_id; + return result; + } + if (!prepared.agv->supportsSynchronousAction( + device::AgvActionKind::FollowPath)) { + result.error = prefix + + "AGV backend cannot confirm synchronous path navigation: " + + prepared.device_id; + return result; + } + if (!validAgvOptions(command.options(), options_error)) { + result.error = prefix + options_error; + return result; + } + resources.emplace(prepared.device_id); + break; + } + case api::ActionStep::kDelay: + prepared.kind = PreparedStepKind::Delay; + if (step.delay().duration_ms() > + static_cast(kMaximumTimeout.count())) { + result.error = prefix + + "delay exceeds the server limit"; + return result; + } + break; + case api::ActionStep::COMMAND_NOT_SET: + result.error = prefix + "command is not set"; + return result; + } + result.prepared.steps.push_back(std::move(prepared)); + } + + result.prepared.resource_ids.assign( + resources.begin(), resources.end()); + result.failed_step_index = -1; + result.valid = true; + return result; +} + +device::AgvActionKind toAgvActionKind( + const PreparedStepKind kind) +{ + switch (kind) { + case PreparedStepKind::AgvNavigateToPose: + return device::AgvActionKind::NavigateToPose; + case PreparedStepKind::AgvNavigateToStation: + return device::AgvActionKind::NavigateToStation; + case PreparedStepKind::AgvFollowPath: + return device::AgvActionKind::FollowPath; + default: + return device::AgvActionKind::NavigateToPose; + } +} + +} // namespace + +struct ActionQueueExecutor::Impl { + enum class RunState { + Accepting, + PausedForStopAll, + ShuttingDown, + }; + + struct Record { + api::ActionQueueCommand_Request request; + RequestFingerprint fingerprint; + PreparedAction prepared; + safety::CommandActor actor; + Clock::time_point deadline; + std::atomic cancel_requested{false}; + std::atomic timed_out{false}; + // -1 means that no device step is currently inside a backend call. + // StopAll reads this without taking Record::mutex so it can preempt + // the physically active device before stopping the remaining action + // resources. + std::atomic active_step_index{-1}; + // Exact normal leases acquired for this execution. Typed-stop paths + // may convert only these generations into safety barriers, so a stale + // Action can never preempt a later command on the same device. + std::unordered_map + control_tokens; + // Fallback for an invariant or manager failure which prevents an exact + // lease from being converted into a permanent quarantine. + std::atomic retain_control_leases{false}; + std::mutex mutex; + std::condition_variable condition; + bool done{false}; + std::string stop_error; + api::ActionQueueCommand_Feedback feedback; + }; + + struct TerminalResult { + RequestFingerprint fingerprint; + api::ActionQueueCommand_Feedback feedback; + }; + + struct LeaseSet { + explicit LeaseSet(std::shared_ptr owner_record) + : record(std::move(owner_record)) + { + } + + ~LeaseSet() + { + if (record && record->retain_control_leases.load( + std::memory_order_acquire)) { + return; + } + auto& manager = + control::ControlAuthorityManager::instance(); + for (const auto& token : tokens) { + manager.release(token); + } + } + + const control::ControlLeaseToken* find( + const std::string& resource_id) const + { + const auto found = std::find_if( + tokens.begin(), tokens.end(), + [&resource_id](const auto& token) { + return token.resource_id == resource_id; + }); + return found == tokens.end() ? nullptr : &*found; + } + + std::vector tokens; + std::shared_ptr record; + }; + + struct SubmitterGuard { + explicit SubmitterGuard(std::atomic& value) + : count(value) + { + } + + ~SubmitterGuard() + { + count.fetch_sub(1U, std::memory_order_acq_rel); + } + + std::atomic& count; + }; + + struct DeduplicationFeedbackGuard { + ~DeduplicationFeedbackGuard() + { + feedback.set_deduplication_status(status); + } + + api::ActionQueueCommand_Feedback& feedback; + api::ActionDeduplicationStatus& status; + }; + + explicit Impl( + device::DeviceManager& manager, + const std::size_t accepted_action_limit) + : device_manager(manager), + instance_id(generateServiceInstanceId()), + max_accepted_action_ids( + validatedAcceptedActionLimit(accepted_action_limit)), + worker([this]() { workerLoop(); }) + { + } + + ~Impl() + { + shutdown(); + } + + void shutdown() + { + if (joined) { + return; + } + (void)disableForShutdown(); + if (worker.joinable()) { + worker.join(); + } + joined = true; + } + + void cancelAllLocked(std::shared_ptr& active_record) + { + for (const auto& record : queue) { + record->cancel_requested.store( + true, std::memory_order_release); + record->condition.notify_all(); + } + active_record = active; + if (active_record) { + active_record->cancel_requested.store( + true, std::memory_order_release); + active_record->condition.notify_all(); + } + } + + ActionQueueExecutor::StopAllTicket beginStopAll( + const bool delegate_active_stop) + { + ActionQueueExecutor::StopAllTicket ticket; + std::shared_ptr active_record; + { + std::lock_guard lock(mutex); + if (run_state == RunState::ShuttingDown) { + return ticket; + } + if (run_state == RunState::Accepting || + outstanding_stop_all_tickets.empty()) { + run_state = RunState::PausedForStopAll; + ++admission_generation; + ++stop_all_generation; + stop_all_failed = false; + } + ticket.generation = stop_all_generation; + ticket.ticket_id = ++next_stop_all_ticket_id; + outstanding_stop_all_tickets.emplace(ticket.ticket_id); + cancelAllLocked(active_record); + } + + if (delegate_active_stop) { + // finishStopAll(all_devices_stop_confirmed=true) is the external + // confirmation for the active Action device in this mode. + ticket.active_action_stop_confirmed = true; + } else { + try { + ticket.active_action_stop_confirmed = + requestTypedStop(active_record); + } catch (const std::exception& error) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] StopAll typed stop threw, error=" + << error.what(); + } catch (...) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] StopAll typed stop threw"; + } + } + queue_condition.notify_all(); + return ticket; + } + + bool finishStopAll( + const ActionQueueExecutor::StopAllTicket& ticket, + const bool all_devices_stop_confirmed) + { + std::lock_guard lock(mutex); + if (run_state != RunState::PausedForStopAll || + !ticket.valid() || + ticket.generation != stop_all_generation || + outstanding_stop_all_tickets.erase(ticket.ticket_id) == 0U) { + return false; + } + + const bool caller_confirmed = + ticket.active_action_stop_confirmed && + all_devices_stop_confirmed; + if (!caller_confirmed) { + stop_all_failed = true; + } + if (!outstanding_stop_all_tickets.empty()) { + return caller_confirmed; + } + if (stop_all_failed || !queue.empty() || active) { + stop_all_failed = true; + return false; + } + + run_state = RunState::Accepting; + return true; + } + + bool disableForShutdown() + { + std::shared_ptr active_record; + { + std::lock_guard lock(mutex); + if (run_state != RunState::ShuttingDown) { + run_state = RunState::ShuttingDown; + ++admission_generation; + ++stop_all_generation; + outstanding_stop_all_tickets.clear(); + stop_all_failed = true; + } + cancelAllLocked(active_record); + } + + bool stopped = false; + try { + stopped = requestTypedStop(active_record); + } catch (const std::exception& error) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] shutdown typed stop threw, error=" + << error.what(); + } catch (...) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] shutdown typed stop threw"; + } + queue_condition.notify_all(); + return stopped; + } + + static bool waitForArmIdle( + const std::shared_ptr& arm, + const Clock::duration timeout) + { + const auto deadline = Clock::now() + timeout; + while (Clock::now() < deadline) { + try { + if (!arm->busy()) { + return true; + } + } catch (...) { + return false; + } + std::this_thread::sleep_for( + kArmIdleConfirmationPollPeriod); + } + try { + return !arm->busy(); + } catch (...) { + return false; + } + } + + enum class FailClosedResult { + Quarantined, + AlreadyFenced, + LeaseRetained, + }; + + static FailClosedResult quarantineOrRetainLease( + const std::shared_ptr& record, + const control::ControlLeaseToken& expected_token) noexcept + { + auto& authority = + control::ControlAuthorityManager::instance(); + if (authority.quarantineIfCurrent(expected_token)) { + // LeaseSet must release the displaced handler token when it exits; + // that release is what makes this quarantine recoverable. + return FailClosedResult::Quarantined; + } + try { + if (!authority.validate(expected_token)) { + return FailClosedResult::AlreadyFenced; + } + } catch (...) { + } + + // No independently managed barrier could be confirmed. Retaining the + // exact Action lease is the last fail-closed fallback. + record->retain_control_leases.store( + true, std::memory_order_release); + return FailClosedResult::LeaseRetained; + } + + bool requestTypedStop(const std::shared_ptr& record) + { + if (!record) { + return true; + } + bool all_stopped = true; + std::unordered_set stopped_arms; + std::unordered_set stopped_agvs; + std::vector stop_order; + stop_order.reserve(record->prepared.steps.size()); + const int active_step_index = + record->active_step_index.load(std::memory_order_acquire); + if (active_step_index >= 0 && + static_cast(active_step_index) < + record->prepared.steps.size()) { + stop_order.push_back( + static_cast(active_step_index)); + } + for (std::size_t index = 0; + index < record->prepared.steps.size(); ++index) { + if (active_step_index >= 0 && + index == static_cast(active_step_index)) { + continue; + } + stop_order.push_back(index); + } + for (const std::size_t index : stop_order) { + const auto& step = record->prepared.steps[index]; + const bool is_arm = step.arm && + stopped_arms.emplace(step.device_id).second; + const bool is_agv = step.agv && + stopped_agvs.emplace(step.device_id).second; + if (!is_arm && !is_agv) { + continue; + } + auto& authority = + control::ControlAuthorityManager::instance(); + const std::string owner = + "grpc-system:action-cancel:" + + record->request.action_id() + ":" + + std::to_string( + sequence.fetch_add( + 1U, std::memory_order_relaxed) + 1U); + const auto ttl = std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + std::chrono::minutes(1)); + std::optional expected_token; + { + std::lock_guard lock(record->mutex); + const auto found = + record->control_tokens.find(step.device_id); + if (found != record->control_tokens.end()) { + expected_token = found->second; + } + } + if (!expected_token) { + // Cancellation may race an Action which is still waiting to + // acquire its device set. No Action-owned motion has been + // submitted in that state, so there is nothing to stop. + if (active_step_index >= 0) { + all_stopped = false; + record->retain_control_leases.store( + true, std::memory_order_release); + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] active device has no exact " + "control token; retaining Action leases, id=" + << step.device_id; + } + continue; + } + + control::ControlAcquireResult barrier; + try { + barrier = authority.preemptAcquireIfCurrent( + *expected_token, owner, ttl); + } catch (const std::exception& error) { + all_stopped = false; + (void)quarantineOrRetainLease(record, *expected_token); + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] could not establish typed stop " + "barrier; control remains quarantined, id=" + << step.device_id << ", error=" << error.what(); + continue; + } catch (...) { + all_stopped = false; + (void)quarantineOrRetainLease(record, *expected_token); + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] could not establish typed stop " + "barrier; control remains quarantined, id=" + << step.device_id; + continue; + } + if (!barrier.acquired) { + const auto fail_closed = + quarantineOrRetainLease(record, *expected_token); + if (fail_closed != FailClosedResult::AlreadyFenced) { + all_stopped = false; + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] exact typed stop barrier was " + "not established while the Action lease remained " + "current; control remains quarantined, id=" + << step.device_id + << ", detail=" << barrier.detail; + } + continue; + } + + bool stop_confirmed = false; + try { + if (is_arm) { + const auto result = step.arm->stopMotion(); + stop_confirmed = result.ok(); + if (!stop_confirmed) { + CMVR_LOG(WARNING) + << "[ActionQueueExecutor] typed RobotArm stop failed, id=" + << step.device_id << ", error=" << result.message; + stop_confirmed = waitForArmIdle( + step.arm, + kConcurrentArmStopConfirmationTimeout); + } + } else { + const auto cancel = step.agv->cancelNavigation(); + if (!cancel.ok()) { + CMVR_LOG(WARNING) + << "[ActionQueueExecutor] typed AGV cancel failed, id=" + << step.device_id << ", error=" << cancel.message; + } + const auto velocity_stop = + step.agv->stopVelocityControl(); + if (!velocity_stop.ok() && + velocity_stop.code != + device::AgvErrorCode::UnsupportedCommand) { + CMVR_LOG(WARNING) + << "[ActionQueueExecutor] typed AGV velocity stop failed, id=" + << step.device_id + << ", error=" << velocity_stop.message; + } + const auto stopped = + step.agv->confirmMotionStopped(); + stop_confirmed = stopped.ok(); + if (!stop_confirmed) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] AGV stopped state was " + "not confirmed, id=" + << step.device_id + << ", error=" << stopped.message; + } + } + } catch (const std::exception& error) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] typed stop threw, id=" + << step.device_id << ", error=" << error.what(); + } catch (...) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] typed stop threw, id=" + << step.device_id; + } + if (stop_confirmed) { + authority.release(barrier.token); + } else { + all_stopped = false; + if (!authority.retireSafetyHolder(barrier.token)) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] failed to retire an " + "unconfirmed typed-stop barrier, id=" + << step.device_id; + } + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] typed stop was not confirmed; " + "control remains quarantined, id=" + << step.device_id; + // Retain this safety holder fail-closed. A normal lease must + // not be admitted while the physical outcome is unknown. + } + } + return all_stopped; + } + + static bool waiterCanceled( + const std::function& waiter_canceled) noexcept + { + if (!waiter_canceled) { + return false; + } + try { + return waiter_canceled(); + } catch (...) { + // A broken waiter must not cancel an admitted edge action. End only + // this caller's wait and leave the worker-owned Record untouched. + return true; + } + } + + ActionQueueExecutor::WaitResult submitAndWait( + const api::ActionQueueCommand_Request& request, + api::ActionQueueCommand_Feedback& feedback, + const std::function& waiter_canceled, + safety::CommandActor actor) + { + api::ActionDeduplicationStatus deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_UNSPECIFIED; + DeduplicationFeedbackGuard deduplication_feedback{ + feedback, deduplication_status}; + const auto previous_submitters = concurrent_submitters.fetch_add( + 1U, std::memory_order_acq_rel); + if (previous_submitters >= kMaxConcurrentSubmitters) { + concurrent_submitters.fetch_sub(1U, std::memory_order_acq_rel); + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "ActionQueue has too many concurrent submitters"); + return ActionQueueExecutor::WaitResult::Terminal; + } + SubmitterGuard submitter_guard(concurrent_submitters); + + const std::string envelope_error = + validateRequestEnvelope(request); + if (!envelope_error.empty()) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + envelope_error); + return ActionQueueExecutor::WaitResult::Terminal; + } + if (request.expected_service_instance_id() != instance_id) { + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_SERVICE_INSTANCE_MISMATCH; + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "expected_service_instance_id does not match the active ActionQueue service instance; reconcile the prior action before submitting a new id"); + return ActionQueueExecutor::WaitResult::Terminal; + } + const auto fingerprint = fingerprintRequest(request); + if (!fingerprint) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "ActionQueue request could not be serialized"); + return ActionQueueExecutor::WaitResult::Terminal; + } + std::shared_ptr record; + const auto lookup_existing_locked = [&]() { + const auto found = records.find(request.action_id()); + if (found != records.end()) { + if (found->second->fingerprint != *fingerprint) { + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_ACTION_ID_CONFLICT; + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "action_id is already associated with a different request"); + return true; + } + record = found->second; + { + std::lock_guard record_lock(record->mutex); + deduplication_status = record->done + ? api::ACTION_DEDUPLICATION_STATUS_CACHED_RESULT + : api::ACTION_DEDUPLICATION_STATUS_JOINED_IN_FLIGHT; + } + return false; + } + + const auto terminal = terminal_results.find(request.action_id()); + if (terminal != terminal_results.end()) { + if (terminal->second.fingerprint != *fingerprint) { + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_ACTION_ID_CONFLICT; + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "action_id is already associated with a different request"); + } else { + feedback = terminal->second.feedback; + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_CACHED_RESULT; + } + return true; + } + + if (retired_action_ids.find(request.action_id()) != + retired_action_ids.end()) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "action_id was already completed but its result is no longer cached; it will not be re-executed"); + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_RESULT_EVICTED; + return true; + } + return false; + }; + + bool handled = false; + std::uint64_t observed_admission_generation = 0U; + std::uint64_t observed_system_admission_generation = 0U; + const bool initially_canceled = waiterCanceled(waiter_canceled); + { + auto system_admission = + globalStopAllAdmissionGate().lockAdmission(); + std::lock_guard lock(mutex); + handled = lookup_existing_locked(); + if (!handled && !record) { + if (!system_admission.accepting() || + run_state != RunState::Accepting) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + run_state == RunState::ShuttingDown + ? "ActionQueue is disabled because the service is shutting down" + : "ActionQueue is temporarily paused by StopAll"); + handled = true; + } else { + observed_admission_generation = admission_generation; + observed_system_admission_generation = + system_admission.generation(); + } + } + } + if (handled) { + return ActionQueueExecutor::WaitResult::Terminal; + } + if (record) { + return waitForRecord(record, feedback, waiter_canceled); + } + if (initially_canceled) { + return ActionQueueExecutor::WaitResult::CanceledBeforeAdmission; + } + + const auto validation = validateRequest(device_manager, request); + if (!validation.valid) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + validation.error, + validation.failed_step_index); + return ActionQueueExecutor::WaitResult::Terminal; + } + const auto total_timeout = request.total_timeout_ms() == 0U + ? kDefaultTotalTimeout + : Milliseconds(request.total_timeout_ms()); + auto candidate = std::make_shared(); + candidate->request = request; + candidate->fingerprint = *fingerprint; + candidate->prepared = validation.prepared; + candidate->actor = std::move(actor); + candidate->deadline = Clock::now() + total_timeout; + + const bool canceled_before_admission = + waiterCanceled(waiter_canceled); + bool canceled_without_record = false; + { + auto system_admission = + globalStopAllAdmissionGate().lockAdmission(); + std::lock_guard lock(mutex); + handled = lookup_existing_locked(); + if (!handled && !record && canceled_before_admission) { + canceled_without_record = true; + } else if (!handled && !record && + (!system_admission.accepting() || + system_admission.generation() != + observed_system_admission_generation || + run_state != RunState::Accepting || + admission_generation != + observed_admission_generation)) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + run_state == RunState::ShuttingDown + ? "ActionQueue is disabled because the service is shutting down" + : "ActionQueue admission was interrupted by StopAll; retry after StopAll completes"); + handled = true; + } else if (!handled && !record && + queue.size() + (active ? 1U : 0U) >= + kMaxQueuedActions) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "ActionQueue is full"); + handled = true; + } else if (!handled && !record && + records.size() + terminal_results.size() + + retired_action_ids.size() >= + max_accepted_action_ids) { + fillTerminalFeedback( + feedback, request.action_id(), + api::ACTION_RESULT_CODE_REJECTED, 0, + "ActionQueue idempotency ledger capacity is exhausted; restart with a new service instance only after reconciling prior actions"); + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_LEDGER_EXHAUSTED; + handled = true; + } else if (!handled && !record) { + record = std::move(candidate); + const auto inserted = + records.emplace(request.action_id(), record); + if (!inserted.second) { + throw std::logic_error( + "ActionQueue admission record already exists"); + } + try { + queue.push_back(record); + } catch (...) { + // No other thread can observe the record while the queue + // mutex is held. Roll it back so a failed deque allocation + // cannot leave an ID which waits forever without work. + records.erase(inserted.first); + record.reset(); + throw; + } + deduplication_status = + api::ACTION_DEDUPLICATION_STATUS_ACCEPTED_NEW; + queue_condition.notify_one(); + } + } + if (handled) { + return ActionQueueExecutor::WaitResult::Terminal; + } + if (record) { + return waitForRecord(record, feedback, waiter_canceled); + } + if (canceled_without_record) { + return ActionQueueExecutor::WaitResult::CanceledBeforeAdmission; + } + return waitForRecord(record, feedback, waiter_canceled); + } + + static ActionQueueExecutor::WaitResult waitForRecord( + const std::shared_ptr& record, + api::ActionQueueCommand_Feedback& feedback, + const std::function& waiter_canceled) + { + std::unique_lock lock(record->mutex); + if (!waiter_canceled) { + record->condition.wait(lock, [&record]() { + return record->done; + }); + feedback = record->feedback; + return ActionQueueExecutor::WaitResult::Terminal; + } + + for (;;) { + if (record->done) { + feedback = record->feedback; + return ActionQueueExecutor::WaitResult::Terminal; + } + lock.unlock(); + if (waiterCanceled(waiter_canceled)) { + return ActionQueueExecutor::WaitResult::CanceledAfterAdmission; + } + lock.lock(); + record->condition.wait_for( + lock, + kWaiterCancellationPollPeriod, + [&record]() { return record->done; }); + } + } + + bool waitForIdle(const Milliseconds timeout) + { + std::unique_lock lock(mutex); + return idle_condition.wait_for(lock, timeout, [this]() { + return queue.empty() && !active; + }); + } + + void workerLoop() + { + for (;;) { + std::shared_ptr record; + { + std::unique_lock lock(mutex); + queue_condition.wait(lock, [this]() { + return run_state == RunState::ShuttingDown || + !queue.empty(); + }); + if (run_state == RunState::ShuttingDown && queue.empty()) { + return; + } + record = queue.front(); + queue.pop_front(); + active = record; + } + + try { + execute(record); + } catch (const std::exception& error) { + complete( + record, api::ACTION_RESULT_CODE_FAILED, 0, + std::string("ActionQueue worker failed: ") + + error.what()); + } catch (...) { + complete( + record, api::ACTION_RESULT_CODE_FAILED, 0, + "ActionQueue worker failed with an unknown exception"); + } + { + std::lock_guard lock(mutex); + if (active == record) { + active.reset(); + } + try { + TerminalResult terminal; + terminal.fingerprint = record->fingerprint; + { + std::lock_guard record_lock(record->mutex); + terminal.feedback = record->feedback; + } + const std::string action_id = + record->request.action_id(); + const auto live = records.find(action_id); + terminal_result_order.push_back(action_id); + try { + const auto inserted = terminal_results.emplace( + action_id, std::move(terminal)); + if (!inserted.second) { + throw std::logic_error( + "ActionQueue terminal result already exists"); + } + } catch (...) { + // Keep the full live record as the source of truth if + // the compact cache cannot be committed atomically. + terminal_result_order.pop_back(); + throw; + } + if (live != records.end()) { + records.erase(live); + } + while (terminal_result_order.size() > + kMaxTerminalResults) { + const std::string retired = + terminal_result_order.front(); + // Insert into the exact ledger before dropping the + // cached result. Allocation failure must retain the + // old result rather than create a replay window. + retired_action_ids.emplace(retired); + terminal_results.erase(retired); + terminal_result_order.pop_front(); + } + } catch (const std::exception& error) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] could not compact terminal " + "idempotency state; retaining existing state: " + << error.what(); + } catch (...) { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] could not compact terminal " + "idempotency state; retaining existing state"; + } + idle_condition.notify_all(); + } + } + } + + void complete( + const std::shared_ptr& record, + const api::ActionResultCode result, + const std::uint32_t completed_steps, + const std::string& message, + const int failed_step_index = -1) + { + { + std::lock_guard lock(record->mutex); + fillTerminalFeedback( + record->feedback, + record->request.action_id(), + result, + completed_steps, + message, + failed_step_index); + record->done = true; + } + record->condition.notify_all(); + } + + bool acquireLeases( + const std::shared_ptr& record, + LeaseSet& leases, + std::string& error) + { + auto& authority = + control::ControlAuthorityManager::instance(); + const std::string owner = + "grpc-system:action:" + record->request.action_id() + ":" + + std::to_string( + sequence.fetch_add(1U, std::memory_order_relaxed) + 1U); + const auto ttl = std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>(kControlLeaseTtl); + + while (Clock::now() < record->deadline) { + if (record->cancel_requested.load(std::memory_order_acquire)) { + error = "ActionQueue was canceled before device reservation"; + return false; + } + bool all_acquired = true; + std::string conflict; + for (const auto& resource_id : record->prepared.resource_ids) { + auto acquired = authority.tryAcquire( + resource_id, owner, ttl); + if (!acquired.acquired) { + all_acquired = false; + conflict = std::move(acquired.detail); + break; + } + leases.tokens.push_back(std::move(acquired.token)); + } + if (all_acquired) { + std::lock_guard record_lock(record->mutex); + record->control_tokens.clear(); + for (const auto& token : leases.tokens) { + record->control_tokens.emplace( + token.resource_id, token); + } + return true; + } + for (const auto& token : leases.tokens) { + authority.release(token); + } + leases.tokens.clear(); + error = conflict.empty() + ? "device control is unavailable" + : std::move(conflict); + + std::unique_lock record_lock(record->mutex); + const auto wake_at = std::min( + record->deadline, + Clock::now() + kLeaseRetryPeriod); + record->condition.wait_until( + record_lock, wake_at, [&record]() { + return record->cancel_requested.load( + std::memory_order_acquire); + }); + } + record->timed_out.store(true, std::memory_order_release); + error = "ActionQueue timed out while waiting for device control"; + return false; + } + + bool validateLeases(const LeaseSet& leases) const + { + auto& authority = + control::ControlAuthorityManager::instance(); + return std::all_of( + leases.tokens.begin(), leases.tokens.end(), + [&authority](const auto& token) { + return authority.validate(token); + }); + } + + bool validateDevicesIdle( + const std::shared_ptr& record, + std::string& error) const + { + std::unordered_set inspected_arms; + std::unordered_set inspected_agvs; + for (const auto& step : record->prepared.steps) { + if (step.arm && + inspected_arms.emplace(step.device_id).second && + step.arm->busy()) { + error = "RobotArm already has active motion before ActionQueue execution: " + + step.device_id; + return false; + } + if (!step.agv || + !inspected_agvs.emplace(step.device_id).second) { + continue; + } + const auto runtime = step.agv->runtimeState(); + const auto navigation = step.agv->navigationStatus(); + if (runtime.emergency_stopped || runtime.fault) { + error = "AGV is faulted or emergency-stopped before ActionQueue execution: " + + step.device_id; + return false; + } + if (runtime.moving || + navigation.state == device::AgvTaskState::Waiting || + navigation.state == device::AgvTaskState::Running || + navigation.state == device::AgvTaskState::Paused) { + error = "AGV already has active motion before ActionQueue execution: " + + step.device_id; + return false; + } + } + return true; + } + + Clock::time_point stepDeadline( + const std::shared_ptr& record, + const api::ActionStep& step) const + { + if (step.timeout_ms() == 0U) { + return record->deadline; + } + return std::min( + record->deadline, + Clock::now() + Milliseconds(step.timeout_ms())); + } + + void armTimeoutWatchdog( + const std::shared_ptr& record, + const PreparedStep& step, + const Clock::time_point deadline, + const std::shared_ptr>& disarmed, + const std::shared_ptr>& stop_started) + { + while (!disarmed->load(std::memory_order_acquire)) { + const auto now = Clock::now(); + if (now >= deadline) { + record->timed_out.store(true, std::memory_order_release); + requestTimedOutArmStop(record, step, stop_started); + record->condition.notify_all(); + return; + } + std::this_thread::sleep_for(std::min( + kArmWatchdogPollPeriod, + std::chrono::duration_cast(deadline - now))); + } + } + + void requestTimedOutArmStop( + const std::shared_ptr& record, + const PreparedStep& step, + const std::shared_ptr>& stop_started) + { + bool expected = false; + if (!stop_started->compare_exchange_strong( + expected, true, + std::memory_order_acq_rel, + std::memory_order_acquire)) { + return; + } + auto& authority = + control::ControlAuthorityManager::instance(); + const std::string owner = + "grpc-system:action-timeout:" + + record->request.action_id(); + const auto ttl = std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + std::chrono::minutes(1)); + std::optional expected_token; + { + std::lock_guard lock(record->mutex); + const auto found = record->control_tokens.find(step.device_id); + if (found != record->control_tokens.end()) { + expected_token = found->second; + } + } + if (!step.arm || !expected_token) { + record->retain_control_leases.store( + true, std::memory_order_release); + const std::string detail = + "could not establish timed-out RobotArm stop barrier: " + "the active Action lease is unavailable"; + { + std::lock_guard lock(record->mutex); + record->stop_error = detail; + } + CMVR_LOG(ERROR) << "[ActionQueueExecutor] " << detail + << ", id=" << step.device_id; + return; + } + + control::ControlAcquireResult barrier; + try { + barrier = authority.preemptAcquireIfCurrent( + *expected_token, owner, ttl); + } catch (...) { + (void)quarantineOrRetainLease(record, *expected_token); + throw; + } + if (!barrier.acquired) { + // A direct Stop or another Action stop may already have converted + // our lease. Do not join that barrier and, critically, do not + // preempt a successor which acquired control after it completed. + const auto fail_closed = + quarantineOrRetainLease(record, *expected_token); + if (fail_closed != FailClosedResult::AlreadyFenced) { + const std::string detail = + "could not establish timed-out RobotArm stop barrier " + "while the Action lease remained current: " + + barrier.detail; + { + std::lock_guard lock(record->mutex); + record->stop_error = detail; + } + CMVR_LOG(ERROR) << "[ActionQueueExecutor] " << detail + << ", id=" << step.device_id; + } + return; + } + bool stop_confirmed = false; + std::string stop_error; + try { + const auto stop = step.arm->stopMotion(); + stop_confirmed = stop.ok(); + if (!stop_confirmed) { + stop_error = stop.message.empty() + ? "RobotArm stop did not confirm idle" + : stop.message; + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] timed-out RobotArm stop failed, id=" + << step.device_id << ", error=" << stop.message; + } + } catch (const std::exception& error) { + stop_error = error.what(); + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] timed-out RobotArm stop threw, id=" + << step.device_id << ", error=" << error.what(); + } catch (...) { + stop_error = "RobotArm stop threw an unknown exception"; + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] timed-out RobotArm stop threw, id=" + << step.device_id; + } + if (!stop_confirmed) { + // A user Stop/StopAll may already own the driver termination state. + // In that case this second stop call is expected to be rejected. + // Keep our safety holder while waiting for the first owner to + // publish the driver's confirmed-idle state; only quarantine if + // that bounded confirmation also fails. + stop_confirmed = waitForArmIdle( + step.arm, + kConcurrentArmStopConfirmationTimeout); + } + if (stop_confirmed) { + authority.release(barrier.token); + } else { + // Deliberately retain the safety barrier when idle was not + // confirmed. Releasing it would allow a new command to overlap an + // unknown physical outcome. Retiring the token keeps the barrier + // fail-closed while allowing a later confirmed System StopAll + // recovery round to clear it. + (void)authority.retireSafetyHolder(barrier.token); + std::lock_guard lock(record->mutex); + record->stop_error = + "RobotArm stop was not confirmed; control remains quarantined: " + + stop_error; + } + } + + enum class StepOutcome { + Completed, + Rejected, + Failed, + Canceled, + TimedOut, + }; + + struct StepResult { + StepOutcome outcome{StepOutcome::Failed}; + std::string message; + }; + + safety::AdmissionResult admitStep( + const std::shared_ptr& record, + const PreparedStep& prepared, + const api::ActionStep& source, + const control::ControlLeaseToken& token, + const Clock::time_point deadline) + { + safety::AdmissionRequest request; + request.command = safetyDescriptorFor(prepared.kind); + request.actor = record->actor; + request.command_id = actionStepCommandId( + record->request.action_id(), source.step_id()); + request.device_id = prepared.device_id; + if (const auto* header = commandHeaderFor(source); + header && header->has_expected_device_generation()) { + request.expected_device_generation = + header->expected_device_generation(); + } + request.authority_generation = token.generation; + request.deadline = deadline; + return device_manager.safetyManager().admit(request); + } + + static std::string admissionFailure( + const safety::AdmissionDecision& decision) + { + return decision.detail.empty() + ? std::string("ActionQueue step safety admission was rejected: ") + + safety::toString(decision.reason) + : "ActionQueue step safety admission was rejected: " + + decision.detail; + } + + static std::string dispatchFailure( + const safety::HardwareCheckResult& result) + { + return result.detail.empty() + ? std::string("ActionQueue step final safety check failed: ") + + safety::toString(result.reason) + : "ActionQueue step final safety check failed: " + + result.detail; + } + + StepResult executeArmStep( + const std::shared_ptr& record, + const PreparedStep& prepared, + const api::ActionStep& source, + const control::ControlLeaseToken& token, + const Clock::time_point deadline) + { + auto& authority = + control::ControlAuthorityManager::instance(); + auto safety_admission = admitStep( + record, prepared, source, token, deadline); + if (!safety_admission.permit) { + return { + StepOutcome::Rejected, + admissionFailure(safety_admission.decision)}; + } + auto authority_dispatch = authority.tryBeginDispatch(token); + if (!authority_dispatch.acquired()) { + return { + StepOutcome::Canceled, + "RobotArm ActionQueue control was preempted before dispatch"}; + } + auto safety_dispatch = device_manager.safetyManager() + .beginDispatch(*safety_admission.permit); + if (!safety_dispatch.acquired()) { + return { + StepOutcome::Rejected, + dispatchFailure(safety_dispatch.hardwareCheck())}; + } + auto cancellation_requested = + [record, token, deadline, &authority]() { + return record->cancel_requested.load( + std::memory_order_acquire) || + Clock::now() >= deadline || + !authority.validate(token); + }; + + auto disarmed = std::make_shared>(false); + auto timeout_stop_started = + std::make_shared>(false); + std::thread watchdog( + [this, record, prepared, deadline, disarmed, + timeout_stop_started]() { + try { + armTimeoutWatchdog( + record, prepared, deadline, disarmed, + timeout_stop_started); + } catch (const std::exception& error) { + try { + std::lock_guard lock(record->mutex); + record->stop_error = + "RobotArm timeout watchdog failed: " + + std::string(error.what()); + } catch (...) { + } + try { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] RobotArm timeout " + "watchdog failed, id=" + << prepared.device_id + << ", error=" << error.what(); + } catch (...) { + } + } catch (...) { + try { + std::lock_guard lock(record->mutex); + record->stop_error = + "RobotArm timeout watchdog failed with an unknown exception"; + } catch (...) { + } + try { + CMVR_LOG(ERROR) + << "[ActionQueueExecutor] RobotArm timeout " + "watchdog failed, id=" + << prepared.device_id; + } catch (...) { + } + } + }); + + device::Result motion_result; + try { + if (prepared.kind == PreparedStepKind::ArmMoveJ) { + const auto& command = source.arm_move_j(); + device::JointPositionCommand target; + target.position.assign( + command.target().position().begin(), + command.target().position().end()); + auto options = toArmMotionOptions(command.options()); + options.cancellation_requested = cancellation_requested; + motion_result = prepared.arm->moveJ(target, options); + } else { + const auto& command = source.arm_move_l(); + const device::CartesianPose target{ + command.target().x(), command.target().y(), + command.target().z(), command.target().rx(), + command.target().ry(), command.target().rz()}; + auto options = toArmMotionOptions(command.options()); + options.cancellation_requested = cancellation_requested; + motion_result = prepared.arm->moveL( + target, options, toFrameType(command.frame())); + } + } catch (const std::exception& error) { + motion_result = device::Result::failure( + device::ArmErrorCode::CommandFailed, error.what()); + } catch (...) { + motion_result = device::Result::failure( + device::ArmErrorCode::CommandFailed, + "RobotArm command threw an unknown exception"); + } + + const bool expired = + record->timed_out.load(std::memory_order_acquire) || + Clock::now() >= deadline; + if (expired) { + // The device callback can observe the deadline and return before + // the watchdog gets scheduled. Preserve the invariant that every + // timed-out synchronous arm command goes through a typed Stop. + record->timed_out.store(true, std::memory_order_release); + requestTimedOutArmStop( + record, prepared, timeout_stop_started); + } + disarmed->store(true, std::memory_order_release); + if (watchdog.joinable()) { + watchdog.join(); + } + if (expired || + record->timed_out.load(std::memory_order_acquire)) { + std::string message = "RobotArm ActionQueue step timed out"; + { + std::lock_guard lock(record->mutex); + if (!record->stop_error.empty()) { + message += "; " + record->stop_error; + } + } + return {StepOutcome::TimedOut, + std::move(message)}; + } + if (record->cancel_requested.load(std::memory_order_acquire) || + !authority.validate(token)) { + std::string message = + "RobotArm ActionQueue step was canceled or preempted"; + if (!requestTypedStop(record)) { + message += + "; one or more Action devices did not confirm a stopped " + "state and remain quarantined"; + } + return {StepOutcome::Canceled, std::move(message)}; + } + if (!motion_result.ok()) { + std::string message = motion_result.message; + if (!requestTypedStop(record)) { + message += + "; one or more Action devices did not confirm a stopped " + "state and remain quarantined"; + } + return {StepOutcome::Failed, std::move(message)}; + } + return {StepOutcome::Completed, {}}; + } + + StepResult executeAgvStep( + const std::shared_ptr& record, + const PreparedStep& prepared, + const api::ActionStep& source, + const control::ControlLeaseToken& token, + const Clock::time_point deadline) + { + auto& authority = + control::ControlAuthorityManager::instance(); + auto safety_admission = admitStep( + record, prepared, source, token, deadline); + if (!safety_admission.permit) { + return { + StepOutcome::Rejected, + admissionFailure(safety_admission.decision)}; + } + auto authority_dispatch = authority.tryBeginDispatch(token); + if (!authority_dispatch.acquired()) { + return { + StepOutcome::Canceled, + "AGV ActionQueue control was preempted before dispatch"}; + } + auto safety_dispatch = device_manager.safetyManager() + .beginDispatch(*safety_admission.permit); + if (!safety_dispatch.acquired()) { + return { + StepOutcome::Rejected, + dispatchFailure(safety_dispatch.hardwareCheck())}; + } + auto cancellation_requested = + [record, token, deadline, &authority]() { + return record->cancel_requested.load( + std::memory_order_acquire) || + Clock::now() >= deadline || + !authority.validate(token); + }; + + device::AgvResult navigation_result; + try { + if (prepared.kind == PreparedStepKind::AgvNavigateToPose) { + const auto& command = source.agv_navigate_to_pose(); + auto options = toAgvMotionOptions(command.options()); + applyAgvDeadline(options, deadline); + options.cancellation_requested = cancellation_requested; + navigation_result = prepared.agv->navigateToPose( + {command.pose().x(), command.pose().y(), + command.pose().theta()}, + options, + toAgvAdapterParams(command.adapter_params())); + } else if (prepared.kind == + PreparedStepKind::AgvNavigateToStation) { + const auto& command = source.agv_navigate_to_station(); + auto options = toAgvMotionOptions(command.options()); + applyAgvDeadline(options, deadline); + options.cancellation_requested = cancellation_requested; + navigation_result = prepared.agv->navigateToStation( + command.station_id(), + options, + toAgvAdapterParams(command.adapter_params())); + } else { + const auto& command = source.agv_follow_path(); + std::vector path; + path.reserve(static_cast(command.path_size())); + for (const auto& segment : command.path()) { + path.push_back({ + segment.source_station(), + segment.target_station()}); + } + auto options = toAgvMotionOptions(command.options()); + applyAgvDeadline(options, deadline); + options.cancellation_requested = cancellation_requested; + navigation_result = prepared.agv->followPath(path, options); + } + } catch (const std::exception& error) { + navigation_result = device::AgvResult::failure( + device::AgvErrorCode::CommandFailed, error.what()); + } catch (...) { + navigation_result = device::AgvResult::failure( + device::AgvErrorCode::CommandFailed, + "AGV command threw an unknown exception"); + } + + const auto stopOrQuarantine = + [this, &record](std::string message) { + if (!requestTypedStop(record)) { + message += + "; one or more Action devices did not confirm a " + "stopped state and remain quarantined"; + } + return message; + }; + + if (Clock::now() >= deadline || + navigation_result.code == device::AgvErrorCode::Timeout) { + record->timed_out.store(true, std::memory_order_release); + return {StepOutcome::TimedOut, + stopOrQuarantine( + navigation_result.message.empty() + ? "AGV ActionQueue step timed out" + : navigation_result.message)}; + } + if (record->cancel_requested.load(std::memory_order_acquire) || + !authority.validate(token) || + navigation_result.code == device::AgvErrorCode::TaskCanceled) { + return {StepOutcome::Canceled, + stopOrQuarantine( + navigation_result.message.empty() + ? "AGV ActionQueue step was canceled or preempted" + : navigation_result.message)}; + } + if (!navigation_result.ok()) { + return {StepOutcome::Failed, + stopOrQuarantine(navigation_result.message)}; + } + return {StepOutcome::Completed, {}}; + } + + static void applyAgvDeadline( + device::AgvMotionOptions& options, + const Clock::time_point deadline) + { + const auto remaining = std::max( + 1, + std::chrono::duration_cast( + deadline - Clock::now()).count()); + const int bounded = static_cast(std::min( + remaining, + std::numeric_limits::max())); + if (options.wait_timeout_ms <= 0 || + options.wait_timeout_ms > bounded) { + options.wait_timeout_ms = bounded; + } + if (options.poll_interval_ms > options.wait_timeout_ms) { + options.poll_interval_ms = options.wait_timeout_ms; + } + } + + StepResult executeDelay( + const std::shared_ptr& record, + const api::ActionStep& step, + const Clock::time_point deadline) + { + const auto delay_deadline = std::min( + deadline, + Clock::now() + Milliseconds(step.delay().duration_ms())); + std::unique_lock lock(record->mutex); + const bool canceled = record->condition.wait_until( + lock, delay_deadline, [&record]() { + return record->cancel_requested.load( + std::memory_order_acquire); + }); + if (canceled) { + return {StepOutcome::Canceled, + "ActionQueue delay was canceled"}; + } + if (Clock::now() >= deadline) { + record->timed_out.store(true, std::memory_order_release); + return {StepOutcome::TimedOut, + "ActionQueue delay timed out"}; + } + return {StepOutcome::Completed, {}}; + } + + void execute(const std::shared_ptr& record) + { + if (record->cancel_requested.load(std::memory_order_acquire)) { + complete(record, api::ACTION_RESULT_CODE_CANCELED, 0, + "ActionQueue was canceled before execution"); + return; + } + if (Clock::now() >= record->deadline) { + complete(record, api::ACTION_RESULT_CODE_TIMED_OUT, 0, + "ActionQueue expired while waiting in the queue"); + return; + } + + LeaseSet leases(record); + std::string lease_error; + if (!acquireLeases(record, leases, lease_error)) { + if (record->timed_out.load(std::memory_order_acquire)) { + complete(record, api::ACTION_RESULT_CODE_TIMED_OUT, 0, + lease_error); + } else { + complete(record, api::ACTION_RESULT_CODE_CANCELED, 0, + lease_error); + } + return; + } + if (!validateLeases(leases)) { + complete(record, api::ACTION_RESULT_CODE_CANCELED, 0, + "ActionQueue device control was preempted before execution"); + return; + } + + std::string dynamic_error; + if (!validateDevicesIdle(record, dynamic_error)) { + complete(record, api::ACTION_RESULT_CODE_REJECTED, 0, + dynamic_error); + return; + } + + std::uint32_t completed_steps = 0; + for (int index = 0; index < record->request.steps_size(); ++index) { + if (record->cancel_requested.load(std::memory_order_acquire) || + !validateLeases(leases)) { + complete( + record, api::ACTION_RESULT_CODE_CANCELED, + completed_steps, + "ActionQueue was canceled or device control was preempted"); + return; + } + if (Clock::now() >= record->deadline) { + complete( + record, api::ACTION_RESULT_CODE_TIMED_OUT, + completed_steps, + "ActionQueue total timeout elapsed"); + return; + } + + const auto& source = record->request.steps(index); + const auto& prepared = record->prepared.steps[ + static_cast(index)]; + const auto deadline = stepDeadline(record, source); + StepResult step_result; + if (prepared.kind == PreparedStepKind::Delay) { + record->active_step_index.store( + -1, std::memory_order_release); + step_result = executeDelay(record, source, deadline); + } else { + const auto* token = leases.find(prepared.device_id); + if (!token) { + complete( + record, api::ACTION_RESULT_CODE_FAILED, + completed_steps, + "ActionQueue internal device reservation is missing", + index); + return; + } + if (prepared.arm) { + record->active_step_index.store( + index, std::memory_order_release); + step_result = executeArmStep( + record, prepared, source, *token, deadline); + } else { + if (!prepared.agv->supportsSynchronousAction( + toAgvActionKind(prepared.kind))) { + complete( + record, api::ACTION_RESULT_CODE_REJECTED, + completed_steps, + "AGV ActionQueue capability changed before execution", + index); + return; + } + record->active_step_index.store( + index, std::memory_order_release); + step_result = executeAgvStep( + record, prepared, source, *token, deadline); + } + record->active_step_index.store( + -1, std::memory_order_release); + } + + switch (step_result.outcome) { + case StepOutcome::Completed: + ++completed_steps; + break; + case StepOutcome::Rejected: + complete( + record, api::ACTION_RESULT_CODE_REJECTED, + completed_steps, step_result.message, index); + return; + case StepOutcome::Failed: + complete( + record, api::ACTION_RESULT_CODE_FAILED, + completed_steps, step_result.message, index); + return; + case StepOutcome::Canceled: + complete( + record, api::ACTION_RESULT_CODE_CANCELED, + completed_steps, step_result.message, index); + return; + case StepOutcome::TimedOut: + complete( + record, api::ACTION_RESULT_CODE_TIMED_OUT, + completed_steps, step_result.message, index); + return; + } + } + + complete(record, api::ACTION_RESULT_CODE_COMPLETED, + completed_steps, {}); + CMVR_LOG(DEBUG) + << "[ActionQueueExecutor] action completed, id=" + << record->request.action_id() + << ", steps=" << completed_steps; + } + + device::DeviceManager& device_manager; + const std::string instance_id; + const std::size_t max_accepted_action_ids; + std::mutex mutex; + std::condition_variable queue_condition; + std::condition_variable idle_condition; + std::deque> queue; + std::unordered_map> records; + std::unordered_map terminal_results; + std::deque terminal_result_order; + std::unordered_set retired_action_ids; + std::shared_ptr active; + RunState run_state{RunState::Accepting}; + std::uint64_t admission_generation{1U}; + std::uint64_t stop_all_generation{0U}; + std::uint64_t next_stop_all_ticket_id{0U}; + std::unordered_set outstanding_stop_all_tickets; + bool stop_all_failed{false}; + bool joined{false}; + std::atomic sequence{0}; + std::atomic concurrent_submitters{0}; + std::thread worker; +}; + +ActionQueueExecutor::ActionQueueExecutor( + device::DeviceManager& device_manager, + const std::size_t max_accepted_action_ids) + : impl_(std::make_unique( + device_manager, max_accepted_action_ids)) +{ +} + +ActionQueueExecutor::~ActionQueueExecutor() = default; + +ActionQueueExecutor::WaitResult ActionQueueExecutor::submitAndWait( + const api::ActionQueueCommand_Request& request, + api::ActionQueueCommand_Feedback& feedback, + const std::function& waiter_canceled, + safety::CommandActor actor) +{ + const auto result = impl_->submitAndWait( + request, feedback, waiter_canceled, std::move(actor)); + feedback.set_service_instance_id(impl_->instance_id); + return result; +} + +ActionQueueExecutor::StopAllTicket ActionQueueExecutor::beginStopAll( + const bool delegate_active_stop) +{ + return impl_->beginStopAll(delegate_active_stop); +} + +bool ActionQueueExecutor::finishStopAll( + const StopAllTicket& ticket, + const bool all_devices_stop_confirmed) +{ + return impl_->finishStopAll( + ticket, all_devices_stop_confirmed); +} + +bool ActionQueueExecutor::disableForShutdown() +{ + return impl_->disableForShutdown(); +} + +bool ActionQueueExecutor::waitForIdle( + const std::chrono::milliseconds timeout) +{ + return impl_->waitForIdle(timeout); +} + +const std::string& ActionQueueExecutor::instanceId() const noexcept +{ + return impl_->instance_id; +} + +} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/client/CMakeLists.txt b/cmvr-es/service/grpc/client/CMakeLists.txt new file mode 100644 index 00000000..eac4e7e4 --- /dev/null +++ b/cmvr-es/service/grpc/client/CMakeLists.txt @@ -0,0 +1,16 @@ +find_package(Threads REQUIRED) + +add_library(arm_teleop_client STATIC + src/grpc_arm_teleop_client.cpp +) +target_compile_features(arm_teleop_client PUBLIC cxx_std_17) +target_include_directories(arm_teleop_client PUBLIC ${PROJECT_SOURCE_DIR}/cmvr-es) +target_link_libraries(arm_teleop_client + PUBLIC + cmvr_es::proto + PRIVATE + Threads::Threads +) + +add_library(cmvr_es::arm_teleop_client ALIAS arm_teleop_client) +install(TARGETS arm_teleop_client ARCHIVE DESTINATION lib) diff --git a/cmvr-es/service/grpc/include/grpc_agv_service.h b/cmvr-es/service/grpc/include/grpc_agv_service.h index 6ec4e65d..d6310d2d 100644 --- a/cmvr-es/service/grpc/include/grpc_agv_service.h +++ b/cmvr-es/service/grpc/include/grpc_agv_service.h @@ -73,6 +73,11 @@ public: const api::CommandHeader_Request* request, api::CommandHeader_Feedback* response) override; + + grpc::Status relocalize(grpc::ServerContext* context, + const api::AgvRelocalizeCommand_Request* request, + api::AgvRelocalizeCommand_Feedback* response) override; + private: device::DeviceManager& dmgr_; }; diff --git a/cmvr-es/service/grpc/server/include/grpc_system_service.h b/cmvr-es/service/grpc/server/include/grpc_system_service.h new file mode 100644 index 00000000..f6e8a3d5 --- /dev/null +++ b/cmvr-es/service/grpc/server/include/grpc_system_service.h @@ -0,0 +1,68 @@ +// +// Created by xtkuang on 2025/6/6. +// + +#ifndef GRPC_SYSTEM_SERVICE_H +#define GRPC_SYSTEM_SERVICE_H + +#include +#include + +#include "cmvr/api/system_service.grpc.pb.h" +#include "common/base/grpc_utils.h" +#include "manager/device_manager/include/device_manager.h" + +namespace cmvr::service +{ + class ActionQueueExecutor; + class RecoveryAuditSink; + class GrpcSafetyParticipantRegistration; + class GrpcSecurityGateway; + class StopOperationDispatcher; + + class gRPCSystemServiceImpl: public api::SystemService::Service { + public: + gRPCSystemServiceImpl(); + explicit gRPCSystemServiceImpl( + std::chrono::milliseconds stop_timeout); + explicit gRPCSystemServiceImpl( + std::shared_ptr security_gateway); + gRPCSystemServiceImpl( + std::chrono::milliseconds stop_timeout, + std::shared_ptr security_gateway); + gRPCSystemServiceImpl( + std::chrono::milliseconds stop_timeout, + std::shared_ptr security_gateway, + std::shared_ptr recovery_audit_sink); + ~gRPCSystemServiceImpl() override; + // Exposed only to synchronize lifecycle concurrency tests. + static bool waitForStopDispatcherDestructionForTesting( + std::chrono::milliseconds timeout); + // Called by GrpcServerTask before grpc::Server::Shutdown so accepted + // ActionQueue handlers can reach a terminal result and do not hold the + // synchronous server shutdown open indefinitely. + void prepareForShutdown(); + grpc::Status GetSystemInfo(grpc::ServerContext* context, const api::GetSystemInfoCommand_Request* request, api::GetSystemInfoCommand_Feedback* response) override; + grpc::Status GetSystemStatus(grpc::ServerContext* context, const api::GetSystemStatusCommand_Request* request, api::GetSystemStatusCommand_Feedback* response) override; + grpc::Status GetDeviceList(grpc::ServerContext* context, const api::GetDeviceListCommand_Request* request, api::GetDeviceListCommand_Feedback* response) override; + grpc::Status UpdateParams(grpc::ServerContext* context, const cmvr::api::UpdateParamsCommand_Request* request, cmvr::api::UpdateParamsCommand_Feedback* response) override; + grpc::Status StopAll(grpc::ServerContext* context, const cmvr::api::StopAllCommand_Request* request, cmvr::api::StopAllCommand_Feedback* response) override; + grpc::Status ExecuteActionQueue(grpc::ServerContext* context, const cmvr::api::ActionQueueCommand_Request* request, cmvr::api::ActionQueueCommand_Feedback* response) override; + grpc::Status GetSafetyState(grpc::ServerContext* context, const cmvr::api::GetSafetyStateCommand_Request* request, cmvr::api::GetSafetyStateCommand_Feedback* response) override; + grpc::Status RecoverSafetyState(grpc::ServerContext* context, const cmvr::api::RecoverSafetyStateCommand_Request* request, cmvr::api::RecoverSafetyStateCommand_Feedback* response) override; + grpc::Status RestoreOperationalState(grpc::ServerContext* context, const cmvr::api::RestoreOperationalStateCommand_Request* request, cmvr::api::RestoreOperationalStateCommand_Feedback* response) override; + private: + device::DeviceManager& dmgr_; + const std::chrono::milliseconds stop_timeout_; + std::shared_ptr security_gateway_; + std::shared_ptr recovery_audit_sink_; + // Process instances share running jobs through a lifecycle registry. + // The last service owner joins every worker before replacement. + std::shared_ptr stop_dispatcher_; + std::shared_ptr action_queue_; + std::unique_ptr + safety_participant_registration_; + }; +} + +#endif //GRPC_SYSTEM_SERVICE_H diff --git a/cmvr-es/service/grpc/server/src/grpc_agv_service.cpp b/cmvr-es/service/grpc/server/src/grpc_agv_service.cpp new file mode 100644 index 00000000..790d72ae --- /dev/null +++ b/cmvr-es/service/grpc/server/src/grpc_agv_service.cpp @@ -0,0 +1,1363 @@ +#include "service/grpc/server/include/grpc_agv_service.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "common/base/logging/logger.h" +#include "manager/control_authority_manager/include/control_authority_manager.h" +#include "service/grpc/server/include/grpc_command_transaction.h" +#include "service/grpc/server/include/grpc_security.h" +#include "service/grpc/stop_all/include/stop_all_admission_gate.h" + +using google::protobuf::util::TimeUtil; + +namespace cmvr::service { + +namespace { + +void fillFeedback(api::CommandHeader_Feedback* feedback, + const bool success, + const std::string& message = {}) +{ + feedback->set_success(success); + feedback->set_error_message(message); + *feedback->mutable_timestamp() = TimeUtil::GetCurrentTime(); +} + +grpc::Status resultToStatus(const device::AgvResult& result) +{ + if (result.ok()) { + return grpc::Status::OK; + } + switch (result.code) { + case device::AgvErrorCode::InvalidArgument: + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + result.message); + case device::AgvErrorCode::TaskCanceled: + return grpc::Status( + grpc::StatusCode::CANCELLED, + result.message); + case device::AgvErrorCode::Timeout: + return grpc::Status( + grpc::StatusCode::DEADLINE_EXCEEDED, + result.message); + default: + return grpc::Status( + grpc::StatusCode::INTERNAL, + result.message); + } +} + +template +grpc::Status setResponseResult(Response* response, const device::AgvResult& result) +{ + fillFeedback(response->mutable_header(), result.ok(), result.ok() ? "" : result.message); + return resultToStatus(result); +} + +grpc::Status setResponseResult(api::CommandHeader_Feedback* response, const device::AgvResult& result) +{ + fillFeedback(response, result.ok(), result.ok() ? "" : result.message); + return resultToStatus(result); +} + +template +grpc::Status setDeviceNotFound(Response* response, const std::string& device_id) +{ + const std::string message = "AGV device not found: " + device_id; + fillFeedback(response->mutable_header(), false, message); + return grpc::Status(grpc::StatusCode::NOT_FOUND, message); +} + +grpc::Status setDeviceNotFound(api::CommandHeader_Feedback* response, const std::string& device_id) +{ + const std::string message = "AGV device not found: " + device_id; + fillFeedback(response, false, message); + return grpc::Status(grpc::StatusCode::NOT_FOUND, message); +} + +grpc::Status setControlLeaseConflict( + api::CommandHeader_Feedback* response, + const std::string& device_id, + const std::string& detail) +{ + const std::string message = + "AGV control is leased by another active control operation: " + + device_id; + if (!detail.empty()) { + CMVR_LOG(WARNING) << "[gRPCAgvServiceImpl] control lease conflict, id=" + << device_id << ", detail=" << detail; + } + fillFeedback(response, false, message); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, message); +} + +template +grpc::Status setControlLeaseConflict( + Response* response, + const std::string& device_id, + const std::string& detail) +{ + return setControlLeaseConflict( + response->mutable_header(), device_id, detail); +} + +grpc::Status setStopAllRejected( + api::CommandHeader_Feedback* response, + const std::string& device_id) +{ + const std::string message = + "AGV control is temporarily paused by StopAll: " + device_id; + fillFeedback(response, false, message); + return grpc::Status(grpc::StatusCode::UNAVAILABLE, message); +} + +template +grpc::Status setStopAllRejected( + Response* response, + const std::string& device_id) +{ + return setStopAllRejected(response->mutable_header(), device_id); +} + +class ScopedUnaryAgvControlLease final { +public: + ScopedUnaryAgvControlLease( + const std::string& device_id, + const char* operation, + const bool preemptive = false) + : manager_(control::ControlAuthorityManager::instance()) + { + static std::atomic sequence{0}; + const std::string owner = + std::string(preemptive + ? "grpc-agv-safety:" + : "grpc-agv-unary:") + + operation + ":" + + std::to_string( + sequence.fetch_add( + 1U, std::memory_order_relaxed) + + 1U); + const auto ttl = std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + std::chrono::hours(24)); + control::ControlAcquireResult acquired; + if (preemptive) { + acquired = manager_.preemptAcquire(device_id, owner, ttl); + } else { + auto admission = + globalStopAllAdmissionGate().lockAdmission(); + if (!admission.accepting()) { + rejected_by_stop_all_ = true; + detail_ = "System StopAll admission is closed"; + return; + } + admission_generation_ = admission.generation(); + acquired = manager_.tryAcquire(device_id, owner, ttl); + } + acquired_ = acquired.acquired; + token_ = std::move(acquired.token); + detail_ = std::move(acquired.detail); + release_on_destroy_ = !preemptive; + } + + ~ScopedUnaryAgvControlLease() + { + if (release_on_destroy_) { + manager_.release(token_); + } else if (acquired_) { + (void)manager_.retireSafetyHolder(token_); + } + } + + bool acquired() const noexcept { return acquired_; } + bool rejectedByStopAll() const noexcept + { + return rejected_by_stop_all_; + } + const std::string& detail() const noexcept { return detail_; } + + bool waitForPreemptedRelease( + const control::ControlAuthorityManager::Duration timeout) + { + return manager_.waitForPreemptedRelease(token_, timeout); + } + + bool admissionCurrent() const + { + auto admission = globalStopAllAdmissionGate().lockAdmission(); + return admission.accepting() && + admission.generation() == admission_generation_; + } + + bool current() const + { + return manager_.validate(token_) && admissionCurrent(); + } + + std::function cancellationRequested( + grpc::ServerContext* context) const + { + const auto token = token_; + const auto admission_generation = admission_generation_; + return [context, token, admission_generation]() { + try { + if ((context && context->IsCancelled()) || + !control::ControlAuthorityManager::instance() + .validate(token)) { + return true; + } + auto admission = + globalStopAllAdmissionGate().lockAdmission(); + return !admission.accepting() || + admission.generation() != admission_generation; + } catch (...) { + return true; + } + }; + } + + control::ControlDispatchGuard tryBeginDispatch() + { + auto admission = globalStopAllAdmissionGate().lockAdmission(); + if (!admission.accepting() || + admission.generation() != admission_generation_) { + return {}; + } + return manager_.tryBeginDispatch(token_); + } + + void confirmSafeToRelease() noexcept { release_on_destroy_ = true; } + +private: + control::ControlAuthorityManager& manager_; + control::ControlLeaseToken token_; + std::string detail_; + bool acquired_{false}; + bool release_on_destroy_{true}; + bool rejected_by_stop_all_{false}; + std::uint64_t admission_generation_{0U}; +}; + +template +grpc::Status setControlAdmissionFailure( + Response* response, + const std::string& device_id, + const ScopedUnaryAgvControlLease& lease) +{ + return lease.rejectedByStopAll() + ? setStopAllRejected(response, device_id) + : setControlLeaseConflict(response, device_id, lease.detail()); +} + +template +grpc::Status setControlDispatchFailure( + Response* response, + const std::string& device_id, + const ScopedUnaryAgvControlLease& lease, + const char* operation) +{ + if (!lease.admissionCurrent()) { + return setStopAllRejected(response, device_id); + } + return setControlLeaseConflict( + response, + device_id, + std::string("control lease was preempted before ") + operation + + " dispatch"); +} + +template +grpc::Status executeConfirmedAgvStop( + Response* response, + const std::shared_ptr& agv, + ScopedUnaryAgvControlLease& control_barrier, + const char* operation_name, + Operation&& operation) +{ + try { + const auto initial_stop = operation(); + if (!initial_stop.ok()) { + return setResponseResult(response, initial_stop); + } + + constexpr auto handler_release_timeout = std::chrono::seconds(15); + if (!control_barrier.waitForPreemptedRelease( + std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + handler_release_timeout))) { + return setResponseResult( + response, + device::AgvResult::failure( + device::AgvErrorCode::Timeout, + std::string(operation_name) + + " timed out waiting for the preempted control handler to exit")); + } + + const auto final_stop = operation(); + if (!final_stop.ok()) { + return setResponseResult(response, final_stop); + } + + const auto stopped = agv->confirmMotionStopped(); + if (!stopped.ok()) { + std::string message = std::string(operation_name) + + " did not reach a confirmed stopped state: " + + stopped.message; + return setResponseResult( + response, + device::AgvResult::failure(stopped.code, message)); + } + control_barrier.confirmSafeToRelease(); + return setResponseResult(response, final_stop); + } catch (...) { + throw; + } +} + +template +grpc::Status setNavigationRequestCanceled(Response* response) +{ + constexpr char message[] = + "AGV navigation request was canceled before command dispatch"; + fillFeedback(response->mutable_header(), false, message); + return grpc::Status(grpc::StatusCode::CANCELLED, message); +} + +device::AgvAdapterParams toAdapterParams(const msgs::AgvAdapterParams& src) +{ + device::AgvAdapterParams dst; + for (const auto& [key, value] : src.values()) { + dst.values.emplace(key, value); + } + return dst; +} + +device::AgvMotionOptions toMotionOptions( + const msgs::AgvMotionOptions& src, + std::function cancellation_requested = {}) +{ + device::AgvMotionOptions dst; + dst.max_speed = src.max_speed(); + dst.max_angular_speed = src.max_angular_speed(); + dst.max_acceleration = src.max_acceleration(); + dst.max_angular_acceleration = src.max_angular_acceleration(); + dst.reach_distance = src.reach_distance(); + dst.reach_angle = src.reach_angle(); + dst.speed_ratio = src.speed_ratio() > 0.0 ? src.speed_ratio() : 1.0; + dst.asynchronous = src.asynchronous(); + dst.wait_timeout_ms = src.wait_timeout_ms(); + dst.poll_interval_ms = src.poll_interval_ms(); + dst.blocked_timeout_ms = src.blocked_timeout_ms(); + dst.cancellation_requested = std::move(cancellation_requested); + return dst; +} + +device::AgvVelocity toVelocity(const msgs::AgvVelocity& src) +{ + return {src.vx(), src.vy(), src.wz()}; +} + +device::AgvTranslation toTranslation(const msgs::AgvTranslation& src) +{ + return { + src.distance(), + src.vx(), + src.vy(), + static_cast(src.mode()) + }; +} + +device::AgvPathSegment toPathSegment(const msgs::AgvPathSegment& src) +{ + device::AgvPathSegment dst; + dst.source_station = src.source_station(); + dst.target_station = src.target_station(); + return dst; +} + +math::Pose2d toPose2d(const msgs::AgvPose2d& src) +{ + return {src.x(), src.y(), src.theta()}; +} + +device::AgvMapDimension toMapDimension(const msgs::AgvMapDimension src) +{ + switch (src) { + case msgs::AGV_MAP_2D: + return device::AgvMapDimension::Map2D; + case msgs::AGV_MAP_3D: + return device::AgvMapDimension::Map3D; + case msgs::AGV_MAP_2D_AND_3D: + return device::AgvMapDimension::Map2DAnd3D; + case msgs::AGV_MAP_DIMENSION_UNSPECIFIED: + default: + return device::AgvMapDimension::Unspecified; + } +} + +msgs::AgvMapDimension toProtoMapDimension(const device::AgvMapDimension src) +{ + switch (src) { + case device::AgvMapDimension::Map2D: + return msgs::AGV_MAP_2D; + case device::AgvMapDimension::Map3D: + return msgs::AGV_MAP_3D; + case device::AgvMapDimension::Map2DAnd3D: + return msgs::AGV_MAP_2D_AND_3D; + case device::AgvMapDimension::Unspecified: + default: + return msgs::AGV_MAP_DIMENSION_UNSPECIFIED; + } +} + +msgs::AgvMapUpdateType toProtoMapUpdateType(const device::AgvMapUpdateType src) +{ + switch (src) { + case device::AgvMapUpdateType::Snapshot: + return msgs::AGV_MAP_UPDATE_SNAPSHOT; + case device::AgvMapUpdateType::Incremental: + return msgs::AGV_MAP_UPDATE_INCREMENTAL; + case device::AgvMapUpdateType::Reset: + return msgs::AGV_MAP_UPDATE_RESET; + case device::AgvMapUpdateType::Unspecified: + default: + return msgs::AGV_MAP_UPDATE_UNSPECIFIED; + } +} + +msgs::AgvMapObjectType toProtoMapObjectType(const device::AgvMapObjectType src) +{ + switch (src) { + case device::AgvMapObjectType::Station: + return msgs::AGV_MAP_OBJECT_STATION; + case device::AgvMapObjectType::Line: + return msgs::AGV_MAP_OBJECT_LINE; + case device::AgvMapObjectType::Area: + return msgs::AGV_MAP_OBJECT_AREA; + case device::AgvMapObjectType::QrTag: + return msgs::AGV_MAP_OBJECT_QR_TAG; + case device::AgvMapObjectType::Reflector: + return msgs::AGV_MAP_OBJECT_REFLECTOR; + case device::AgvMapObjectType::BinLocation: + return msgs::AGV_MAP_OBJECT_BIN_LOCATION; + case device::AgvMapObjectType::ExternalDevice: + return msgs::AGV_MAP_OBJECT_EXTERNAL_DEVICE; + case device::AgvMapObjectType::Unspecified: + default: + return msgs::AGV_MAP_OBJECT_UNSPECIFIED; + } +} + +void fillPose2d(msgs::AgvPose2d* dst, const math::Pose2d& src) +{ + dst->set_x(src.x); + dst->set_y(src.y); + dst->set_theta(src.theta); +} + +void fillVelocity(msgs::AgvVelocity* dst, const device::AgvVelocity& src) +{ + dst->set_vx(src.vx); + dst->set_vy(src.vy); + dst->set_wz(src.wz); +} + +void fillBattery(msgs::AgvBatteryState* dst, const device::AgvBatteryState& src) +{ + dst->set_percentage(src.percentage); + dst->set_voltage(src.voltage); + dst->set_current(src.current); + dst->set_temperature(src.temperature); + dst->set_charging(src.charging); +} + +void fillRuntimeState(msgs::AgvRuntimeState* dst, const device::AgvRuntimeState& src) +{ + dst->set_timestamp(src.timestamp); + dst->set_mode(static_cast(src.mode)); + dst->set_connected(src.connected); + dst->set_localized(src.localized); + dst->set_moving(src.moving); + dst->set_fault(src.fault); + dst->set_emergency_stopped(src.emergency_stopped); + fillPose2d(dst->mutable_pose(), src.pose); + fillVelocity(dst->mutable_velocity(), src.velocity); + fillBattery(dst->mutable_battery(), src.battery); + dst->set_current_map(src.current_map); + dst->set_current_station(src.current_station); + dst->set_last_error(src.last_error); +} + +void fillNavigationStatus(msgs::AgvNavigationStatus* dst, const device::AgvNavigationStatus& src) +{ + dst->set_state(static_cast(src.state)); + dst->set_type(static_cast(src.type)); + dst->set_progress(src.progress); + dst->set_message(src.message); +} + +void fillStation(msgs::AgvStation* dst, const device::AgvStation& src) +{ + dst->set_id(src.id); + dst->set_type(src.type); + fillPose2d(dst->mutable_pose(), src.pose); + dst->set_description(src.description); +} + +void fillMapPoint3D(msgs::AgvMapPoint3D* dst, const device::AgvMapPoint3D& src) +{ + dst->set_x(src.x); + dst->set_y(src.y); + dst->set_z(src.z); +} + +void fillMapObject(msgs::AgvMapObject* dst, const device::AgvMapObject& src) +{ + dst->set_id(src.id); + dst->set_type(toProtoMapObjectType(src.type)); + for (const auto& point : src.points) { + fillMapPoint3D(dst->add_points(), point); + } + dst->set_heading(src.heading); + auto* properties = dst->mutable_properties(); + for (const auto& [key, value] : src.properties) { + (*properties)[key] = value; + } +} + +void fillUnifiedMap2D(msgs::AgvUnifiedMap2D* dst, const device::AgvUnifiedMap2D& src) +{ + dst->set_frame_id(src.frame_id); + dst->set_timestamp(src.timestamp); + dst->set_resolution(src.resolution); + dst->set_width(src.width); + dst->set_height(src.height); + fillPose2d(dst->mutable_origin(), src.origin); + for (const auto value : src.data) { + dst->add_data(value); + } + for (const auto& object : src.objects) { + fillMapObject(dst->add_objects(), object); + } +} + +void fillUnifiedMap3D(msgs::AgvUnifiedMap3D* dst, const device::AgvUnifiedMap3D& src) +{ + dst->set_frame_id(src.frame_id); + dst->set_timestamp(src.timestamp); + dst->set_voxel_resolution(src.voxel_resolution); + for (const auto& point : src.points) { + auto* dst_point = dst->add_points(); + dst_point->set_x(point.x); + dst_point->set_y(point.y); + dst_point->set_z(point.z); + dst_point->set_intensity(point.intensity); + dst_point->set_ring(point.ring); + dst_point->set_time_offset(point.time_offset); + } + for (const auto& voxel : src.voxels) { + auto* dst_voxel = dst->add_voxels(); + dst_voxel->set_x(voxel.x); + dst_voxel->set_y(voxel.y); + dst_voxel->set_z(voxel.z); + dst_voxel->set_probability(voxel.probability); + } + for (const auto& plane : src.planes) { + auto* dst_plane = dst->add_planes(); + fillMapPoint3D(dst_plane->mutable_center(), plane.center); + fillMapPoint3D(dst_plane->mutable_normal(), plane.normal); + dst_plane->set_d(plane.d); + dst_plane->set_radius(plane.radius); + } + for (const auto& object : src.objects) { + fillMapObject(dst->add_objects(), object); + } +} + +void fillUnifiedMapUpdate(msgs::AgvUnifiedMapUpdate* dst, const device::AgvUnifiedMapUpdate& src) +{ + dst->set_map_id(src.map_id); + dst->set_session_id(src.session_id); + dst->set_sequence(src.sequence); + dst->set_resume_token(src.resume_token); + dst->set_dimension(toProtoMapDimension(src.dimension)); + dst->set_update_type(toProtoMapUpdateType(src.update_type)); + dst->set_frame_id(src.frame_id); + dst->set_timestamp(src.timestamp); + dst->set_snapshot_begin(src.snapshot_begin); + dst->set_snapshot_end(src.snapshot_end); + dst->set_chunk_index(src.chunk_index); + dst->set_chunk_count(src.chunk_count); + if (src.map_2d) { + fillUnifiedMap2D(dst->mutable_map_2d(), *src.map_2d); + } else if (src.map_3d) { + fillUnifiedMap3D(dst->mutable_map_3d(), *src.map_3d); + } +} + +} // namespace + +gRPCAgvServiceImpl::gRPCAgvServiceImpl() + : gRPCAgvServiceImpl(makeDefaultGrpcSecurityGateway()) +{ +} + +gRPCAgvServiceImpl::gRPCAgvServiceImpl( + std::shared_ptr security_gateway) + : dmgr_(device::DeviceManager::getInstance()), + security_gateway_(security_gateway + ? std::move(security_gateway) + : makeDefaultGrpcSecurityGateway()) +{ +} + +grpc::Status gRPCAgvServiceImpl::getRuntimeState(grpc::ServerContext* context, + const api::AgvRuntimeStateCommand_Request* request, + api::AgvRuntimeStateCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.AgvService/getRuntimeState"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + fillRuntimeState(response->mutable_state(), agv->runtimeState()); + fillFeedback(response->mutable_header(), true); + return grpc::Status::OK; + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::getNavigationStatus(grpc::ServerContext* context, + const api::AgvNavigationStatusCommand_Request* request, + api::AgvNavigationStatusCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.AgvService/getNavigationStatus"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + fillNavigationStatus(response->mutable_status(), agv->navigationStatus()); + fillFeedback(response->mutable_header(), true); + return grpc::Status::OK; + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::emergencyStop(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/emergencyStop", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_barrier( + device_id, "emergencyStop", true); + if (!control_barrier.acquired()) { + return setControlLeaseConflict( + response, device_id, control_barrier.detail()); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return executeConfirmedAgvStop( + response, agv, control_barrier, "emergencyStop", + [&agv]() { return agv->emergencyStop(); }); + }); +} + +grpc::Status gRPCAgvServiceImpl::clearFault(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/clearFault", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "clearFault"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "clearFault"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->clearFault()); + }); +} + + + + + grpc::Status gRPCAgvServiceImpl::relocalize( + grpc::ServerContext* context, + const api::AgvRelocalizeCommand_Request* request, + api::AgvRelocalizeCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/relocalize", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + + ScopedUnaryAgvControlLease control_lease( + device_id, "relocalize"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "relocalize"); + } + + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + + return setResponseResult( + response, + agv->relocalize(toPose2d(request->pose()))); + }); +} + +grpc::Status gRPCAgvServiceImpl::navigateToPose(grpc::ServerContext* context, + const api::AgvNavigateToPoseCommand_Request* request, + api::AgvNavigateToPoseCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/navigateToPose", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + if (context && context->IsCancelled()) { + return setNavigationRequestCanceled(response); + } + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "navigateToPose"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "navigateToPose"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->navigateToPose( + toPose2d(request->pose()), + toMotionOptions( + request->options(), + control_lease.cancellationRequested(context)), + toAdapterParams(request->adapter_params()))); + }); +} + +grpc::Status gRPCAgvServiceImpl::navigateToStation(grpc::ServerContext* context, + const api::AgvNavigateToStationCommand_Request* request, + api::AgvNavigateToStationCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/navigateToStation", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + if (context && context->IsCancelled()) { + return setNavigationRequestCanceled(response); + } + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "navigateToStation"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, + "navigateToStation"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->navigateToStation( + request->station_id(), + toMotionOptions( + request->options(), + control_lease.cancellationRequested(context)), + toAdapterParams(request->adapter_params()))); + }); +} + +grpc::Status gRPCAgvServiceImpl::followPath(grpc::ServerContext* context, + const api::AgvFollowPathCommand_Request* request, + api::AgvFollowPathCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/followPath", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + if (context && context->IsCancelled()) { + return setNavigationRequestCanceled(response); + } + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "followPath"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "followPath"); + } + std::vector path; + path.reserve(static_cast(request->path_size())); + for (const auto& segment : request->path()) { + path.push_back(toPathSegment(segment)); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult( + response, + agv->followPath( + path, + toMotionOptions( + request->options(), + control_lease.cancellationRequested(context)))); + }); +} + + + +grpc::Status gRPCAgvServiceImpl::translate( + grpc::ServerContext* context, + const api::AgvTranslateCommand_Request* request, + api::AgvTranslateCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/translate", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + if (context && context->IsCancelled()) { + return setNavigationRequestCanceled(response); + } + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "translate"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "translate"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult( + response, + agv->translate(toTranslation(request->translation()))); + }); +} + + + +grpc::Status gRPCAgvServiceImpl::pauseNavigation(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/pauseNavigation", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "pauseNavigation"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, + "pauseNavigation"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->pauseNavigation()); + }); +} + +grpc::Status gRPCAgvServiceImpl::resumeNavigation(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/resumeNavigation", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "resumeNavigation"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, + "resumeNavigation"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->resumeNavigation()); + }); +} + +grpc::Status gRPCAgvServiceImpl::cancelNavigation(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/cancelNavigation", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_barrier( + device_id, "cancelNavigation", true); + if (!control_barrier.acquired()) { + return setControlLeaseConflict( + response, device_id, control_barrier.detail()); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return executeConfirmedAgvStop( + response, agv, control_barrier, "cancelNavigation", + [&agv]() { return agv->cancelNavigation(); }); + }); +} + +grpc::Status gRPCAgvServiceImpl::setVelocity(grpc::ServerContext* context, + const api::AgvSetVelocityCommand_Request* request, + api::AgvSetVelocityCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/setVelocity", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "setVelocity"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "setVelocity"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->setVelocity(toVelocity(request->velocity()))); + }); +} + +grpc::Status gRPCAgvServiceImpl::stopVelocityControl(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/stopVelocityControl", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_barrier( + device_id, "stopVelocityControl", true); + if (!control_barrier.acquired()) { + return setControlLeaseConflict( + response, device_id, control_barrier.detail()); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return executeConfirmedAgvStop( + response, agv, control_barrier, "stopVelocityControl", + [&agv]() { return agv->stopVelocityControl(); }); + }); +} + +grpc::Status gRPCAgvServiceImpl::listMaps(grpc::ServerContext* context, + const api::AgvListMapsCommand_Request* request, + api::AgvListMapsCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.AgvService/listMaps"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + std::vector maps; + const auto result = agv->listMaps(maps); + if (result.ok()) { + for (const auto& map : maps) { + response->add_maps(map); + } + } + return setResponseResult(response, result); + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::listStations(grpc::ServerContext* context, + const api::AgvListStationsCommand_Request* request, + api::AgvListStationsCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.AgvService/listStations"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + std::vector stations; + const auto result = agv->listStations(stations); + if (result.ok()) { + for (const auto& station : stations) { + fillStation(response->add_stations(), station); + } + } + return setResponseResult(response, result); + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::switchMap(grpc::ServerContext* context, + const api::AgvMapCommand_Request* request, + api::AgvMapCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/switchMap", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "switchMap"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "switchMap"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->switchMap(request->map_name())); + }); +} + +grpc::Status gRPCAgvServiceImpl::uploadMap(grpc::ServerContext* context, + const api::AgvMapCommand_Request* request, + api::AgvMapCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/uploadMap", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "uploadMap"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "uploadMap"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->uploadMap(request->map_name(), request->content())); + }); +} + +grpc::Status gRPCAgvServiceImpl::downloadMap(grpc::ServerContext* context, + const api::AgvMapCommand_Request* request, + api::AgvMapCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.AgvService/downloadMap"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + std::string content; + const auto result = agv->downloadMap(request->map_name(), content); + if (result.ok()) { + response->set_content(content); + } + return setResponseResult(response, result); + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::startMapping(grpc::ServerContext* context, + const api::AgvStartMappingCommand_Request* request, + api::AgvStartMappingCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/startMapping", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "startMapping"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "startMapping"); + } + device::AgvMappingOptions options; + options.dimension = toMapDimension(request->dimension()); + options.map_name = request->map_name(); + options.real_time = request->real_time(); + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = agv->startMapping(options); + if (result.ok()) { + response->set_session_id(device_id + "_mapping"); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCAgvServiceImpl::streamMap(grpc::ServerContext* context, + const api::AgvMapStreamCommand_Request* request, + grpc::ServerWriter* writer) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.AgvService/streamMap"); + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + + api::AgvMapStreamCommand_Feedback feedback; + if (!agv) { + const std::string message = "AGV device not found: " + device_id; + fillFeedback(feedback.mutable_header(), false, message); + writer->Write(feedback); + return grpc::Status(grpc::StatusCode::NOT_FOUND, message); + } + + device::AgvMapStreamOptions options; + options.dimension = toMapDimension(request->dimension()); + options.map_name = request->map_name(); + options.resume_token = request->resume_token(); + options.snapshot = request->snapshot(); + options.incremental = request->incremental(); + options.max_chunk_bytes = request->max_chunk_bytes(); + + std::uint64_t after_sequence = 0; + if (!request->resume_token().empty()) { + try { + after_sequence = static_cast(std::stoull(request->resume_token())); + } catch (...) { + after_sequence = 0; + } + } + + bool wrote_any = false; + while (!context->IsCancelled()) { + options.wait_timeout_ms = (!options.incremental && wrote_any) ? 20 : 1000; + device::AgvUnifiedMapUpdate update; + const auto result = agv->getUnifiedMapUpdate(after_sequence, options, update); + if (!result.ok()) { + if (result.code == device::AgvErrorCode::Timeout && wrote_any && !options.incremental) { + return grpc::Status::OK; + } + if (result.code == device::AgvErrorCode::Timeout && wrote_any && options.incremental) { + continue; + } + fillFeedback(feedback.mutable_header(), false, result.message); + writer->Write(feedback); + return resultToStatus(result); + } + + api::AgvMapStreamCommand_Feedback update_feedback; + fillFeedback(update_feedback.mutable_header(), true); + fillUnifiedMapUpdate(update_feedback.mutable_update(), update); + if (!writer->Write(update_feedback)) { + return grpc::Status(grpc::StatusCode::CANCELLED, "AGV map stream writer closed"); + } + wrote_any = true; + after_sequence = update.sequence; + options.resume_token.clear(); + } + + return grpc::Status(grpc::StatusCode::CANCELLED, "AGV map stream cancelled"); + } catch (const std::exception& e) { + api::AgvMapStreamCommand_Feedback feedback; + fillFeedback(feedback.mutable_header(), false, e.what()); + writer->Write(feedback); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCAgvServiceImpl::stopMapping(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.AgvService/stopMapping", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryAgvControlLease control_lease( + device_id, "stopMapping"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "stopMapping"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + return setResponseResult(response, agv->stopMapping()); + }); +} + +} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/src/grpc_arm_service.cpp b/cmvr-es/service/grpc/server/src/grpc_arm_service.cpp new file mode 100644 index 00000000..c1cb01f4 --- /dev/null +++ b/cmvr-es/service/grpc/server/src/grpc_arm_service.cpp @@ -0,0 +1,918 @@ +#include "service/grpc/server/include/grpc_arm_service.h" + +#include +#include +#include + +#include + +#include "common/base/logging/logger.h" +#include "manager/control_authority_manager/include/control_authority_manager.h" +#include "service/grpc/server/include/grpc_command_transaction.h" +#include "service/grpc/server/include/grpc_security.h" +#include "service/grpc/stop_all/include/stop_all_admission_gate.h" + +using google::protobuf::util::TimeUtil; + +namespace cmvr::service { + +namespace { + +void fillFeedback(api::CommandHeader_Feedback* feedback, + const bool success, + const std::string& message = {}) +{ + feedback->set_success(success); + feedback->set_error_message(message); + *feedback->mutable_timestamp() = TimeUtil::GetCurrentTime(); +} + +grpc::Status resultToStatus(const device::Result& result) +{ + if (result.ok()) { + return grpc::Status::OK; + } + return grpc::Status(grpc::StatusCode::INTERNAL, result.message); +} + +void logRpcSuccess(const char* rpc_name, const std::string& device_id) +{ + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (" << rpc_name + << "): success, id=" << device_id; +} + +device::FrameType toFrameType(const api::ArmFrameType frame) +{ + switch (frame) { + case api::ARM_FRAME_TOOL: + return device::FrameType::Tool; + case api::ARM_FRAME_WORLD: + return device::FrameType::World; + case api::ARM_FRAME_USER: + return device::FrameType::User; + case api::ARM_FRAME_BASE: + default: + return device::FrameType::Base; + } +} + +device::JointPositionCommand toJointPositionCommand(const api::JointPositionCommand& src) +{ + device::JointPositionCommand dst; + dst.position.assign(src.position().begin(), src.position().end()); + return dst; +} + +device::JointVelocityCommand toJointVelocityCommand(const api::JointVelocityCommand& src) +{ + device::JointVelocityCommand dst; + dst.velocity.assign(src.velocity().begin(), src.velocity().end()); + return dst; +} + +device::MotionOptions toMotionOptions( + const api::MotionOptions& src, + std::function cancellation_requested = {}) +{ + device::MotionOptions dst; + dst.velocity = src.velocity(); + dst.acceleration = src.acceleration(); + dst.blend_radius = src.blend_radius(); + dst.jerk = src.jerk() > 0.0 ? src.jerk() : 5.0; + dst.joint_velocity_limits.assign(src.joint_velocity_limits().begin(), + src.joint_velocity_limits().end()); + dst.asynchronous = src.asynchronous(); + dst.cancellation_requested = std::move(cancellation_requested); + return dst; +} + +device::CartesianPose toCartesianPose(const api::CartesianPose& src) +{ + return {src.x(), src.y(), src.z(), src.rx(), src.ry(), src.rz()}; +} + +api::CartesianPose toApiCartesianPose(const device::CartesianPose& src) +{ + api::CartesianPose dst; + dst.set_x(src.x); + dst.set_y(src.y); + dst.set_z(src.z); + dst.set_rx(src.rx); + dst.set_ry(src.ry); + dst.set_rz(src.rz); + return dst; +} + +device::CartesianVelocity toCartesianVelocity(const api::CartesianVelocity& src) +{ + return {src.vx(), src.vy(), src.vz(), src.wx(), src.wy(), src.wz()}; +} + +template +grpc::Status setResponseResult(Response* response, const device::Result& result) +{ + fillFeedback(response->mutable_header(), result.ok(), result.ok() ? "" : result.message); + return resultToStatus(result); +} + +grpc::Status setDeviceNotFound(api::CommandHeader_Feedback* response, const std::string& device_id) +{ + const std::string message = "RobotArm device not found: " + device_id; + fillFeedback(response, false, message); + return grpc::Status(grpc::StatusCode::NOT_FOUND, message); +} + +template +grpc::Status setDeviceNotFound(Response* response, const std::string& device_id) +{ + const std::string message = "RobotArm device not found: " + device_id; + fillFeedback(response->mutable_header(), false, message); + return grpc::Status(grpc::StatusCode::NOT_FOUND, message); +} + +grpc::Status setStopAllRejected( + api::CommandHeader_Feedback* response, + const std::string& device_id) +{ + const std::string message = + "RobotArm control is temporarily paused by StopAll: " + device_id; + fillFeedback(response, false, message); + return grpc::Status(grpc::StatusCode::UNAVAILABLE, message); +} + +template +grpc::Status setStopAllRejected( + Response* response, + const std::string& device_id) +{ + return setStopAllRejected(response->mutable_header(), device_id); +} + +grpc::Status setControlLeaseConflict( + api::CommandHeader_Feedback* response, + const std::string& device_id, + const std::string& detail) +{ + std::string message = + "RobotArm control is leased by another active control operation: " + + device_id; + if (!detail.empty()) { + CMVR_LOG(WARNING) << "[gRPCArmServiceImpl] control lease conflict, id=" + << device_id << ", detail=" << detail; + } + fillFeedback(response, false, message); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, message); +} + +template +grpc::Status setControlLeaseConflict( + Response* response, + const std::string& device_id, + const std::string& detail) +{ + return setControlLeaseConflict( + response->mutable_header(), device_id, detail); +} + +grpc::Status setControlCancelled( + api::CommandHeader_Feedback* response, + const std::string& device_id, + const std::string& reason) +{ + std::string message = "RobotArm control was cancelled: " + device_id; + if (!reason.empty()) { + message += ", " + reason; + } + fillFeedback(response, false, message); + return grpc::Status(grpc::StatusCode::CANCELLED, message); +} + +class ScopedUnaryControlLease final { +public: + ScopedUnaryControlLease( + const std::string& device_id, + const char* operation, + const bool preemptive = false) + : manager_(control::ControlAuthorityManager::instance()) + { + static std::atomic sequence{0}; + const std::string owner = + std::string("grpc-arm-unary:") + operation + ":" + + std::to_string( + sequence.fetch_add( + 1U, std::memory_order_relaxed) + + 1U); + const auto ttl = std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + std::chrono::hours(24)); + control::ControlAcquireResult acquired; + if (preemptive) { + acquired = manager_.preemptAcquire(device_id, owner, ttl); + } else { + auto admission = + globalStopAllAdmissionGate().lockAdmission(); + if (!admission.accepting()) { + rejected_by_stop_all_ = true; + detail_ = "System StopAll admission is closed"; + return; + } + admission_generation_ = admission.generation(); + acquired = manager_.tryAcquire(device_id, owner, ttl); + } + acquired_ = acquired.acquired; + token_ = std::move(acquired.token); + detail_ = std::move(acquired.detail); + release_on_destroy_ = !preemptive; + } + + ~ScopedUnaryControlLease() + { + if (release_on_destroy_) { + manager_.release(token_); + } else if (acquired_) { + (void)manager_.retireSafetyHolder(token_); + } + } + + bool acquired() const noexcept { return acquired_; } + bool rejectedByStopAll() const noexcept + { + return rejected_by_stop_all_; + } + const std::string& detail() const noexcept { return detail_; } + void confirmSafeToRelease() noexcept { release_on_destroy_ = true; } + + bool waitForPreemptedRelease( + const control::ControlAuthorityManager::Duration timeout) + { + return manager_.waitForPreemptedRelease(token_, timeout); + } + + bool admissionCurrent() const + { + auto admission = globalStopAllAdmissionGate().lockAdmission(); + return admission.accepting() && + admission.generation() == admission_generation_; + } + + bool current() const + { + return manager_.validate(token_) && admissionCurrent(); + } + + std::function cancellationRequested( + grpc::ServerContext* context) const + { + const auto token = token_; + const auto admission_generation = admission_generation_; + return [context, token, admission_generation]() { + try { + if ((context && context->IsCancelled()) || + !control::ControlAuthorityManager::instance() + .validate(token)) { + return true; + } + auto admission = + globalStopAllAdmissionGate().lockAdmission(); + return !admission.accepting() || + admission.generation() != admission_generation; + } catch (...) { + return true; + } + }; + } + + control::ControlDispatchGuard tryBeginDispatch() + { + auto admission = globalStopAllAdmissionGate().lockAdmission(); + if (!admission.accepting() || + admission.generation() != admission_generation_) { + return {}; + } + return manager_.tryBeginDispatch(token_); + } + +private: + control::ControlAuthorityManager& manager_; + control::ControlLeaseToken token_; + std::string detail_; + bool acquired_{false}; + bool release_on_destroy_{true}; + bool rejected_by_stop_all_{false}; + std::uint64_t admission_generation_{0U}; +}; + +template +device::Result executeConfirmedArmStop( + ScopedUnaryControlLease& control_barrier, + const char* operation_name, + Operation&& operation) +{ + const auto initial_stop = operation(); + if (!initial_stop.ok()) { + return initial_stop; + } + + constexpr auto handler_release_timeout = std::chrono::seconds(15); + if (!control_barrier.waitForPreemptedRelease( + std::chrono::duration_cast< + control::ControlAuthorityManager::Duration>( + handler_release_timeout))) { + return device::Result::failure( + device::ArmErrorCode::Timeout, + std::string(operation_name) + + " timed out waiting for the preempted control handler to exit"); + } + + const auto final_stop = operation(); + if (final_stop.ok()) { + control_barrier.confirmSafeToRelease(); + } + return final_stop; +} + +template +grpc::Status setControlAdmissionFailure( + Response* response, + const std::string& device_id, + const ScopedUnaryControlLease& lease) +{ + return lease.rejectedByStopAll() + ? setStopAllRejected(response, device_id) + : setControlLeaseConflict(response, device_id, lease.detail()); +} + +template +grpc::Status setControlDispatchFailure( + Response* response, + const std::string& device_id, + const ScopedUnaryControlLease& lease, + const char* operation) +{ + if (!lease.admissionCurrent()) { + return setStopAllRejected(response, device_id); + } + return setControlLeaseConflict( + response, + device_id, + std::string("control lease was preempted before ") + operation + + " dispatch"); +} + +grpc::Status setAlreadyEnabled( + api::CommandHeader_Feedback* response, + const std::string& device_id, + const char* rpc_name) +{ + constexpr const char* kAlreadyEnabledMessage = + "RobotArm is already enabled"; + CMVR_LOG(WARNING) << "[gRPCArmServiceImpl] (" << rpc_name + << "): ignored because the device is already enabled, id=" + << device_id; + fillFeedback(response, true, kAlreadyEnabledMessage); + return grpc::Status::OK; +} + +} // namespace + +gRPCArmServiceImpl::gRPCArmServiceImpl() + : gRPCArmServiceImpl(makeDefaultGrpcSecurityGateway()) +{ +} + +gRPCArmServiceImpl::gRPCArmServiceImpl( + std::shared_ptr security_gateway) + : dmgr_(device::DeviceManager::getInstance()), + security_gateway_(security_gateway + ? std::move(security_gateway) + : makeDefaultGrpcSecurityGateway()) +{ +} + +grpc::Status gRPCArmServiceImpl::torqueOff(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/torqueOff", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_barrier( + device_id, "torqueOff", true); + if (!control_barrier.acquired()) { + return setControlLeaseConflict( + response, device_id, control_barrier.detail()); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = executeConfirmedArmStop( + control_barrier, + "torqueOff", + [&arm]() { return arm->torqueOff(); }); + fillFeedback(response, result.ok(), result.ok() ? "" : result.message); + if (result.ok()) { + logRpcSuccess("torqueOff", device_id); + } + return resultToStatus(result); + }); +} + +grpc::Status gRPCArmServiceImpl::torqueOn(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/torqueOn", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + const auto state = arm->getRobotState(); + if (state.powered_on) { + return setAlreadyEnabled(response, device_id, "torqueOn"); + } + ScopedUnaryControlLease control_lease( + device_id, "torqueOn"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "torqueOn"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto cancellation_requested = + control_lease.cancellationRequested(context); + const auto result = arm->torqueOn(cancellation_requested); + const bool control_current = control_lease.current(); + const bool cancellation_result = + result.ok() || + result.code == device::ArmErrorCode::CommandRejected; + if (cancellation_result && + !control_lease.admissionCurrent()) { + return setStopAllRejected(response, device_id); + } + const bool rpc_cancelled = context && context->IsCancelled(); + if (cancellation_result && + (rpc_cancelled || !control_current)) { + return setControlCancelled( + response, + device_id, + rpc_cancelled + ? "the RPC was cancelled" + : "control ownership was revoked"); + } + fillFeedback(response, result.ok(), result.ok() ? "" : result.message); + if (result.ok()) { + logRpcSuccess("torqueOn", device_id); + } + return resultToStatus(result); + }); +} + +grpc::Status gRPCArmServiceImpl::moveJ(grpc::ServerContext* context, + const api::MoveJ_Request* request, + api::MoveJ_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/moveJ", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "moveJ"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "moveJ"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + auto options = toMotionOptions( + request->options(), + control_lease.cancellationRequested(context)); + const auto result = arm->moveJ( + toJointPositionCommand(request->target()), options); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (moveJ): success, id=" << device_id + << ", positions=" << request->target().position_size(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::moveL(grpc::ServerContext* context, + const api::MoveL_Request* request, + api::MoveL_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/moveL", request, response, + [this, context, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "moveL"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "moveL"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + auto options = toMotionOptions( + request->options(), + control_lease.cancellationRequested(context)); + const auto result = arm->moveL( + toCartesianPose(request->target()), + options, + toFrameType(request->frame())); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (moveL): success, id=" << device_id + << ", frame=" << request->frame(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::speedJ(grpc::ServerContext* context, + const api::SpeedJ_Request* request, + api::SpeedJ_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/speedJ", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "speedJ"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "speedJ"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = arm->speedJ(toJointVelocityCommand(request->velocity()), + request->acceleration(), + request->duration()); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (speedJ): success, id=" << device_id + << ", velocities=" << request->velocity().velocity_size() + << ", acceleration=" << request->acceleration() + << ", duration=" << request->duration(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::speedL(grpc::ServerContext* context, + const api::SpeedL_Request* request, + api::SpeedL_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/speedL", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "speedL"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "speedL"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = arm->speedL(toCartesianVelocity(request->velocity()), + request->acceleration(), + request->duration(), + toFrameType(request->frame())); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (speedL): success, id=" << device_id + << ", acceleration=" << request->acceleration() + << ", duration=" << request->duration() + << ", frame=" << request->frame(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::servoJ(grpc::ServerContext* context, + const api::ServoJ_Request* request, + api::ServoJ_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/servoJ", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "servoJ"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "servoJ"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = arm->servoJ(toJointPositionCommand(request->target())); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (servoJ): success, id=" << device_id + << ", positions=" << request->target().position_size(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::stopMotion(grpc::ServerContext* context, + const api::CommandHeader_Request* request, + api::CommandHeader_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/stopMotion", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_barrier( + device_id, "stopMotion", true); + if (!control_barrier.acquired()) { + return setControlLeaseConflict( + response, device_id, control_barrier.detail()); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = executeConfirmedArmStop( + control_barrier, + "stopMotion", + [&arm]() { return arm->stopMotion(); }); + fillFeedback(response, result.ok(), result.ok() ? "" : result.message); + if (result.ok()) { + logRpcSuccess("stopMotion", device_id); + } + return resultToStatus(result); + }); +} + +grpc::Status gRPCArmServiceImpl::getJointState(grpc::ServerContext* context, + const api::JointRequest* request, + api::JointResponse* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.ArmService/getJointState"); + try { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + const auto model = arm->getRobotModel(); + const auto state = arm->getJointState(); + auto* msg = response->mutable_state(); + for (const auto& name : model.joint_names) { + msg->add_name(name); + } + for (double v : state.position) msg->add_position(v); + for (double v : state.velocity) msg->add_velocity(v); + for (double v : state.effort) msg->add_effort(v); + fillFeedback(response->mutable_header(), true); + // CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (getJointState): success, id=" << device_id + // << ", joints=" << msg->name_size() + // << ", positions=" << msg->position_size(); + return grpc::Status::OK; + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCArmServiceImpl::getPose(grpc::ServerContext* context, + const api::GetPose_Request* request, + api::GetPose_Response* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.ArmService/getPose"); + try { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + const auto pose = request->base_link().empty() || request->ee_link().empty() + ? arm->fk(true) + : arm->fk(request->base_link(), request->ee_link()); + *response->mutable_pose() = toApiCartesianPose(pose); + fillFeedback(response->mutable_header(), true); + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (getPose): success, id=" << device_id + << ", pose=(" << pose.x << ", " << pose.y << ", " << pose.z + << ", " << pose.rx << ", " << pose.ry << ", " << pose.rz << ")"; + return grpc::Status::OK; + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + +grpc::Status gRPCArmServiceImpl::calibrateZeroQ(grpc::ServerContext* context, + const api::CalibrateZeroQ_Request* request, + api::CalibrateZeroQ_Response* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/calibrateZeroQ", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "calibrateZeroQ"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "calibrateZeroQ"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = arm->calibrateZeroQ(request->joint_name()); + if (result.ok()) { + CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (calibrateZeroQ): success, id=" << device_id + << ", joint=" << request->joint_name(); + } + return setResponseResult(response, result); + }); +} + +grpc::Status gRPCArmServiceImpl::getPoseMatrix(grpc::ServerContext* context, + const api::GetPoseMatrix_Request*, + api::GetPoseMatrix_Response* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.ArmService/getPoseMatrix"); + fillFeedback(response->mutable_header(), false, "getPoseMatrix is not implemented"); + return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "getPoseMatrix is not implemented"); +} + +grpc::Status gRPCArmServiceImpl::computeForwardKinematics(grpc::ServerContext* context, + const api::ComputeForwardKinematics_Request*, + api::ComputeForwardKinematics_Response* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.ArmService/computeForwardKinematics"); + fillFeedback(response->mutable_header(), false, "computeForwardKinematics is not implemented"); + return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "computeForwardKinematics is not implemented"); +} + +grpc::Status gRPCArmServiceImpl::ExecuteJsonCommand( + grpc::ServerContext* context, + const api::JsonDeviceCommand_Request* request, + api::JsonDeviceCommand_Feedback* response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/ExecuteJsonCommand", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->header().device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + fillFeedback( + response->mutable_header(), + false, + "Device not found: " + device_id); + return grpc::Status::OK; + } + + ScopedUnaryControlLease control_lease( + device_id, "ExecuteJsonCommand"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, + "ExecuteJsonCommand"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + + std::string response_json; + const bool success = arm->executeJsonCommand( + request->request_json(), response_json); + fillFeedback( + response->mutable_header(), + success, + success ? "" : response_json); + response->set_response_json(response_json); + if (success) { + logRpcSuccess("ExecuteJsonCommand", device_id); + } + return grpc::Status::OK; + }); +} + +grpc::Status gRPCArmServiceImpl::clearFault(grpc::ServerContext *context, + const cmvr::api::CommandHeader_Request *request, + cmvr::api::CommandHeader_Feedback *response) +{ + return executeRegisteredGrpcCommand( + security_gateway_, context, dmgr_.safetyManager(), + "/cmvr.api.ArmService/clearFault", request, response, + [this, request, response](GrpcCommandTransaction& command) { + const std::string device_id = request->device_id(); + auto arm = dmgr_.getDevice(device_id); + if (!arm) { + return setDeviceNotFound(response, device_id); + } + ScopedUnaryControlLease control_lease( + device_id, "clearFault"); + if (!control_lease.acquired()) { + return setControlAdmissionFailure( + response, device_id, control_lease); + } + auto dispatch = control_lease.tryBeginDispatch(); + if (!dispatch.acquired()) { + return setControlDispatchFailure( + response, device_id, control_lease, "clearFault"); + } + if (!command.beginDispatch()) { + return command.dispatchStatus(); + } + const auto result = arm->clearFault(); + fillFeedback(response, result.ok(), result.ok() ? "" : result.message); + return resultToStatus(result); + }); +} +} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/src/grpc_command_transaction.cpp b/cmvr-es/service/grpc/server/src/grpc_command_transaction.cpp new file mode 100644 index 00000000..16549ed3 --- /dev/null +++ b/cmvr-es/service/grpc/server/src/grpc_command_transaction.cpp @@ -0,0 +1,1271 @@ +#include "service/grpc/server/include/grpc_command_transaction.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "service/grpc/server/include/grpc_safety_proto.h" + +namespace cmvr::service { + +namespace { + +constexpr auto kDefaultCommandValidity = std::chrono::seconds(30); +constexpr auto kMaximumCommandValidity = std::chrono::minutes(5); +constexpr std::size_t kMaximumDeviceIdLength = 256; + +const api::CommandHeader_Request* findRequestHeader( + const google::protobuf::Message& message) +{ + if (const auto* header = + dynamic_cast(&message)) { + return header; + } + const auto* reflection = message.GetReflection(); + std::vector fields; + reflection->ListFields(message, &fields); + for (const auto* field : fields) { + if (field->cpp_type() != + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + continue; + } + if (field->is_repeated()) { + for (int index = 0; + index < reflection->FieldSize(message, field); ++index) { + if (const auto* header = findRequestHeader( + reflection->GetRepeatedMessage( + message, field, index))) { + return header; + } + } + } else if (const auto* header = findRequestHeader( + reflection->GetMessage(message, field))) { + return header; + } + } + return nullptr; +} + +api::CommandHeader_Feedback* findFeedbackHeader( + google::protobuf::Message& message) +{ + if (auto* header = dynamic_cast(&message)) { + return header; + } + const auto* reflection = message.GetReflection(); + const auto* descriptor = message.GetDescriptor(); + for (int index = 0; index < descriptor->field_count(); ++index) { + const auto* field = descriptor->field(index); + if (field->cpp_type() != + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE || + field->is_repeated()) { + continue; + } + auto* nested = reflection->MutableMessage(&message, field); + if (auto* header = findFeedbackHeader(*nested)) { + return header; + } + } + return nullptr; +} + +void canonicalizeMessage(google::protobuf::Message& message) +{ + if (auto* header = dynamic_cast(&message)) { + header->clear_timestamp(); + header->clear_command_id(); + header->clear_expected_service_instance_id(); + header->clear_valid_for_ms(); + } + + const auto* reflection = message.GetReflection(); + std::vector fields; + reflection->ListFields(message, &fields); + for (const auto* field : fields) { + if (field->cpp_type() != + google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { + continue; + } + if (field->is_repeated()) { + const int size = reflection->FieldSize(message, field); + for (int index = 0; index < size; ++index) { + canonicalizeMessage( + *reflection->MutableRepeatedMessage( + &message, field, index)); + } + } else { + canonicalizeMessage( + *reflection->MutableMessage(&message, field)); + } + } +} + +bool deterministicSerialize( + const google::protobuf::Message& message, + std::string& serialized) +{ + serialized.clear(); + google::protobuf::io::StringOutputStream stream(&serialized); + google::protobuf::io::CodedOutputStream coded_stream(&stream); + coded_stream.SetSerializationDeterministic(true); + if (!message.SerializeToCodedStream(&coded_stream)) { + serialized.clear(); + return false; + } + coded_stream.Trim(); + return !coded_stream.HadError(); +} + +std::uint64_t stableHash( + const std::string& value, + const std::uint64_t seed) noexcept +{ + std::uint64_t hash = 1469598103934665603ULL ^ seed; + for (const unsigned char byte : value) { + hash ^= static_cast(byte); + hash *= 1099511628211ULL; + } + hash ^= hash >> 33U; + hash *= 0xff51afd7ed558ccdULL; + hash ^= hash >> 33U; + hash *= 0xc4ceb9fe1a85ec53ULL; + hash ^= hash >> 33U; + return hash; +} + +bool isEnforced( + const safety::SafetyManagerConfig& config, + const std::string& device_id) +{ + switch (config.enforcement_mode) { + case safety::EnforcementMode::Legacy: + case safety::EnforcementMode::Shadow: + return false; + case safety::EnforcementMode::EnforceSelected: + return config.enforced_device_ids.count(device_id) != 0; + case safety::EnforcementMode::EnforceAll: + return true; + } + return false; +} + +bool commandIdentityRequired( + const GrpcMethodPolicy& policy, + const bool enforced) noexcept +{ + return enforced && policy.mutating && + policy.command_intent != safety::CommandIntent::Stop && + policy.command_intent != safety::CommandIntent::RecoverAdmission; +} + +api::CommandExecutionState toApiLifecycle( + const safety::CommandLifecycle lifecycle) noexcept +{ + using safety::CommandLifecycle; + switch (lifecycle) { + case CommandLifecycle::Received: + return api::COMMAND_EXECUTION_STATE_RECEIVED; + case CommandLifecycle::Reserved: + return api::COMMAND_EXECUTION_STATE_RESERVED; + case CommandLifecycle::RejectedBeforeDispatch: + return api::COMMAND_EXECUTION_STATE_REJECTED_BEFORE_DISPATCH; + case CommandLifecycle::Admitted: + return api::COMMAND_EXECUTION_STATE_ADMITTED; + case CommandLifecycle::Dispatching: + return api::COMMAND_EXECUTION_STATE_DISPATCHING; + case CommandLifecycle::AcceptedByHardware: + return api::COMMAND_EXECUTION_STATE_ACCEPTED_BY_HARDWARE; + case CommandLifecycle::Completed: + return api::COMMAND_EXECUTION_STATE_COMPLETED; + case CommandLifecycle::Failed: + return api::COMMAND_EXECUTION_STATE_FAILED; + case CommandLifecycle::CanceledBeforeDispatch: + return api::COMMAND_EXECUTION_STATE_CANCELED_BEFORE_DISPATCH; + case CommandLifecycle::OutcomeUnknown: + return api::COMMAND_EXECUTION_STATE_OUTCOME_UNKNOWN; + } + return api::COMMAND_EXECUTION_STATE_UNSPECIFIED; +} + +grpc::Status statusForReason( + const safety::SafetyReason reason, + const std::string& detail) +{ + using safety::SafetyReason; + grpc::StatusCode code = grpc::StatusCode::FAILED_PRECONDITION; + switch (reason) { + case SafetyReason::None: return grpc::Status::OK; + case SafetyReason::InvalidArgument: + case SafetyReason::CommandIdRequired: + case SafetyReason::RecoveryReasonRequired: + code = grpc::StatusCode::INVALID_ARGUMENT; + break; + case SafetyReason::Unauthenticated: + code = grpc::StatusCode::UNAUTHENTICATED; + break; + case SafetyReason::PermissionDenied: + code = grpc::StatusCode::PERMISSION_DENIED; + break; + case SafetyReason::DeviceNotFound: + code = grpc::StatusCode::NOT_FOUND; + break; + case SafetyReason::UnsupportedCommand: + code = grpc::StatusCode::UNIMPLEMENTED; + break; + case SafetyReason::DeviceUnavailable: + case SafetyReason::DeviceDisconnected: + case SafetyReason::SafetyStateMissing: + case SafetyReason::SafetyStateStale: + case SafetyReason::SystemStarting: + code = grpc::StatusCode::UNAVAILABLE; + break; + case SafetyReason::SystemStopping: + case SafetyReason::GenerationMismatch: + case SafetyReason::OutcomeUnknown: + code = grpc::StatusCode::ABORTED; + break; + case SafetyReason::CommandIdConflict: + code = grpc::StatusCode::ALREADY_EXISTS; + break; + case SafetyReason::ResultEvicted: + code = grpc::StatusCode::FAILED_PRECONDITION; + break; + case SafetyReason::LedgerExhausted: + case SafetyReason::Backpressure: + case SafetyReason::ControlBusy: + code = grpc::StatusCode::RESOURCE_EXHAUSTED; + break; + case SafetyReason::DeadlineExceededBeforeDispatch: + case SafetyReason::ParticipantTimeout: + code = grpc::StatusCode::DEADLINE_EXCEEDED; + break; + case SafetyReason::InternalError: + code = grpc::StatusCode::INTERNAL; + break; + case SafetyReason::RecoveryRpcDisabled: + case SafetyReason::SafetyLatched: + case SafetyReason::HardwareUnsafe: + case SafetyReason::EmergencyStopActive: + case SafetyReason::ProtectiveStopActive: + case SafetyReason::DeviceFault: + case SafetyReason::DeviceNotReady: + case SafetyReason::DeviceStillMoving: + case SafetyReason::StopUnconfirmed: + case SafetyReason::RecoveryEpochMismatch: + case SafetyReason::RecoveryAuditFailed: + break; + } + return grpc::Status( + code, + detail.empty() ? safety::toString(reason) : detail); +} + +safety::SafetyReason reasonForStatus(const grpc::Status& status) noexcept +{ + if (status.ok()) { + return safety::SafetyReason::InternalError; + } + switch (status.error_code()) { + case grpc::StatusCode::INVALID_ARGUMENT: + case grpc::StatusCode::OUT_OF_RANGE: + return safety::SafetyReason::InvalidArgument; + case grpc::StatusCode::UNAUTHENTICATED: + return safety::SafetyReason::Unauthenticated; + case grpc::StatusCode::PERMISSION_DENIED: + return safety::SafetyReason::PermissionDenied; + case grpc::StatusCode::NOT_FOUND: + return safety::SafetyReason::DeviceNotFound; + case grpc::StatusCode::UNIMPLEMENTED: + return safety::SafetyReason::UnsupportedCommand; + case grpc::StatusCode::UNAVAILABLE: + return safety::SafetyReason::DeviceUnavailable; + case grpc::StatusCode::RESOURCE_EXHAUSTED: + return safety::SafetyReason::ControlBusy; + case grpc::StatusCode::DEADLINE_EXCEEDED: + return safety::SafetyReason::DeadlineExceededBeforeDispatch; + case grpc::StatusCode::ABORTED: + return safety::SafetyReason::GenerationMismatch; + default: + return safety::SafetyReason::InternalError; + } +} + +bool validDeviceId(const std::string& device_id) noexcept +{ + return !device_id.empty() && device_id.size() <= kMaximumDeviceIdLength; +} + +} // namespace + +grpc::Status grpcStatusForSafetyReason( + const safety::SafetyReason reason, + const std::string& detail) +{ + return statusForReason(reason, detail); +} + +GrpcStreamingSafetySession::GrpcStreamingSafetySession( + safety::SafetyManager& coordinator, + const GrpcRequestContext& request_context, + GrpcStreamingSafetyOpen open) + : coordinator_(&coordinator), + status_(grpc::Status::OK) +{ + if (!validDeviceId(open.device_id) || open.session_id.empty()) { + reject_( + safety::SafetyReason::InvalidArgument, + "stream device_id and session_id are required"); + return; + } + const auto policy = + defaultGrpcMethodPolicyRegistry().find(open.full_method_name); + if (!policy.has_value() || !policy->mutating) { + reject_( + safety::SafetyReason::InternalError, + "stream requires a registered mutating method policy"); + return; + } + if (!open.expected_service_instance_id.empty() && + open.expected_service_instance_id != coordinator.serviceInstanceId()) { + reject_( + safety::SafetyReason::GenerationMismatch, + "expected_service_instance_id does not match the active control service instance"); + return; + } + + safety::AdmissionRequest request; + request.command = policy->commandDescriptor(); + request.actor.principal_id = request_context.principal.id; + request.actor.authenticated = request_context.principal.authenticated; + for (const auto role : request_context.principal.roles) { + request.actor.roles.emplace_back(toString(role)); + } + request.command_id = std::move(open.session_id); + request.device_id = std::move(open.device_id); + request.expected_device_generation = + open.expected_device_generation; + request.authority_generation = open.authority_generation; + request.deadline = std::min(open.deadline, request_context.deadline); + + auto admitted = coordinator.admit(request); + admission_decision_ = admitted.decision; + if (!admitted.permit.has_value()) { + reject_( + admitted.decision.reason == safety::SafetyReason::None + ? safety::SafetyReason::InternalError + : admitted.decision.reason, + admitted.decision.detail); + return; + } + permit_ = std::move(admitted.permit); +} + +bool GrpcStreamingSafetySession::revalidate() +{ + if (!coordinator_ || !permit_.has_value()) { + reject_( + safety::SafetyReason::InternalError, + "stream safety session is not admitted"); + return false; + } + const auto check = coordinator_->revalidatePermit(*permit_); + if (!check.safe) { + reject_( + check.reason == safety::SafetyReason::None + ? safety::SafetyReason::SafetyLatched + : check.reason, + check.detail); + return false; + } + status_ = grpc::Status::OK; + return true; +} + +safety::DispatchGuard GrpcStreamingSafetySession::beginDispatch() +{ + if (!coordinator_ || !permit_.has_value()) { + reject_( + safety::SafetyReason::InternalError, + "stream safety session is not dispatchable"); + return {}; + } + auto guard = coordinator_->beginDispatch(*permit_); + if (!guard.acquired()) { + const auto& check = guard.hardwareCheck(); + reject_( + check.reason == safety::SafetyReason::None + ? safety::SafetyReason::SafetyLatched + : check.reason, + check.detail); + return guard; + } + status_ = grpc::Status::OK; + return guard; +} + +std::uint64_t GrpcStreamingSafetySession::safetyEpoch() const noexcept +{ + return permit_ ? permit_->safety_epoch : 0U; +} + +std::uint64_t GrpcStreamingSafetySession::deviceGeneration() const noexcept +{ + return permit_ ? permit_->device_generation : 0U; +} + +std::uint64_t GrpcStreamingSafetySession::authorityGeneration() const noexcept +{ + return permit_ ? permit_->authority_generation : 0U; +} + +void GrpcStreamingSafetySession::reject_( + const safety::SafetyReason reason, + std::string detail) +{ + status_ = grpcStatusForSafetyReason(reason, detail); + permit_.reset(); +} + +std::string deterministicGrpcPayloadHash( + const std::string& full_method_name, + const google::protobuf::Message& request) +{ + std::unique_ptr normalized(request.New()); + if (!normalized) { + return {}; + } + normalized->CopyFrom(request); + normalized->DiscardUnknownFields(); + canonicalizeMessage(*normalized); + + std::string serialized; + if (!deterministicSerialize(*normalized, serialized)) { + return {}; + } + serialized.insert(0, full_method_name + '\0'); + constexpr std::array seeds{ + 0xa4093822299f31d0ULL, + 0x082efa98ec4e6c89ULL, + 0x452821e638d01377ULL, + 0xbe5466cf34e90c6cULL}; + std::ostringstream output; + output << std::hex << std::setfill('0'); + for (const auto seed : seeds) { + output << std::setw(16) << stableHash(serialized, seed); + } + output << ':' << std::dec << serialized.size(); + return output.str(); +} + +GrpcCommandTransaction::GrpcCommandTransaction( + safety::SafetyManager& coordinator, + GrpcRequestContext request_context, + GrpcMethodPolicy method_policy, + const google::protobuf::Message& request, + google::protobuf::Message& response) + : coordinator_(&coordinator), + request_context_(std::move(request_context)), + method_policy_(std::move(method_policy)), + response_(&response), + status_(grpc::Status::OK), + dispatch_status_(grpc::Status::OK) +{ + initialize_(request); +} + +GrpcCommandTransaction::~GrpcCommandTransaction() noexcept +{ + abandon_(); +} + +GrpcCommandTransaction::GrpcCommandTransaction( + GrpcCommandTransaction&& other) noexcept + : coordinator_(std::exchange(other.coordinator_, nullptr)), + request_context_(std::move(other.request_context_)), + method_policy_(std::move(other.method_policy_)), + response_(std::exchange(other.response_, nullptr)), + ledger_ticket_(std::move(other.ledger_ticket_)), + permit_(std::move(other.permit_)), + dispatch_guard_(std::move(other.dispatch_guard_)), + admission_decision_(std::move(other.admission_decision_)), + status_(std::move(other.status_)), + dispatch_status_(std::move(other.dispatch_status_)), + device_id_(std::move(other.device_id_)), + command_id_(std::move(other.command_id_)), + payload_hash_(std::move(other.payload_hash_)), + deadline_(other.deadline_), + should_execute_(other.should_execute_), + owns_ledger_record_(other.owns_ledger_record_), + dispatch_started_(other.dispatch_started_), + completed_(other.completed_), + safety_stop_sequence_(other.safety_stop_sequence_) +{ + other.should_execute_ = false; + other.owns_ledger_record_ = false; + other.dispatch_started_ = false; + other.completed_ = true; +} + +GrpcCommandTransaction& GrpcCommandTransaction::operator=( + GrpcCommandTransaction&& other) noexcept +{ + if (this == &other) { + return *this; + } + abandon_(); + coordinator_ = std::exchange(other.coordinator_, nullptr); + request_context_ = std::move(other.request_context_); + method_policy_ = std::move(other.method_policy_); + response_ = std::exchange(other.response_, nullptr); + ledger_ticket_ = std::move(other.ledger_ticket_); + permit_ = std::move(other.permit_); + dispatch_guard_ = std::move(other.dispatch_guard_); + admission_decision_ = std::move(other.admission_decision_); + status_ = std::move(other.status_); + dispatch_status_ = std::move(other.dispatch_status_); + device_id_ = std::move(other.device_id_); + command_id_ = std::move(other.command_id_); + payload_hash_ = std::move(other.payload_hash_); + deadline_ = other.deadline_; + should_execute_ = other.should_execute_; + owns_ledger_record_ = other.owns_ledger_record_; + dispatch_started_ = other.dispatch_started_; + completed_ = other.completed_; + safety_stop_sequence_ = other.safety_stop_sequence_; + other.should_execute_ = false; + other.owns_ledger_record_ = false; + other.dispatch_started_ = false; + other.completed_ = true; + return *this; +} + +void GrpcCommandTransaction::initialize_( + const google::protobuf::Message& request) +{ + const auto* header = findRequestHeader(request); + if (!header) { + rejectBeforeDispatch_( + safety::SafetyReason::InvalidArgument, + "mutating unary request has no CommandHeader.Request", + grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "mutating unary request has no CommandHeader.Request"), + false); + return; + } + device_id_ = header->device_id(); + command_id_ = header->command_id(); + if (!validDeviceId(device_id_)) { + rejectBeforeDispatch_( + safety::SafetyReason::InvalidArgument, + "header.device_id is required and must not exceed 256 bytes", + grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "header.device_id is required and must not exceed 256 bytes"), + false); + return; + } + + const bool enforced = isEnforced(coordinator_->config(), device_id_); + if (commandIdentityRequired(method_policy_, enforced) && + command_id_.empty()) { + rejectBeforeDispatch_( + safety::SafetyReason::CommandIdRequired, + "header.command_id is required for an enforced mutating command", + statusForReason( + safety::SafetyReason::CommandIdRequired, + "header.command_id is required for an enforced mutating command"), + false); + return; + } + if (commandIdentityRequired(method_policy_, enforced) && + header->expected_service_instance_id().empty()) { + rejectBeforeDispatch_( + safety::SafetyReason::GenerationMismatch, + "header.expected_service_instance_id is required for an enforced mutating command", + statusForReason( + safety::SafetyReason::GenerationMismatch, + "header.expected_service_instance_id is required for an enforced mutating command"), + false); + return; + } + if (!header->expected_service_instance_id().empty() && + header->expected_service_instance_id() != + coordinator_->serviceInstanceId()) { + rejectBeforeDispatch_( + safety::SafetyReason::GenerationMismatch, + "header.expected_service_instance_id does not match the active control service instance", + statusForReason( + safety::SafetyReason::GenerationMismatch, + "header.expected_service_instance_id does not match the active control service instance"), + false); + return; + } + if (header->valid_for_ms() != 0 && + std::chrono::milliseconds(header->valid_for_ms()) > + kMaximumCommandValidity) { + rejectBeforeDispatch_( + safety::SafetyReason::InvalidArgument, + "header.valid_for_ms exceeds the five minute server limit", + statusForReason( + safety::SafetyReason::InvalidArgument, + "header.valid_for_ms exceeds the five minute server limit"), + false); + return; + } + if (enforced && + method_policy_.command_intent == safety::CommandIntent::Actuate && + header->valid_for_ms() == 0) { + rejectBeforeDispatch_( + safety::SafetyReason::InvalidArgument, + "header.valid_for_ms is required for an enforced actuation command", + statusForReason( + safety::SafetyReason::InvalidArgument, + "header.valid_for_ms is required for an enforced actuation command"), + false); + return; + } + + const auto validity = header->valid_for_ms() == 0 + ? kDefaultCommandValidity + : std::chrono::duration_cast( + std::chrono::milliseconds(header->valid_for_ms())); + deadline_ = request_context_.received_at + validity; + deadline_ = std::min(deadline_, request_context_.deadline); + + if (!command_id_.empty() && method_policy_.mutating) { + payload_hash_ = deterministicGrpcPayloadHash( + method_policy_.full_method_name, request); + if (payload_hash_.empty()) { + rejectBeforeDispatch_( + safety::SafetyReason::InternalError, + "request payload could not be serialized deterministically", + statusForReason( + safety::SafetyReason::InternalError, + "request payload could not be serialized deterministically"), + false); + return; + } + const safety::CommandKey key{ + request_context_.principal.id.empty() + ? std::string("anonymous") + : request_context_.principal.id, + command_id_}; + auto reservation = coordinator_->commandLedger().reserve( + key, payload_hash_); + switch (reservation.status) { + case safety::CommandReservationStatus::AcceptedNew: + ledger_ticket_ = std::move(reservation.ticket); + owns_ledger_record_ = true; + break; + case safety::CommandReservationStatus::JoinedInFlight: { + const auto outcome = coordinator_->commandLedger().wait( + reservation.ticket, deadline_); + if (!outcome.has_value()) { + rejectBeforeDispatch_( + safety::SafetyReason::DeadlineExceededBeforeDispatch, + "timed out waiting for the in-flight command result", + statusForReason( + safety::SafetyReason::DeadlineExceededBeforeDispatch, + "timed out waiting for the in-flight command result"), + false); + return; + } + if (!restoreOutcome_(*outcome)) { + rejectBeforeDispatch_( + safety::SafetyReason::InternalError, + "cached command response could not be decoded", + statusForReason( + safety::SafetyReason::InternalError, + "cached command response could not be decoded"), + false); + return; + } + status_ = grpc::Status::OK; + completed_ = true; + return; + } + case safety::CommandReservationStatus::CachedResult: + if (!reservation.cached_outcome.has_value() || + !restoreOutcome_(*reservation.cached_outcome)) { + rejectBeforeDispatch_( + safety::SafetyReason::InternalError, + "cached command response could not be decoded", + statusForReason( + safety::SafetyReason::InternalError, + "cached command response could not be decoded"), + false); + return; + } + status_ = grpc::Status::OK; + completed_ = true; + return; + case safety::CommandReservationStatus::CommandIdConflict: + rejectBeforeDispatch_( + safety::SafetyReason::CommandIdConflict, + "command_id is already associated with a different semantic payload", + statusForReason( + safety::SafetyReason::CommandIdConflict, + "command_id is already associated with a different semantic payload"), + false); + return; + case safety::CommandReservationStatus::ResultEvicted: + rejectBeforeDispatch_( + safety::SafetyReason::ResultEvicted, + "command result was evicted and the command will not be dispatched again", + statusForReason( + safety::SafetyReason::ResultEvicted, + "command result was evicted and the command will not be dispatched again"), + false); + return; + case safety::CommandReservationStatus::LedgerExhausted: + rejectBeforeDispatch_( + safety::SafetyReason::LedgerExhausted, + "command ledger capacity is exhausted", + statusForReason( + safety::SafetyReason::LedgerExhausted, + "command ledger capacity is exhausted"), + false); + return; + case safety::CommandReservationStatus::Invalid: + rejectBeforeDispatch_( + safety::SafetyReason::InvalidArgument, + "command_id or effective principal is invalid", + statusForReason( + safety::SafetyReason::InvalidArgument, + "command_id or effective principal is invalid"), + false); + return; + } + } + + safety::AdmissionRequest admission; + admission.command = method_policy_.commandDescriptor(); + admission.actor.principal_id = request_context_.principal.id; + admission.actor.authenticated = request_context_.principal.authenticated; + for (const auto role : request_context_.principal.roles) { + admission.actor.roles.emplace_back(toString(role)); + } + admission.command_id = command_id_.empty() + ? request_context_.correlation_id + : command_id_; + admission.device_id = device_id_; + if (header->has_expected_device_generation()) { + admission.expected_device_generation = + header->expected_device_generation(); + } + admission.deadline = deadline_; + + auto admitted = coordinator_->admit(admission); + admission_decision_ = admitted.decision; + if (!admitted.permit.has_value()) { + const auto reason = admitted.decision.reason == safety::SafetyReason::None + ? safety::SafetyReason::InternalError + : admitted.decision.reason; + rejectBeforeDispatch_( + reason, + admitted.decision.detail, + owns_ledger_record_ + ? grpc::Status::OK + : statusForReason(reason, admitted.decision.detail), + owns_ledger_record_); + return; + } + permit_ = std::move(admitted.permit); + if (owns_ledger_record_) { + (void)coordinator_->commandLedger().setLifecycle( + ledger_ticket_, + safety::CommandLifecycle::Admitted, + admission_decision_.safety_epoch, + admission_decision_.device_generation); + } + should_execute_ = true; + status_ = grpc::Status::OK; +} + +bool GrpcCommandTransaction::beginDispatch() +{ + if (dispatch_guard_.has_value() && dispatch_guard_->acquired()) { + return true; + } + auto guard = beginScopedDispatch(); + if (!guard.acquired()) { + return false; + } + dispatch_guard_.emplace(std::move(guard)); + return true; +} + +bool GrpcCommandTransaction::revalidate() +{ + if (!should_execute_ || completed_ || !permit_.has_value() || + !coordinator_) { + dispatch_status_ = statusForReason( + safety::SafetyReason::InternalError, + "command transaction is not revalidatable"); + return false; + } + const auto check = coordinator_->revalidatePermit(*permit_); + if (!check.safe) { + const auto reason = check.reason == safety::SafetyReason::None + ? safety::SafetyReason::SafetyLatched + : check.reason; + dispatch_status_ = statusForReason(reason, check.detail); + populateFeedback_( + false, + reason, + dispatch_started_ ? safety::CommandLifecycle::Failed + : safety::CommandLifecycle::RejectedBeforeDispatch, + check.detail); + return false; + } + dispatch_status_ = grpc::Status::OK; + return true; +} + +safety::DispatchGuard GrpcCommandTransaction::beginScopedDispatch() +{ + if (!should_execute_ || completed_ || !permit_.has_value() || + !coordinator_) { + dispatch_status_ = statusForReason( + safety::SafetyReason::InternalError, + "command transaction is not dispatchable"); + return {}; + } + auto guard = coordinator_->beginDispatch(*permit_); + if (!guard.acquired()) { + auto hardware = guard.hardwareCheck(); + if (hardware.reason == safety::SafetyReason::None) { + hardware.reason = safety::SafetyReason::SafetyLatched; + } + dispatch_status_ = statusForReason(hardware.reason, hardware.detail); + populateFeedback_( + false, + hardware.reason, + dispatch_started_ ? safety::CommandLifecycle::Failed + : safety::CommandLifecycle::RejectedBeforeDispatch, + hardware.detail); + return guard; + } + const bool first_dispatch = !dispatch_started_; + dispatch_started_ = true; + if (first_dispatch && owns_ledger_record_) { + (void)coordinator_->commandLedger().setLifecycle( + ledger_ticket_, + safety::CommandLifecycle::Dispatching, + admission_decision_.safety_epoch, + admission_decision_.device_generation, + true); + } + dispatch_status_ = grpc::Status::OK; + return guard; +} + +safety::DispatchGuard GrpcCommandTransaction::beginSafetyStopDispatch() +{ + if (!should_execute_ || completed_ || !coordinator_) { + dispatch_status_ = statusForReason( + safety::SafetyReason::InternalError, + "command transaction cannot dispatch an internal safety stop"); + return {}; + } + + safety::AdmissionRequest stop; + stop.command = { + method_policy_.full_method_name + "#internal-stop", + safety::CommandIntent::Stop, + method_policy_.policy_family, + true, + true}; + stop.actor.principal_id = request_context_.principal.id; + stop.actor.authenticated = request_context_.principal.authenticated; + for (const auto role : request_context_.principal.roles) { + stop.actor.roles.emplace_back(toString(role)); + } + const auto base_id = command_id_.empty() + ? request_context_.correlation_id + : command_id_; + stop.command_id = base_id + ":internal-stop:" + + std::to_string(++safety_stop_sequence_); + stop.device_id = device_id_; + stop.deadline = safety::SafetyClock::time_point::max(); + + auto admitted = coordinator_->admit(stop); + if (!admitted.permit.has_value()) { + const auto reason = admitted.decision.reason == safety::SafetyReason::None + ? safety::SafetyReason::SafetyLatched + : admitted.decision.reason; + dispatch_status_ = statusForReason(reason, admitted.decision.detail); + return {}; + } + auto guard = coordinator_->beginDispatch(*admitted.permit); + if (!guard.acquired()) { + const auto& hardware = guard.hardwareCheck(); + const auto reason = hardware.reason == safety::SafetyReason::None + ? safety::SafetyReason::StopUnconfirmed + : hardware.reason; + dispatch_status_ = statusForReason(reason, hardware.detail); + return guard; + } + dispatch_status_ = grpc::Status::OK; + return guard; +} + +grpc::Status GrpcCommandTransaction::finish( + grpc::Status operation_status, + safety::SafetyReason reason, + std::optional lifecycle) +{ + if (completed_) { + return status_; + } + auto* feedback = response_ ? findFeedbackHeader(*response_) : nullptr; + const bool success = feedback && feedback->success() && + operation_status.ok(); + if (reason == safety::SafetyReason::None && !success) { + if (feedback && feedback->reason_code() != + api::COMMAND_REASON_CODE_UNSPECIFIED && + feedback->reason_code() != api::COMMAND_REASON_CODE_NONE) { + reason = fromApiSafetyReason(feedback->reason_code()); + } else { + reason = reasonForStatus(operation_status); + } + } + if (success) { + reason = safety::SafetyReason::None; + } + const bool stop_unconfirmed = + !success && dispatch_started_ && + method_policy_.command_intent == safety::CommandIntent::Stop; + if (stop_unconfirmed) { + reason = safety::SafetyReason::StopUnconfirmed; + if (coordinator_) { + coordinator_->quarantineDevice( + device_id_, reason, command_id_); + } + } + const auto terminal_lifecycle = lifecycle.value_or( + success + ? safety::CommandLifecycle::Completed + : dispatch_started_ ? safety::CommandLifecycle::Failed + : safety::CommandLifecycle::RejectedBeforeDispatch); + const std::string detail = success + ? feedback && !feedback->error_message().empty() + ? feedback->error_message() + : std::string{} + : feedback && !feedback->error_message().empty() + ? feedback->error_message() + : operation_status.error_message(); + populateFeedback_(success, reason, terminal_lifecycle, detail); + + dispatch_guard_.reset(); + const bool ledger_backed = owns_ledger_record_; + if (ledger_backed && + !completeLedger_( + terminal_lifecycle, reason, detail, dispatch_started_)) { + status_ = statusForReason( + safety::SafetyReason::InternalError, + "command ledger could not store the terminal result"); + completed_ = true; + should_execute_ = false; + return status_; + } + completed_ = true; + should_execute_ = false; + status_ = ledger_backed ? grpc::Status::OK + : std::move(operation_status); + return status_; +} + +grpc::Status GrpcCommandTransaction::finishException( + std::string detail) noexcept +{ + try { + const bool stop_failed = + dispatch_started_ && + method_policy_.command_intent == safety::CommandIntent::Stop; + const bool outcome_unknown = + dispatch_started_ && !stop_failed && + method_policy_.command_intent != + safety::CommandIntent::ResetFault; + const auto reason = stop_failed + ? safety::SafetyReason::StopUnconfirmed + : outcome_unknown ? safety::SafetyReason::OutcomeUnknown + : safety::SafetyReason::InternalError; + const auto lifecycle = outcome_unknown + ? safety::CommandLifecycle::OutcomeUnknown + : dispatch_started_ ? safety::CommandLifecycle::Failed + : safety::CommandLifecycle::RejectedBeforeDispatch; + if ((outcome_unknown || stop_failed) && coordinator_) { + coordinator_->quarantineDevice( + device_id_, reason, command_id_); + } + populateFeedback_(false, reason, lifecycle, detail); + dispatch_guard_.reset(); + const bool ledger_backed = owns_ledger_record_; + if (ledger_backed) { + (void)completeLedger_( + lifecycle, reason, detail, dispatch_started_); + } + completed_ = true; + should_execute_ = false; + status_ = ledger_backed + ? grpc::Status::OK + : statusForReason(reason, detail); + return status_; + } catch (...) { + completed_ = true; + should_execute_ = false; + status_ = grpc::Status( + grpc::StatusCode::INTERNAL, + "command transaction failed while handling an exception"); + return status_; + } +} + +void GrpcCommandTransaction::rejectBeforeDispatch_( + const safety::SafetyReason reason, + std::string detail, + grpc::Status status, + const bool complete_reserved_record) +{ + populateFeedback_( + false, + reason, + safety::CommandLifecycle::RejectedBeforeDispatch, + detail); + if (complete_reserved_record && owns_ledger_record_) { + if (!completeLedger_( + safety::CommandLifecycle::RejectedBeforeDispatch, + reason, + detail, + false)) { + status = statusForReason( + safety::SafetyReason::InternalError, + "command ledger could not store the rejected result"); + } else { + status = grpc::Status::OK; + } + } + status_ = std::move(status); + should_execute_ = false; + completed_ = true; +} + +bool GrpcCommandTransaction::restoreOutcome_( + const safety::CommandOutcome& outcome) +{ + if (!response_) { + return false; + } + if (!outcome.serialized_response.empty()) { + response_->Clear(); + if (!response_->ParseFromString(outcome.serialized_response)) { + return false; + } + } + const bool success = + outcome.lifecycle == safety::CommandLifecycle::Completed; + populateFeedback_( + success, + outcome.reason, + outcome.lifecycle, + outcome.detail); + return true; +} + +bool GrpcCommandTransaction::completeLedger_( + const safety::CommandLifecycle lifecycle, + const safety::SafetyReason reason, + const std::string& detail, + const bool hardware_submission_possible) noexcept +{ + try { + if (!owns_ledger_record_ || !coordinator_ || !response_) { + return !owns_ledger_record_; + } + std::string serialized; + if (!deterministicSerialize(*response_, serialized)) { + return false; + } + safety::CommandOutcome outcome; + outcome.lifecycle = lifecycle; + outcome.reason = reason; + outcome.detail = detail; + outcome.serialized_response = std::move(serialized); + outcome.safety_epoch = admission_decision_.safety_epoch; + outcome.device_generation = admission_decision_.device_generation; + outcome.hardware_submission_possible = hardware_submission_possible; + const bool completed = coordinator_->commandLedger().complete( + ledger_ticket_, std::move(outcome)); + if (completed) { + owns_ledger_record_ = false; + } + return completed; + } catch (...) { + return false; + } +} + +void GrpcCommandTransaction::populateFeedback_( + const bool success, + const safety::SafetyReason reason, + const safety::CommandLifecycle lifecycle, + const std::string& detail) +{ + if (!response_) { + return; + } + auto* feedback = findFeedbackHeader(*response_); + if (!feedback) { + return; + } + feedback->set_success(success); + if (!success && feedback->error_message().empty()) { + feedback->set_error_message( + detail.empty() ? safety::toString(reason) : detail); + } + if (success && feedback->error_message().empty()) { + feedback->clear_error_message(); + } + if (!feedback->has_timestamp()) { + *feedback->mutable_timestamp() = + google::protobuf::util::TimeUtil::GetCurrentTime(); + } + feedback->set_reason_code(toApiSafetyReason(reason)); + feedback->set_command_id(command_id_); + if (coordinator_) { + feedback->set_service_instance_id(coordinator_->serviceInstanceId()); + } + feedback->set_safety_epoch(admission_decision_.safety_epoch); + feedback->set_device_generation( + admission_decision_.device_generation); + feedback->set_execution_state(toApiLifecycle(lifecycle)); +} + +void GrpcCommandTransaction::abandon_() noexcept +{ + if (completed_ || !owns_ledger_record_) { + return; + } + (void)finishException( + dispatch_started_ + ? "command handler exited after crossing the hardware dispatch fence without recording a terminal result" + : "command handler exited without recording a terminal result"); +} + +grpc::Status executeRegisteredGrpcCommand( + const std::shared_ptr& gateway, + grpc::ServerContext* server_context, + safety::SafetyManager& coordinator, + const std::string& full_method_name, + const google::protobuf::Message* request, + google::protobuf::Message* response, + GrpcUnaryCommandOperation operation) +{ + const auto call = beginRegisteredGrpcCall( + gateway, server_context, full_method_name); + if (!call.allowed()) { + return call.status(); + } + if (!request || !response || !operation) { + return grpc::Status( + grpc::StatusCode::INTERNAL, + "gRPC command transaction received a null argument"); + } + const auto policy = + defaultGrpcMethodPolicyRegistry().find(full_method_name); + if (!policy.has_value() || !policy->mutating) { + return grpc::Status( + grpc::StatusCode::INTERNAL, + "gRPC command transaction requires a registered mutating method"); + } + + GrpcCommandTransaction transaction( + coordinator, call.context(), *policy, *request, *response); + if (!transaction.shouldExecute()) { + return transaction.status(); + } + try { + return transaction.finish(operation(transaction)); + } catch (const std::exception& error) { + return transaction.finishException(error.what()); + } catch (...) { + return transaction.finishException( + "command handler threw an unknown exception"); + } +} + +grpc::Status executeServerDerivedGrpcCommand( + const std::shared_ptr& gateway, + grpc::ServerContext* server_context, + safety::SafetyManager& coordinator, + const std::string& full_method_name, + GrpcMethodPolicy effective_policy, + const google::protobuf::Message* request, + google::protobuf::Message* response, + GrpcUnaryCommandOperation operation) +{ + const auto call = beginRegisteredGrpcCall( + gateway, server_context, full_method_name); + if (!call.allowed()) { + return call.status(); + } + if (!request || !response || !operation) { + return grpc::Status( + grpc::StatusCode::INTERNAL, + "server-derived gRPC command received a null argument"); + } + const auto registered = + defaultGrpcMethodPolicyRegistry().find(full_method_name); + if (!registered.has_value() || !registered->mutating || + effective_policy.full_method_name != full_method_name || + !effective_policy.mutating || + effective_policy.policy_family != registered->policy_family) { + return grpc::Status( + grpc::StatusCode::INTERNAL, + "server-derived gRPC command policy is inconsistent with the registered method"); + } + const bool valid_safety_lane = + !effective_policy.safety_lane || + effective_policy.command_intent == safety::CommandIntent::Stop || + effective_policy.command_intent == safety::CommandIntent::ResetFault || + effective_policy.command_intent == + safety::CommandIntent::RecoverAdmission; + if (!valid_safety_lane) { + return grpc::Status( + grpc::StatusCode::INTERNAL, + "server-derived gRPC command has an invalid safety lane"); + } + + GrpcCommandTransaction transaction( + coordinator, + call.context(), + std::move(effective_policy), + *request, + *response); + if (!transaction.shouldExecute()) { + return transaction.status(); + } + try { + return transaction.finish(operation(transaction)); + } catch (const std::exception& error) { + return transaction.finishException(error.what()); + } catch (...) { + return transaction.finishException( + "server-derived command handler threw an unknown exception"); + } +} + +} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/src/grpc_security.cpp b/cmvr-es/service/grpc/server/src/grpc_security.cpp new file mode 100644 index 00000000..62e92016 --- /dev/null +++ b/cmvr-es/service/grpc/server/src/grpc_security.cpp @@ -0,0 +1,691 @@ +#include "service/grpc/server/include/grpc_security.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cmvr::service { + +namespace { + +constexpr std::size_t kMaxCorrelationIdLength = 64; +std::atomic next_correlation_id{1}; + +bool isSafeCorrelationId(const std::string& value) +{ + if (value.empty() || value.size() > kMaxCorrelationIdLength) { + return false; + } + return std::all_of( + value.begin(), value.end(), [](const unsigned char character) { + return std::isalnum(character) || character == '-' || + character == '_' || character == '.' || character == ':'; + }); +} + +std::string makeCorrelationId() +{ + const auto sequence = + next_correlation_id.fetch_add(1, std::memory_order_relaxed); + const auto now = std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()).count(); + std::ostringstream output; + output << "grpc-" << std::hex << now << '-' << sequence; + return output.str(); +} + +std::string correlationIdFrom( + const std::multimap& metadata) +{ + const auto range = metadata.equal_range("x-correlation-id"); + if (range.first != range.second && + std::next(range.first) == range.second && + isSafeCorrelationId(range.first->second)) { + return range.first->second; + } + return makeCorrelationId(); +} + +bool roleAllows(const GrpcPrincipal& principal, const GrpcRole required) +{ + const auto rank = [](const GrpcRole role) { + switch (role) { + case GrpcRole::Anonymous: return 0; + case GrpcRole::Observer: return 1; + case GrpcRole::Operator: return 2; + case GrpcRole::SafetyAdmin: return 3; + } + return -1; + }; + return std::any_of( + principal.roles.begin(), principal.roles.end(), + [&](const GrpcRole role) { return rank(role) >= rank(required); }); +} + +GrpcCallFacts factsFrom( + grpc::ServerContext* context, + const GrpcMethodPolicy& method, + const bool encrypted) +{ + GrpcCallFacts facts; + facts.full_method_name = method.full_method_name; + facts.transport_encrypted = encrypted; + facts.received_at = std::chrono::steady_clock::now(); + facts.deadline = std::chrono::steady_clock::time_point::max(); + + if (context) { + facts.peer = context->peer(); + for (const auto& [key, value] : context->client_metadata()) { + facts.metadata.emplace( + std::string(key.data(), key.size()), + std::string(value.data(), value.size())); + } + + const auto deadline = context->deadline(); + if (deadline != std::chrono::system_clock::time_point::max()) { + const auto remaining = deadline - std::chrono::system_clock::now(); + facts.deadline = remaining <= decltype(remaining)::zero() + ? facts.received_at + : facts.received_at + + std::chrono::duration_cast< + std::chrono::steady_clock::duration>( + remaining); + } + } + + facts.local_peer = isLocalGrpcPeer(facts.peer); + facts.correlation_id = correlationIdFrom(facts.metadata); + return facts; +} + +} // namespace + +bool isLoopbackGrpcHost(const std::string& host) noexcept +{ + return host == "127.0.0.1" || host == "localhost" || host == "::1" || + host == "[::1]" || host.rfind("unix:", 0) == 0; +} + +bool isLocalGrpcPeer(const std::string& peer) noexcept +{ + return peer.rfind("unix:", 0) == 0 || + peer.rfind("ipv4:127.", 0) == 0 || + peer == "ipv6:[::1]" || peer == "ipv6:::1"; +} + +const char* toString(const GrpcTransportSecurity value) noexcept +{ + switch (value) { + case GrpcTransportSecurity::Insecure: return "insecure"; + case GrpcTransportSecurity::ServerTls: return "server_tls"; + case GrpcTransportSecurity::MutualTls: return "mutual_tls"; + } + return "unknown"; +} + +const char* toString(const GrpcAuthenticationMethod value) noexcept +{ + switch (value) { + case GrpcAuthenticationMethod::Disabled: return "disabled"; + case GrpcAuthenticationMethod::StaticToken: return "static_token"; + case GrpcAuthenticationMethod::Jwt: return "jwt"; + case GrpcAuthenticationMethod::TlsClientCertificate: + return "tls_client_certificate"; + } + return "unknown"; +} + +const char* toString(const GrpcRecoveryExposure value) noexcept +{ + switch (value) { + case GrpcRecoveryExposure::Disabled: return "disabled"; + case GrpcRecoveryExposure::LocalOnly: return "local_only"; + case GrpcRecoveryExposure::Authorized: return "authorized"; + } + return "unknown"; +} + +const char* toString(const GrpcRole value) noexcept +{ + switch (value) { + case GrpcRole::Anonymous: return "anonymous"; + case GrpcRole::Observer: return "observer"; + case GrpcRole::Operator: return "operator"; + case GrpcRole::SafetyAdmin: return "safety_admin"; + } + return "unknown"; +} + +GrpcSecurityConfigResult resolveGrpcSecurityConfig( + const config::GRPCServerConfig& server_config, + const std::string& effective_host) +{ + GrpcSecurityConfigResult result; + const bool loopback = isLoopbackGrpcHost(effective_host); + + if (!server_config.has_security()) { + result.valid = true; + result.config.transport = GrpcTransportSecurity::Insecure; + result.config.authentication = GrpcAuthenticationMethod::Disabled; + result.config.recovery_exposure = GrpcRecoveryExposure::Disabled; + result.config.allow_insecure_non_loopback = !loopback; + result.config.insecure_non_loopback = !loopback; + result.config.legacy_compatibility = true; + result.warnings.emplace_back( + "missing grpc security config: using one-release legacy " + "INSECURE/DISABLED compatibility with recovery disabled"); + return result; + } + + const auto& security = server_config.security(); + if (security.transport_mode() != config::GRPCSecurityConfig::INSECURE) { + result.error = + "only INSECURE gRPC transport is compiled in this release"; + return result; + } + result.config.transport = GrpcTransportSecurity::Insecure; + + if (security.authentication_mode() != + config::GRPCSecurityConfig::DISABLED) { + result.error = + "only DISABLED gRPC authentication is compiled in this release"; + return result; + } + result.config.authentication = GrpcAuthenticationMethod::Disabled; + + switch (security.recovery_exposure()) { + case config::GRPCSecurityConfig::RECOVERY_DISABLED: + result.config.recovery_exposure = GrpcRecoveryExposure::Disabled; + break; + case config::GRPCSecurityConfig::RECOVERY_LOCAL_ONLY: + result.config.recovery_exposure = GrpcRecoveryExposure::LocalOnly; + break; + case config::GRPCSecurityConfig::RECOVERY_AUTHORIZED: + result.error = + "RECOVERY_AUTHORIZED requires an implemented authentication " + "provider"; + return result; + case config::GRPCSecurityConfig::RECOVERY_EXPOSURE_UNSPECIFIED: + default: + result.error = "grpc recovery exposure must be explicit"; + return result; + } + result.config.recovery_audit_file = security.audit_file(); + if (result.config.recovery_exposure != + GrpcRecoveryExposure::Disabled && + result.config.recovery_audit_file.empty()) { + result.error = + "an enabled recovery RPC requires a persistent audit_file"; + return result; + } + + result.config.allow_insecure_non_loopback = + security.allow_insecure_non_loopback(); + result.config.insecure_non_loopback = !loopback; + if (!loopback && !security.allow_insecure_non_loopback()) { + result.error = + "INSECURE/DISABLED gRPC on a non-loopback host requires " + "allow_insecure_non_loopback=true"; + return result; + } + if (!loopback) { + result.warnings.emplace_back( + "gRPC is listening without transport encryption or client " + "authentication on a non-loopback host"); + } + + result.valid = true; + return result; +} + +GrpcAuthenticationResult DisabledGrpcAuthenticationProvider::authenticate( + const GrpcCallFacts&) const +{ + GrpcAuthenticationResult result; + result.principal.id = "anonymous"; + result.principal.method = GrpcAuthenticationMethod::Disabled; + result.principal.authenticated = false; + result.principal.roles = {GrpcRole::Anonymous}; + result.status = grpc::Status::OK; + return result; +} + +CompatibilityGrpcAuthorizationPolicy::CompatibilityGrpcAuthorizationPolicy( + const GrpcRecoveryExposure recovery_exposure) + : recovery_exposure_(recovery_exposure) +{ +} + +GrpcAuthorizationDecision CompatibilityGrpcAuthorizationPolicy::authorize( + const GrpcRequestContext& context, + const GrpcMethodPolicy& method) const +{ + if (method.access == GrpcAccessClass::Recover) { + switch (recovery_exposure_) { + case GrpcRecoveryExposure::Disabled: + return { + false, + grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, + "RECOVERY_RPC_DISABLED")}; + case GrpcRecoveryExposure::LocalOnly: + if (!context.local_peer) { + return { + false, + grpc::Status( + grpc::StatusCode::PERMISSION_DENIED, + "RecoverSafetyState is restricted to a local peer")}; + } + return {true, grpc::Status::OK}; + case GrpcRecoveryExposure::Authorized: + if (!context.principal.authenticated || + !roleAllows(context.principal, GrpcRole::SafetyAdmin)) { + return { + false, + grpc::Status( + context.principal.authenticated + ? grpc::StatusCode::PERMISSION_DENIED + : grpc::StatusCode::UNAUTHENTICATED, + "RecoverSafetyState requires SafetyAdmin")}; + } + return {true, grpc::Status::OK}; + } + } + + if (!context.principal.authenticated && + context.principal.method == GrpcAuthenticationMethod::Disabled) { + return {true, grpc::Status::OK}; + } + if (!context.principal.authenticated) { + return { + false, + grpc::Status( + grpc::StatusCode::UNAUTHENTICATED, + "gRPC caller authentication failed")}; + } + if (!roleAllows(context.principal, method.minimum_role)) { + return { + false, + grpc::Status( + grpc::StatusCode::PERMISSION_DENIED, + "gRPC caller does not have the required role")}; + } + return {true, grpc::Status::OK}; +} + +bool GrpcMethodPolicyRegistry::registerPolicy(GrpcMethodPolicy policy) +{ + if (policy.full_method_name.empty()) { + return false; + } + return policies_.emplace(policy.full_method_name, std::move(policy)).second; +} + +std::optional GrpcMethodPolicyRegistry::find( + const std::string& full_method_name) const +{ + const auto found = policies_.find(full_method_name); + if (found == policies_.end()) { + return std::nullopt; + } + return found->second; +} + +std::vector GrpcMethodPolicyRegistry::snapshot() const +{ + std::vector result; + result.reserve(policies_.size()); + for (const auto& [name, policy] : policies_) { + (void)name; + result.push_back(policy); + } + std::sort( + result.begin(), result.end(), + [](const auto& lhs, const auto& rhs) { + return lhs.full_method_name < rhs.full_method_name; + }); + return result; +} + +const GrpcMethodPolicyRegistry& defaultGrpcMethodPolicyRegistry() +{ + static const GrpcMethodPolicyRegistry registry = [] { + GrpcMethodPolicyRegistry result; + const auto add = [&result]( + const char* service, + const char* method, + const GrpcAccessClass access, + const safety::CommandIntent intent, + const safety::SafetyPolicyFamily family, + const bool mutating, + const bool safety_lane = false) { + GrpcRole role = GrpcRole::Observer; + if (access == GrpcAccessClass::Mutate || + access == GrpcAccessClass::Stop) { + role = GrpcRole::Operator; + } else if (access == GrpcAccessClass::Recover) { + role = GrpcRole::SafetyAdmin; + } + GrpcMethodPolicy policy; + policy.full_method_name = + std::string("/cmvr.api.") + service + '/' + method; + policy.access = access; + policy.minimum_role = role; + policy.command_intent = intent; + policy.policy_family = family; + policy.mutating = mutating; + policy.safety_lane = safety_lane; + if (!result.registerPolicy(std::move(policy))) { + throw std::logic_error( + std::string("duplicate gRPC method policy: ") + + service + '/' + method); + } + }; + const auto add_many = [&add]( + const char* service, + const std::initializer_list methods, + const GrpcAccessClass access, + const safety::CommandIntent intent, + const safety::SafetyPolicyFamily family, + const bool mutating, + const bool safety_lane = false) { + for (const auto* method : methods) { + add(service, method, access, intent, family, mutating, + safety_lane); + } + }; + + using safety::CommandIntent; + using safety::SafetyPolicyFamily; + add_many("SystemService", + {"GetSystemInfo", "GetSystemStatus", "GetDeviceList", + "GetSafetyState"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Sensor, false); + add("SystemService", "UpdateParams", GrpcAccessClass::Mutate, + CommandIntent::Configure, SafetyPolicyFamily::Sensor, true); + add("SystemService", "StopAll", GrpcAccessClass::Stop, + CommandIntent::Stop, SafetyPolicyFamily::Control, true, true); + add("SystemService", "ExecuteActionQueue", GrpcAccessClass::Mutate, + CommandIntent::Actuate, SafetyPolicyFamily::Control, true); + add("SystemService", "RecoverSafetyState", GrpcAccessClass::Recover, + CommandIntent::RecoverAdmission, SafetyPolicyFamily::Control, + true, true); + add("SystemService", "RestoreOperationalState", + GrpcAccessClass::Recover, CommandIntent::RecoverAdmission, + SafetyPolicyFamily::Control, true, true); + + add_many("ArmService", + {"getJointState", "getPose", "getPoseMatrix", + "computeForwardKinematics"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Control, false); + add_many("ArmService", {"torqueOff", "stopMotion"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Control, true, true); + add("ArmService", "clearFault", GrpcAccessClass::Mutate, + CommandIntent::ResetFault, SafetyPolicyFamily::Control, true); + add("ArmService", "torqueOn", GrpcAccessClass::Mutate, + CommandIntent::StartActivity, SafetyPolicyFamily::Control, true); + add_many("ArmService", + {"moveJ", "moveL", "speedJ", "speedL", "servoJ"}, + GrpcAccessClass::Mutate, CommandIntent::Actuate, + SafetyPolicyFamily::Control, true); + add_many("ArmService", {"calibrateZeroQ", "ExecuteJsonCommand"}, + GrpcAccessClass::Mutate, CommandIntent::Configure, + SafetyPolicyFamily::Control, true); + add("armteleop.v1.ArmTeleopService", "Teleoperate", + GrpcAccessClass::Mutate, + CommandIntent::Actuate, SafetyPolicyFamily::Control, true); + + add_many("AgvService", + {"getRuntimeState", "getNavigationStatus", "listMaps", + "listStations", "downloadMap", "streamMap"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Control, false); + add_many("AgvService", + {"emergencyStop", "pauseNavigation", "cancelNavigation", + "stopVelocityControl", "stopMapping"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Control, true, true); + add("AgvService", "clearFault", GrpcAccessClass::Mutate, + CommandIntent::ResetFault, SafetyPolicyFamily::Control, true); + add("AgvService", "resumeNavigation", GrpcAccessClass::Mutate, + CommandIntent::StartActivity, SafetyPolicyFamily::Control, true); + add_many("AgvService", + {"navigateToPose", "navigateToStation", "followPath", + "setVelocity", "translate"}, + GrpcAccessClass::Mutate, CommandIntent::Actuate, + SafetyPolicyFamily::Control, true); + add_many("AgvService", + {"switchMap", "uploadMap", "startMapping", "relocalize"}, + GrpcAccessClass::Mutate, CommandIntent::Configure, + SafetyPolicyFamily::Control, true); + + add("MotorService", "getStatus", GrpcAccessClass::Read, + CommandIntent::Observe, SafetyPolicyFamily::Control, false); + add("MotorService", "emergencyStop", GrpcAccessClass::Stop, + CommandIntent::Stop, SafetyPolicyFamily::Control, true, true); + add_many("MotorService", + {"moveToZero", "profilePosition", "profileVelocity", + "streamCyclicPosition", "streamCyclicVelocity"}, + GrpcAccessClass::Mutate, CommandIntent::Actuate, + SafetyPolicyFamily::Control, true); + add_many("MotorService", {"setZero", "setEnabled"}, + GrpcAccessClass::Mutate, CommandIntent::Configure, + SafetyPolicyFamily::Control, true); + + add_many("DexHandService", + {"GetStatus", "GetSensorData", "GetSensorDataStream"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Control, false); + add_many("DexHandService", + {"SetDexHandPos", "SetDexHandAngle", "SetDexHandForce", + "SetDexHandSpeed", "SetDexHandPresetAct"}, + GrpcAccessClass::Mutate, CommandIntent::Actuate, + SafetyPolicyFamily::Control, true); + + add_many("CameraService", + {"GetStatus", "GetRGBImage", "GetDepthImage", + "GetRGBDImages", "GetRGBImageStream", + "GetDepthImageStream", "GetRGBDImagesStream"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Sensor, false); + add_many("CameraService", {"StartCamera", "StartRecording"}, + GrpcAccessClass::Mutate, CommandIntent::StartActivity, + SafetyPolicyFamily::Sensor, true); + add_many("CameraService", {"StopCamera", "StopRecording"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Sensor, true, true); + add("CameraService", "ControlPtz", GrpcAccessClass::Mutate, + CommandIntent::Actuate, SafetyPolicyFamily::Control, true); + + add_many("MicPhoneService", {"GetStatus", "StreamAudio", "GetVolume"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Sensor, false); + add_many("MicPhoneService", {"StartRecord", "ResumeRecord"}, + GrpcAccessClass::Mutate, CommandIntent::StartActivity, + SafetyPolicyFamily::Sensor, true); + add_many("MicPhoneService", {"StopRecord", "PauseRecord"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Sensor, true, true); + add("MicPhoneService", "SetVolume", GrpcAccessClass::Mutate, + CommandIntent::Configure, SafetyPolicyFamily::Sensor, true); + + add_many("SpeakerService", {"GetStatus", "GetVolume"}, + GrpcAccessClass::Read, CommandIntent::Observe, + SafetyPolicyFamily::Sensor, false); + add_many("SpeakerService", + {"PlayAudio", "StreamAudio", "ResumePlayback"}, + GrpcAccessClass::Mutate, CommandIntent::StartActivity, + SafetyPolicyFamily::Sensor, true); + add_many("SpeakerService", {"StopPlayback", "PausePlayback"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Sensor, true, true); + add("SpeakerService", "SetVolume", GrpcAccessClass::Mutate, + CommandIntent::Configure, SafetyPolicyFamily::Sensor, true); + + add("BioHeadService", "GetSystemStatus", GrpcAccessClass::Read, + CommandIntent::Observe, SafetyPolicyFamily::Control, false); + add_many("BioHeadService", {"EmergencyStop", "SpeakStop"}, + GrpcAccessClass::Stop, CommandIntent::Stop, + SafetyPolicyFamily::Control, true, true); + add_many("BioHeadService", + {"SetExpression", "StreamExpression", "SpeakStart", + "Happy", "Surprise", "ExpressionTired", + "ExpressionAngry", "ExpressionSadness", + "ExpressionYawn"}, + GrpcAccessClass::Mutate, CommandIntent::Actuate, + SafetyPolicyFamily::Control, true); + + add("HlcService", "touch", GrpcAccessClass::Mutate, + CommandIntent::Actuate, SafetyPolicyFamily::Control, true); + add("TestService", "Call", GrpcAccessClass::Read, + CommandIntent::Observe, SafetyPolicyFamily::Sensor, false); + return result; + }(); + return registry; +} + +GrpcCallGuard::GrpcCallGuard( + GrpcRequestContext context, + GrpcAuthorizationDecision decision) + : context_(std::move(context)), decision_(std::move(decision)) +{ +} + +GrpcSecurityGateway::GrpcSecurityGateway( + GrpcSecurityRuntimeConfig config, + std::shared_ptr authentication, + std::shared_ptr authorization, + GrpcSecurityAuditSink audit_sink) + : config_(std::move(config)), + authentication_(std::move(authentication)), + authorization_(std::move(authorization)), + audit_sink_(std::move(audit_sink)) +{ +} + +GrpcCallGuard GrpcSecurityGateway::beginCall( + grpc::ServerContext* server_context, + const GrpcMethodPolicy& method) const +{ + return beginCall( + factsFrom( + server_context, method, + config_.transport != GrpcTransportSecurity::Insecure), + method); +} + +GrpcCallGuard GrpcSecurityGateway::beginCall( + GrpcCallFacts facts, + const GrpcMethodPolicy& method) const +{ + if (facts.full_method_name.empty()) { + facts.full_method_name = method.full_method_name; + } + if (facts.received_at == std::chrono::steady_clock::time_point{}) { + facts.received_at = std::chrono::steady_clock::now(); + } + if (facts.deadline == std::chrono::steady_clock::time_point{}) { + facts.deadline = std::chrono::steady_clock::time_point::max(); + } + if (facts.correlation_id.empty()) { + facts.correlation_id = correlationIdFrom(facts.metadata); + } + if (!facts.local_peer) { + facts.local_peer = isLocalGrpcPeer(facts.peer); + } + + const auto authentication = authentication_->authenticate(facts); + GrpcRequestContext context{ + facts.correlation_id, + facts.full_method_name, + facts.peer, + authentication.principal, + facts.transport_encrypted, + facts.local_peer, + facts.received_at, + facts.deadline}; + + GrpcAuthorizationDecision decision; + if (!authentication.ok()) { + decision = {false, authentication.status}; + } else { + decision = authorization_->authorize(context, method); + } + + if (audit_sink_) { + audit_sink_(GrpcSecurityAuditRecord{ + context.correlation_id, + context.full_method_name, + context.principal.id, + context.peer, + context.principal.method, + method.access, + context.principal.authenticated, + decision.allowed, + decision.status.error_code()}); + } + return GrpcCallGuard(std::move(context), std::move(decision)); +} + +std::shared_ptr makeGrpcSecurityGateway( + const GrpcSecurityRuntimeConfig& config, + GrpcSecurityAuditSink audit_sink) +{ + return std::make_shared( + config, + std::make_shared(), + std::make_shared( + config.recovery_exposure), + std::move(audit_sink)); +} + +std::shared_ptr makeDefaultGrpcSecurityGateway() +{ + GrpcSecurityRuntimeConfig config; + config.transport = GrpcTransportSecurity::Insecure; + config.authentication = GrpcAuthenticationMethod::Disabled; + config.recovery_exposure = GrpcRecoveryExposure::Disabled; + config.legacy_compatibility = true; + return makeGrpcSecurityGateway(config); +} + +GrpcCallGuard beginRegisteredGrpcCall( + const std::shared_ptr& gateway, + grpc::ServerContext* server_context, + const std::string& full_method_name) +{ + const auto policy = + defaultGrpcMethodPolicyRegistry().find(full_method_name); + if (!policy.has_value()) { + GrpcRequestContext context; + context.full_method_name = full_method_name; + context.received_at = std::chrono::steady_clock::now(); + context.deadline = std::chrono::steady_clock::time_point::max(); + if (server_context) { + context.peer = server_context->peer(); + context.local_peer = isLocalGrpcPeer(context.peer); + } + return GrpcCallGuard( + std::move(context), + {false, + grpc::Status( + grpc::StatusCode::INTERNAL, + "gRPC method has no registered security policy")}); + } + const auto active_gateway = + gateway ? gateway : makeDefaultGrpcSecurityGateway(); + return active_gateway->beginCall(server_context, *policy); +} + +} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/src/grpc_system_service.cpp b/cmvr-es/service/grpc/server/src/grpc_system_service.cpp new file mode 100644 index 00000000..a8c619a5 --- /dev/null +++ b/cmvr-es/service/grpc/server/src/grpc_system_service.cpp @@ -0,0 +1,2349 @@ +// +// Created by xtkuang on 2025/6/6. +// + +#include "../include/grpc_system_service.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/base/logging/logger.h" +#include "devices/agv/abstract_agv.h" +#include "devices/arm/robot_arm.h" +#include "devices/biohead/abstract_biohead.h" +#include "devices/camera/abstract_camera.h" +#include "devices/dexhand/abstract_dexhand.h" +#include "devices/gripper/abstract_gripper.h" +#include "devices/microphone/abstract_microphone.h" +#include "devices/speaker/abstract_speaker.h" +#include "manager/control_authority_manager/include/control_authority_manager.h" +#include "manager/media_source_manager/include/device_media_source_adapter.h" +#include "manager/task_manager/include/task_manager.h" +#include "service/grpc/action/include/action_queue_executor.h" +#include "service/grpc/server/include/camera_operational_activity_registry.h" +#include "service/grpc/server/include/camera_ptz_activity_registry.h" +#include "service/grpc/server/include/grpc_recovery_audit.h" +#include "service/grpc/server/include/grpc_safety_proto.h" +#include "service/grpc/server/include/grpc_safety_participants.h" +#include "service/grpc/server/include/grpc_security.h" +#include "service/grpc/server/include/media_activity_coordinator.h" +#include "service/grpc/server/include/motor_activity_coordinator.h" +#include "service/grpc/stop_all/include/stop_all_admission_gate.h" +#include "service/grpc/stop_all/include/stop_operation_dispatcher.h" + +using namespace cmvr::device; +using namespace cmvr::service; + +namespace { + +class ScopedControlBarrierSet final { +public: + ~ScopedControlBarrierSet() + { + auto& authority = + cmvr::control::ControlAuthorityManager::instance(); + for (const auto& barrier : barriers_) { + if (barrier.release_on_destroy) { + authority.release(barrier.token); + } else { + (void)authority.retireSafetyHolder(barrier.token); + } + } + } + + bool acquire(const std::string& device_id, std::string& detail) + { + cmvr::control::ControlLeaseToken ignored; + return acquire(device_id, detail, ignored); + } + + bool acquire( + const std::string& device_id, + std::string& detail, + cmvr::control::ControlLeaseToken& token) + { + static std::atomic sequence{0}; + const std::string owner = + "grpc-system:stop-all:" + + std::to_string( + sequence.fetch_add(1U, std::memory_order_relaxed) + 1U); + const auto result = + cmvr::control::ControlAuthorityManager::instance() + .preemptAcquire( + device_id, + owner, + std::chrono::duration_cast< + cmvr::control::ControlAuthorityManager::Duration>( + std::chrono::hours(24))); + if (!result.acquired) { + detail = result.detail; + return false; + } + // StopAll barriers default to fail-closed. If retaining the token in + // this local vector throws, retire the manager-side holder so a later + // successful StopAll can recover it without reopening control now. + try { + barriers_.push_back({result.token, false}); + } catch (...) { + (void)cmvr::control::ControlAuthorityManager::instance() + .retireSafetyHolder(result.token); + throw; + } + token = result.token; + return true; + } + + bool waitForPreemptedRelease( + const std::string& device_id, + const std::chrono::milliseconds timeout) + { + const auto* barrier = find_(device_id); + return barrier && + cmvr::control::ControlAuthorityManager::instance() + .waitForPreemptedRelease(barrier->token, timeout); + } + + bool recoverRetiredSafetyHolders(const std::string& device_id) + { + const auto* barrier = find_(device_id); + return barrier && + cmvr::control::ControlAuthorityManager::instance() + .recoverRetiredSafetyHolders(barrier->token); + } + + void quarantine(const std::string& device_id) + { + auto& authority = + cmvr::control::ControlAuthorityManager::instance(); + for (auto& barrier : barriers_) { + if (barrier.token.resource_id == device_id) { + (void)authority.retireSafetyHolder(barrier.token); + barrier.release_on_destroy = false; + } + } + } + + void quarantineAll() + { + auto& authority = + cmvr::control::ControlAuthorityManager::instance(); + for (auto& barrier : barriers_) { + (void)authority.retireSafetyHolder(barrier.token); + barrier.release_on_destroy = false; + } + } + + void confirmSafeToReleaseAll() + { + for (auto& barrier : barriers_) { + barrier.release_on_destroy = true; + } + } + + bool empty() const noexcept { return barriers_.empty(); } + + void recoverRetiredSafetyHoldersAll() + { + for (const auto& barrier : barriers_) { + if (!recoverRetiredSafetyHolders( + barrier.token.resource_id)) { + throw std::runtime_error( + "StopAll could not recover an earlier failed safety " + "barrier: " + barrier.token.resource_id); + } + } + } + + void releaseAll() noexcept + { + auto& authority = + cmvr::control::ControlAuthorityManager::instance(); + for (const auto& barrier : barriers_) { + authority.release(barrier.token); + } + barriers_.clear(); + } + +private: + struct Barrier { + cmvr::control::ControlLeaseToken token; + bool release_on_destroy{false}; + }; + + const Barrier* find_(const std::string& device_id) const noexcept + { + for (const auto& barrier : barriers_) { + if (barrier.token.resource_id == device_id) { + return &barrier; + } + } + return nullptr; + } + + std::vector barriers_; +}; + +class ScopedMotorStopAll final { +public: + ScopedMotorStopAll() + : coordinator_(globalMotorActivityCoordinator()), + ticket_(coordinator_.beginStopAll(true)) + { + } + + ~ScopedMotorStopAll() + { + if (ticket_.valid() && !completed_) { + (void)coordinator_.finishStopAll(ticket_, false); + } + } + + bool valid() const noexcept { return ticket_.valid(); } + + bool stopAndWait( + const std::chrono::milliseconds timeout, + std::string* error) + { + return ticket_.valid() && + coordinator_.stopAndWait(ticket_, timeout, error); + } + + bool requestStop(std::string* error) + { + return ticket_.valid() && coordinator_.requestStop(ticket_, error); + } + + bool collectStopOperations( + std::vector& operations, + std::string* error) + { + return ticket_.valid() && + coordinator_.collectStopOperations(ticket_, operations, error); + } + + bool waitForStopped( + const std::chrono::milliseconds timeout, + std::string* error) + { + return ticket_.valid() && + coordinator_.waitForStopped(ticket_, timeout, error); + } + + bool complete(const bool all_motors_stopped) + { + if (!ticket_.valid() || completed_) { + return false; + } + const bool completed = coordinator_.finishStopAll( + ticket_, all_motors_stopped); + completed_ = completed; + return completed; + } + +private: + MotorActivityCoordinator& coordinator_; + MotorActivityCoordinator::StopAllTicket ticket_; + bool completed_{false}; +}; + +class ScopedActionQueueStopAll final { +public: + explicit ScopedActionQueueStopAll( + cmvr::service::ActionQueueExecutor& executor) + : executor_(executor), ticket_(executor_.beginStopAll(true)) + { + } + + ~ScopedActionQueueStopAll() + { + if (ticket_.valid() && !completed_) { + (void)executor_.finishStopAll(ticket_, false); + } + } + + bool valid() const noexcept { return ticket_.valid(); } + + bool complete(const bool all_devices_stop_confirmed) + { + if (!ticket_.valid() || completed_) { + return false; + } + const bool completed = executor_.finishStopAll( + ticket_, all_devices_stop_confirmed); + completed_ = completed; + return completed; + } + +private: + cmvr::service::ActionQueueExecutor& executor_; + cmvr::service::ActionQueueExecutor::StopAllTicket ticket_; + bool completed_{false}; +}; + +class ScopedMediaStopAll final { +public: + ScopedMediaStopAll() + : coordinator_(cmvr::service::globalMediaActivityCoordinator()), + ticket_(coordinator_.beginStopAll(true)) + { + } + + ~ScopedMediaStopAll() + { + if (ticket_.valid() && !completed_) { + (void)coordinator_.finishStopAll(ticket_, false); + } + } + + bool valid() const noexcept { return ticket_.valid(); } + + bool waitForStopped(const std::chrono::milliseconds timeout) + { + return ticket_.valid() && + coordinator_.waitForStopped(ticket_, timeout); + } + + bool requestCancellation() + { + return ticket_.valid() && coordinator_.requestCancellation(ticket_); + } + + bool collectCancellationOperations( + std::vector& operations, + std::string* error) + { + return ticket_.valid() && + coordinator_.collectCancellationOperations( + ticket_, operations, error); + } + + bool complete(const bool all_media_stopped) + { + if (!ticket_.valid() || completed_) { + return false; + } + const bool completed = + coordinator_.finishStopAll(ticket_, all_media_stopped); + completed_ = completed; + return completed; + } + +private: + cmvr::service::MediaActivityCoordinator& coordinator_; + cmvr::service::MediaActivityCoordinator::StopAllTicket ticket_; + bool completed_{false}; +}; + +class ScopedAdmissionStopAll final { +public: + ScopedAdmissionStopAll() + : gate_(globalStopAllAdmissionGate()), + ticket_(gate_.beginStopAll()) + { + } + + ~ScopedAdmissionStopAll() + { + if (ticket_.valid() && !completed_) { + (void)gate_.finishStopAll(ticket_, false); + } + } + + bool valid() const noexcept { return ticket_.valid(); } + + bool complete(const bool all_domains_stop_confirmed) + { + if (!ticket_.valid() || completed_) { + return false; + } + const auto result = gate_.finishStopAllDetailed( + ticket_, all_domains_stop_confirmed); + completed_ = result.ticket_consumed; + return result.admission_reopened; + } + +private: + StopAllAdmissionGate& gate_; + StopAllAdmissionGate::StopAllTicket ticket_; + bool completed_{false}; +}; + +std::uint64_t unixTimeMs() noexcept +{ + const auto elapsed = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()); + return elapsed.count() > 0 + ? static_cast(elapsed.count()) + : 0U; +} + +std::chrono::milliseconds remainingStopBudget( + const std::chrono::steady_clock::time_point deadline) noexcept +{ + const auto now = std::chrono::steady_clock::now(); + if (now >= deadline) { + return std::chrono::milliseconds::zero(); + } + return std::chrono::duration_cast( + deadline - now); +} + +std::timed_mutex& processStopAllMutex() +{ + // SystemService is expected to be unique, but keeping the mutex at process + // scope also protects test, reload, and accidental multi-instance paths + // from issuing overlapping whole-device stop rounds. + static std::timed_mutex mutex; + return mutex; +} + +using StopDispatcher = cmvr::service::StopOperationDispatcher; +using StopHandle = StopDispatcher::Handle; +using StopOutcome = StopDispatcher::OperationResult; + +struct ProcessStopDispatcherRegistry final { + std::mutex mutex; + std::condition_variable available; + std::weak_ptr dispatcher; + bool destroying{false}; +}; + +ProcessStopDispatcherRegistry& processStopDispatcherRegistry() +{ + static ProcessStopDispatcherRegistry registry; + return registry; +} + +void acquireProcessStopDispatcher( + std::shared_ptr& owner) +{ + auto& registry = processStopDispatcherRegistry(); + std::unique_lock lock(registry.mutex); + registry.available.wait( + lock, [®istry] { return !registry.destroying; }); + if (auto existing = registry.dispatcher.lock()) { + owner = std::move(existing); + return; + } + + owner = std::make_shared(); + registry.dispatcher = owner; +} + +void releaseProcessStopDispatcher( + std::shared_ptr& owner) noexcept +{ + if (!owner) { + return; + } + + auto& registry = processStopDispatcherRegistry(); + std::unique_lock lock(registry.mutex); + if (owner.use_count() > 1) { + owner.reset(); + return; + } + + // Do not admit a replacement while the last dispatcher is joining a + // worker which may still be inside a device driver. + registry.destroying = true; + registry.dispatcher.reset(); + registry.available.notify_all(); + auto last_owner = std::move(owner); + lock.unlock(); + last_owner.reset(); + lock.lock(); + registry.destroying = false; + lock.unlock(); + registry.available.notify_all(); +} + +class StopDeadlineDetail final { +public: + void publishInitial(std::string detail) + { + std::lock_guard lock(mutex_); + detail_ = std::move(detail); + } + + void publishUntil( + const StopDispatcher::Deadline deadline, + std::string detail) + { + std::lock_guard lock(mutex_); + if (StopDispatcher::Clock::now() < deadline) { + detail_ = std::move(detail); + } + } + + std::string snapshot() const + { + std::lock_guard lock(mutex_); + return detail_; + } + +private: + mutable std::mutex mutex_; + std::string detail_; +}; + +struct StopHandleEntry final { + std::string device_id; + StopHandle handle; + bool control_resource{false}; + bool require_success{true}; +}; + +std::string stopResourceKey(const std::string& device_id) +{ + return "device:" + device_id; +} + +void appendFailure( + std::vector& failures, + const std::string& subject, + const std::string& detail) +{ + failures.push_back( + subject + ": " + + (detail.empty() ? "operational stop was not confirmed" : detail)); +} + +bool waitForStopOperations( + const std::vector& operations, + const StopDispatcher::Deadline deadline, + ScopedControlBarrierSet& control_barriers, + std::vector& failures, + std::unordered_set* completed_devices = nullptr) +{ + bool all_succeeded = true; + for (const auto& operation : operations) { + const auto outcome = operation.handle.waitUntil(deadline); + if (outcome.completed && completed_devices) { + completed_devices->emplace(operation.device_id); + } + if (outcome.completed && outcome.result) { + continue; + } + if (outcome.completed && !operation.require_success) { + CMVR_LOG(WARNING) + << "[gRPCSystemServiceImpl] (StopAll): initial stop was not " + "confirmed and will be retried, id=" + << operation.device_id << ", detail=" << outcome.detail; + continue; + } + + all_succeeded = false; + if (operation.control_resource) { + control_barriers.quarantine(operation.device_id); + } + appendFailure( + failures, + operation.device_id, + outcome.detail.empty() + ? "stop operation did not complete before the deadline" + : outcome.detail); + } + return all_succeeded; +} + +StopOutcome stopArm( + const std::shared_ptr& arm, + const bool final_confirmation) +{ + const auto result = arm->stopMotion(); + if (!result.ok()) { + return { + false, + std::string(final_confirmation ? "final " : "initial ") + + "RobotArm stop was not confirmed" + + (result.message.empty() ? "" : ": " + result.message)}; + } + if (final_confirmation) { + try { + if (arm->busy()) { + return {false, "RobotArm remained busy after final stop"}; + } + } catch (const std::exception& error) { + return { + false, + std::string("RobotArm idle confirmation threw: ") + + error.what()}; + } catch (...) { + return { + false, + "RobotArm idle confirmation threw an unknown exception"}; + } + } + return {true, {}}; +} + +bool agvStopResultAccepted(const cmvr::device::AgvResult& result) noexcept +{ + return result.ok() || + result.code == cmvr::device::AgvErrorCode::UnsupportedCommand; +} + +StopOutcome stopAgv( + const std::shared_ptr& agv, + const bool final_confirmation) +{ + const auto cancel = agv->cancelNavigation(); + const auto velocity = agv->stopVelocityControl(); + const auto mapping = agv->stopMapping(); + const auto stopped = agv->confirmMotionStopped(); + + if (final_confirmation && + (!agvStopResultAccepted(cancel) || + !agvStopResultAccepted(velocity) || + !agvStopResultAccepted(mapping) || !stopped.ok())) { + return {false, "final AGV operational stop was not confirmed"}; + } + if (!final_confirmation && !stopped.ok()) { + return { + false, + "initial AGV stopped state was not confirmed" + + (stopped.message.empty() ? "" : ": " + stopped.message)}; + } + return {true, {}}; +} + +StopOutcome stopDexHand( + const std::shared_ptr& hand, + const bool final_confirmation) +{ + if (!hand->stopOperationalActivity()) { + return { + false, + std::string(final_confirmation ? "final " : "initial ") + + "DexHand operational stop was not confirmed"}; + } + return {true, {}}; +} + +template +StopOutcome invokeStopOperation( + Operation&& operation, + const std::string& description) noexcept +{ + try { + return std::forward(operation)(); + } catch (const std::exception& error) { + return { + false, + description + " threw: " + error.what()}; + } catch (...) { + return { + false, + description + " threw an unknown exception"}; + } +} + +template +StopOutcome stopControlWithFence( + const cmvr::control::ControlLeaseToken& barrier, + const StopDispatcher::Deadline deadline, + InitialStop&& initial_stop, + FinalStop&& final_stop, + const std::string& description, + const std::shared_ptr& deadline_detail) +{ + deadline_detail->publishUntil( + deadline, + "initial " + description + + " stop did not complete before the StopAll deadline"); + const auto initial = invokeStopOperation( + std::forward(initial_stop), + "initial " + description + " stop"); + if (!initial.success) { + CMVR_LOG(WARNING) + << "[gRPCSystemServiceImpl] (StopAll): " << initial.detail; + } + + if (!barrier.valid()) { + return { + false, + description + + " safety barrier was unavailable after the initial stop"}; + } + + const std::string handler_timeout_detail = + "timed out waiting for the preempted " + description + + " control handler to exit"; + deadline_detail->publishUntil(deadline, handler_timeout_detail); + const bool handler_drained = + cmvr::control::ControlAuthorityManager::instance() + .waitForPreemptedRelease( + barrier, remainingStopBudget(deadline)); + if (handler_drained) { + deadline_detail->publishUntil( + deadline, + "final " + description + + " stop did not complete before the StopAll deadline"); + } + // This final typed stop remains mandatory even when the handler wait used + // the entire RPC budget. The dispatcher owns this worker past the RPC + // deadline, closing the race where an old handler resumes after the first + // stop while the safety barrier remains fail-closed. + const auto final = invokeStopOperation( + std::forward(final_stop), + "final " + description + " stop"); + if (!handler_drained) { + std::string detail = handler_timeout_detail; + if (!final.success) { + detail += "; " + + (final.detail.empty() + ? "final " + description + + " stop was not confirmed" + : final.detail); + } + return {false, std::move(detail)}; + } + return final; +} + +StopOutcome stopCameraActivities( + const std::string& device_id, + const std::shared_ptr& camera) +{ + std::vector failures; + bool stopped = cmvr::media::globalMediaSourceManager() + .stopSourcesForDevice(device_id, &failures); + if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice( + device_id, &failures)) { + stopped = false; + } + + try { + cmvr::device::CameraState state{}; + if (camera) { + camera->getState(state); + } + if (camera && state.is_recording) { + camera->stopRecording(); + camera->getState(state); + if (state.is_recording) { + stopped = false; + failures.push_back( + device_id + ": camera recording did not stop"); + } + } + } catch (const std::exception& error) { + stopped = false; + failures.push_back( + device_id + ": camera recording stop threw: " + error.what()); + } catch (...) { + stopped = false; + failures.push_back( + device_id + + ": camera recording stop threw an unknown exception"); + } + + if (!globalCameraOperationalActivityRegistry().stopActivitiesForDevice( + device_id, camera, &failures)) { + stopped = false; + } + return { + stopped, + failures.empty() + ? std::string{} + : "camera activities were not fully stopped: " + + failures.front()}; +} + +StopOutcome stopMicrophone( + const std::string& device_id, + const std::shared_ptr& microphone) +{ + std::vector failures; + bool stopped = cmvr::media::globalMediaSourceManager() + .stopSourcesForDevice(device_id, &failures); + try { + cmvr::device::MicrophoneState state{}; + microphone->getState(state); + if (state.is_recording) { + microphone->stopRecording(); + microphone->getState(state); + if (state.is_recording) { + stopped = false; + failures.push_back( + device_id + ": microphone recording did not stop"); + } + } + } catch (const std::exception& error) { + stopped = false; + failures.push_back( + device_id + ": microphone recording stop threw: " + + error.what()); + } catch (...) { + stopped = false; + failures.push_back( + device_id + + ": microphone recording stop threw an unknown exception"); + } + return { + stopped, + failures.empty() + ? std::string{} + : "microphone activities were not fully stopped: " + + failures.front()}; +} + +StopOutcome stopSpeaker( + const std::shared_ptr& speaker) +{ + return speaker->stopPlayback() + ? StopOutcome{true, {}} + : StopOutcome{false, "speaker playback did not stop"}; +} + +StopOutcome stopTrackedMediaActivities(const std::string& device_id) +{ + std::vector failures; + bool stopped = cmvr::media::globalMediaSourceManager() + .stopSourcesForDevice(device_id, &failures); + if (!globalCameraPtzActivityRegistry().stopActivitiesForDevice( + device_id, &failures)) { + stopped = false; + } + if (!globalCameraOperationalActivityRegistry().stopActivitiesForDevice( + device_id, &failures)) { + stopped = false; + } + return { + stopped, + failures.empty() + ? std::string{} + : "tracked media activities were not fully stopped: " + + failures.front()}; +} + +void mergeStopOutcome( + const StopOutcome& outcome, + bool& all_stopped, + std::vector& failures) +{ + if (outcome.success) { + return; + } + all_stopped = false; + failures.push_back( + outcome.detail.empty() + ? "operational stop was not confirmed" + : outcome.detail); +} + +template +StopOutcome stopOperationalDevice( + const std::shared_ptr& device, + const char* description); + +StopOutcome stopOtherActivities( + const std::string& device_id, + const std::shared_ptr& camera, + const std::shared_ptr& microphone, + const std::shared_ptr& speaker, + const std::shared_ptr& head, + const std::shared_ptr& gripper, + const bool tracked_media) +{ + bool all_stopped = true; + bool media_stopped_by_typed_device = false; + std::vector failures; + + if (camera) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopCameraActivities(device_id, camera); }, + "camera activity stop"), + all_stopped, failures); + media_stopped_by_typed_device = true; + } + if (microphone) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopMicrophone(device_id, microphone); }, + "microphone activity stop"), + all_stopped, failures); + media_stopped_by_typed_device = true; + } + if (tracked_media && !media_stopped_by_typed_device) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopTrackedMediaActivities(device_id); }, + "tracked media activity stop"), + all_stopped, failures); + } + if (speaker) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopSpeaker(speaker); }, + "speaker activity stop"), + all_stopped, failures); + } + if (head) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopOperationalDevice(head, "BioHead"); }, + "BioHead activity stop"), + all_stopped, failures); + } + if (gripper) { + mergeStopOutcome( + invokeStopOperation( + [&] { return stopOperationalDevice(gripper, "gripper"); }, + "gripper activity stop"), + all_stopped, failures); + } + + return { + all_stopped, + failures.empty() ? std::string{} : failures.front()}; +} + +StopOutcome stopTaskActivity( + const std::shared_ptr& task) +{ + if (!task) { + return {false, "task activity target was null"}; + } + return task->stopActivity() + ? StopOutcome{true, {}} + : StopOutcome{ + false, + "task " + task->id() + + " operational stop was not confirmed"}; +} + +void submitDeferredOperations( + StopDispatcher& dispatcher, + std::vector operations, + std::vector& handles) +{ + handles.reserve(handles.size() + operations.size()); + for (auto& operation : operations) { + const auto subject = operation.resource_key; + auto callback = std::move(operation.operation); + auto handle = dispatcher.submit( + operation.resource_key, + [callback = std::move(callback)]() mutable { + const auto result = callback(); + return StopOutcome{result.success, result.detail}; + }); + handles.push_back( + {subject, std::move(handle), false, true}); + } +} + +template +StopOutcome stopOperationalDevice( + const std::shared_ptr& device, + const char* description) +{ + return device->stopOperationalActivity() + ? StopOutcome{true, {}} + : StopOutcome{ + false, + std::string(description) + + " operational stop was not confirmed"}; +} + +cmvr::api::SystemDeviceType toApiDeviceType( + const cmvr::device::DeviceKind kind) noexcept +{ + switch (kind) { + case cmvr::device::DeviceKind::AGV: + return cmvr::api::SYSTEM_DEVICE_TYPE_AGV; + case cmvr::device::DeviceKind::Arm: + return cmvr::api::SYSTEM_DEVICE_TYPE_ARM; + case cmvr::device::DeviceKind::Battery: + return cmvr::api::SYSTEM_DEVICE_TYPE_BATTERY; + case cmvr::device::DeviceKind::BioHead: + return cmvr::api::SYSTEM_DEVICE_TYPE_BIO_HEAD; + case cmvr::device::DeviceKind::Camera: + return cmvr::api::SYSTEM_DEVICE_TYPE_CAMERA; + case cmvr::device::DeviceKind::CanBus: + return cmvr::api::SYSTEM_DEVICE_TYPE_CAN_BUS; + case cmvr::device::DeviceKind::DexHand: + return cmvr::api::SYSTEM_DEVICE_TYPE_DEX_HAND; + case cmvr::device::DeviceKind::Gripper: + return cmvr::api::SYSTEM_DEVICE_TYPE_GRIPPER; + case cmvr::device::DeviceKind::Microphone: + return cmvr::api::SYSTEM_DEVICE_TYPE_MICROPHONE; + case cmvr::device::DeviceKind::Motor: + return cmvr::api::SYSTEM_DEVICE_TYPE_MOTOR; + case cmvr::device::DeviceKind::MotorSystem: + return cmvr::api::SYSTEM_DEVICE_TYPE_MOTOR_SYSTEM; + case cmvr::device::DeviceKind::MujocoViewer: + return cmvr::api::SYSTEM_DEVICE_TYPE_MUJOCO_VIEWER; + case cmvr::device::DeviceKind::MujocoWorld: + return cmvr::api::SYSTEM_DEVICE_TYPE_MUJOCO_WORLD; + case cmvr::device::DeviceKind::Robot: + return cmvr::api::SYSTEM_DEVICE_TYPE_ROBOT; + case cmvr::device::DeviceKind::Speaker: + return cmvr::api::SYSTEM_DEVICE_TYPE_SPEAKER; + case cmvr::device::DeviceKind::Unknown: + break; + } + return cmvr::api::SYSTEM_DEVICE_TYPE_UNSPECIFIED; +} + +cmvr::api::SystemDeviceState toApiDeviceState( + const cmvr::device::ManagedDeviceState state) noexcept +{ + switch (state) { + case cmvr::device::ManagedDeviceState::Disabled: + return cmvr::api::SYSTEM_DEVICE_STATE_DISABLED; + case cmvr::device::ManagedDeviceState::Initializing: + return cmvr::api::SYSTEM_DEVICE_STATE_INITIALIZING; + case cmvr::device::ManagedDeviceState::Registered: + return cmvr::api::SYSTEM_DEVICE_STATE_REGISTERED; + case cmvr::device::ManagedDeviceState::Ready: + return cmvr::api::SYSTEM_DEVICE_STATE_READY; + case cmvr::device::ManagedDeviceState::Running: + return cmvr::api::SYSTEM_DEVICE_STATE_RUNNING; + case cmvr::device::ManagedDeviceState::Stopped: + return cmvr::api::SYSTEM_DEVICE_STATE_STOPPED; + case cmvr::device::ManagedDeviceState::Error: + return cmvr::api::SYSTEM_DEVICE_STATE_ERROR; + case cmvr::device::ManagedDeviceState::Unknown: + break; + } + return cmvr::api::SYSTEM_DEVICE_STATE_UNSPECIFIED; +} + +cmvr::api::SystemDeviceHealth toApiDeviceHealth( + const cmvr::device::DeviceHealthState state) noexcept +{ + switch (state) { + case cmvr::device::DeviceHealthState::Healthy: + return cmvr::api::SYSTEM_DEVICE_HEALTH_HEALTHY; + case cmvr::device::DeviceHealthState::Degraded: + return cmvr::api::SYSTEM_DEVICE_HEALTH_DEGRADED; + case cmvr::device::DeviceHealthState::Fault: + return cmvr::api::SYSTEM_DEVICE_HEALTH_FAULT; + case cmvr::device::DeviceHealthState::Unknown: + break; + } + return cmvr::api::SYSTEM_DEVICE_HEALTH_UNSPECIFIED; +} + +struct ParsedSafetyScope final { + bool valid{false}; + bool all_devices{false}; + std::vector device_ids; + std::string error; +}; + +ParsedSafetyScope parseSafetyScope( + const cmvr::api::SafetyScope& scope, + const bool default_to_all) +{ + ParsedSafetyScope result; + switch (scope.target_case()) { + case cmvr::api::SafetyScope::kAllDevices: + if (!scope.all_devices()) { + result.error = "all_devices must be explicitly true"; + return result; + } + result.valid = true; + result.all_devices = true; + return result; + case cmvr::api::SafetyScope::kDevices: { + if (scope.devices().device_ids().empty()) { + result.error = "device scope must contain at least one device ID"; + return result; + } + std::unordered_set unique; + result.device_ids.reserve(scope.devices().device_ids_size()); + for (const auto& id : scope.devices().device_ids()) { + if (id.empty() || !unique.insert(id).second) { + result.error = + "device scope IDs must be non-empty and unique"; + return result; + } + result.device_ids.push_back(id); + } + result.valid = true; + return result; + } + case cmvr::api::SafetyScope::TARGET_NOT_SET: + if (default_to_all) { + result.valid = true; + result.all_devices = true; + } else { + result.error = "an explicit recovery scope is required"; + } + return result; + } + result.error = "invalid safety scope"; + return result; +} + +void setSafetyHeaderFailure( + cmvr::api::CommandHeader_Feedback* header, + const cmvr::safety::SafetyReason reason, + const std::string& detail) +{ + header->set_success(false); + header->set_reason_code(toApiSafetyReason(reason)); + header->set_error_message(detail); + header->set_execution_state( + cmvr::api::COMMAND_EXECUTION_STATE_REJECTED_BEFORE_DISPATCH); + setCurrentTimestamp(header->mutable_timestamp()); +} + +bool recoveryCompletedAsRequested( + const cmvr::safety::RecoveryResultCode result) noexcept +{ + return result == cmvr::safety::RecoveryResultCode::Recovered || + result == + cmvr::safety::RecoveryResultCode::VerifiedButStillBlocked || + result == cmvr::safety::RecoveryResultCode::NothingToRecover; +} + +} // namespace + +gRPCSystemServiceImpl::gRPCSystemServiceImpl() + : gRPCSystemServiceImpl( + std::chrono::seconds(15), makeDefaultGrpcSecurityGateway()) +{ +} + +gRPCSystemServiceImpl::gRPCSystemServiceImpl( + const std::chrono::milliseconds stop_timeout) + : gRPCSystemServiceImpl(stop_timeout, makeDefaultGrpcSecurityGateway()) +{ +} + +gRPCSystemServiceImpl::gRPCSystemServiceImpl( + std::shared_ptr security_gateway) + : gRPCSystemServiceImpl( + std::chrono::seconds(15), std::move(security_gateway)) +{ +} + +gRPCSystemServiceImpl::gRPCSystemServiceImpl( + const std::chrono::milliseconds stop_timeout, + std::shared_ptr security_gateway) + : gRPCSystemServiceImpl( + stop_timeout, std::move(security_gateway), nullptr) +{ +} + +gRPCSystemServiceImpl::gRPCSystemServiceImpl( + const std::chrono::milliseconds stop_timeout, + std::shared_ptr security_gateway, + std::shared_ptr recovery_audit_sink) + : dmgr_(DeviceManager::getInstance()), + stop_timeout_( + stop_timeout > std::chrono::milliseconds::zero() + ? stop_timeout + : std::chrono::seconds(15)), + security_gateway_( + security_gateway ? std::move(security_gateway) + : makeDefaultGrpcSecurityGateway()), + recovery_audit_sink_(std::move(recovery_audit_sink)), + action_queue_(std::make_shared(dmgr_)) +{ + // Acquire only after ActionQueue construction succeeds. This ensures an + // exception cannot release the last dispatcher outside the registry. + acquireProcessStopDispatcher(stop_dispatcher_); + try { + safety_participant_registration_ = registerGrpcSafetyParticipants( + dmgr_.safetyManager(), action_queue_, stop_dispatcher_); + } catch (...) { + releaseProcessStopDispatcher(stop_dispatcher_); + throw; + } +} + +gRPCSystemServiceImpl::~gRPCSystemServiceImpl() +{ + // The dispatcher intentionally outlives ActionQueue, then joins any + // deadline-overrunning stop workers before the last service disappears. + safety_participant_registration_.reset(); + action_queue_.reset(); + releaseProcessStopDispatcher(stop_dispatcher_); +} + +bool gRPCSystemServiceImpl::waitForStopDispatcherDestructionForTesting( + const std::chrono::milliseconds timeout) +{ + auto& registry = processStopDispatcherRegistry(); + std::unique_lock lock(registry.mutex); + return registry.available.wait_for( + lock, + timeout, + [®istry] { return registry.destroying; }); +} + +void gRPCSystemServiceImpl::prepareForShutdown() +{ + // Do not wait for a business StopAll round here. StopAll may be blocked in + // a device backend, while server shutdown must still invalidate queued and + // active ActionQueue work promptly. ActionQueueExecutor owns the state lock + // and generation fence needed to make this transition race-safe; an + // in-flight StopAll ticket then becomes stale and fails closed. + (void)action_queue_->disableForShutdown(); +} + +grpc::Status gRPCSystemServiceImpl::GetSystemInfo(grpc::ServerContext* context, + const api::GetSystemInfoCommand_Request* request, api::GetSystemInfoCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/GetSystemInfo"); + try { + response->set_version(dmgr_.version()); + response->set_system_name(dmgr_.name()); + response->set_action_service_instance_id( + action_queue_->instanceId()); + const auto& security = security_gateway_->config(); + response->set_grpc_transport_security(toString(security.transport)); + response->set_grpc_authentication(toString(security.authentication)); + response->set_grpc_recovery_exposure( + toString(security.recovery_exposure)); + response->set_grpc_insecure_non_loopback( + security.insecure_non_loopback); + const auto safety = dmgr_.safetyManager().snapshot(); + response->set_control_service_instance_id( + safety.service_instance_id); + response->set_safety_enforcement_mode( + cmvr::safety::toString(safety.enforcement_mode)); + response->set_safety_schema_version(1); + response->mutable_header()->set_success(true); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + CMVR_LOG(DEBUG) << "[gRPCSystemServiceImpl] (GetSystemInfo): success, name=" + << response->system_name() << ", version=" << response->version(); + return grpc::Status::OK; + } + catch (std::exception& e) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(e.what()); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} + +grpc::Status gRPCSystemServiceImpl::GetSystemStatus(grpc::ServerContext* context, + const api::GetSystemStatusCommand_Request* request, api::GetSystemStatusCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/GetSystemStatus"); + try { + std::list> dev_list; + dmgr_.getDeviceList(dev_list); + for (auto &pair: dev_list) { + auto* dev = response->add_device_list(); + dev->set_device_id(pair.first); + if (pair.second == "AGV") { + dev->set_device_type(api::DeviceType::AGV); + } + else if (pair.second == "Battery") { + dev->set_device_type(api::DeviceType::Battery); + } + else if (pair.second == "Camera") { + dev->set_device_type(api::DeviceType::Camera); + } + else if (pair.second == "DexHand") { + dev->set_device_type(api::DeviceType::DexHand); + } + else if (pair.second == "Gripper") { + dev->set_device_type(api::DeviceType::Gripper); + } + else if (pair.second == "Microphone") { + dev->set_device_type(api::DeviceType::Microphone); + } + else if (pair.second == "Robot") { + dev->set_device_type(api::DeviceType::Robot); + } + else if (pair.second == "Speaker") { + dev->set_device_type(api::DeviceType::Speaker); + } + else if (pair.second == "Unknown") { + dev->set_device_type(api::DeviceType::Unknown); + } + } + response->mutable_header()->set_success(true); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + CMVR_LOG(DEBUG) << "[gRPCSystemServiceImpl] (GetSystemStatus): success, devices=" + << response->device_list_size(); + return grpc::Status::OK; + } + catch (const std::exception &e) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(e.what()); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} + +grpc::Status gRPCSystemServiceImpl::GetDeviceList( + grpc::ServerContext* context, + const api::GetDeviceListCommand_Request* request, + api::GetDeviceListCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/GetDeviceList"); + (void)request; + try { + const auto snapshot = dmgr_.snapshot(); + response->set_manager_name(snapshot.name); + response->set_manager_version(snapshot.version); + response->set_manager_description(snapshot.description); + response->set_sampled_at_unix_ms(unixTimeMs()); + + for (const auto& source : snapshot.devices) { + // The public inventory contains enabled entries only. Keep enabled + // devices visible even when their lifecycle or health is in error. + if (!source.enabled) { + continue; + } + + auto* destination = response->add_device_list(); + destination->set_device_id(source.id); + destination->set_device_type(toApiDeviceType(source.kind)); + destination->set_type_name(source.type_name); + destination->set_enabled(true); + destination->set_manager_state(toApiDeviceState(source.state)); + destination->set_health(toApiDeviceHealth(source.health.state)); + destination->set_has_error(source.abnormal); + destination->set_error_message(source.error_message); + destination->set_status_updated_at_unix_ms( + source.status_updated_at_unix_ms); + } + + response->mutable_header()->set_success(true); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + CMVR_LOG(DEBUG) << "[gRPCSystemServiceImpl] (GetDeviceList): success, devices=" + << response->device_list_size(); + return grpc::Status::OK; + } + catch (const std::exception& e) { + response->Clear(); + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(e.what()); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} + +grpc::Status gRPCSystemServiceImpl::GetSafetyState( + grpc::ServerContext* context, + const cmvr::api::GetSafetyStateCommand_Request* request, + cmvr::api::GetSafetyStateCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/GetSafetyState"); + if (!request || !response) { + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "GetSafetyState request and response are required"); + } + + const auto scope = parseSafetyScope(request->scope(), true); + if (!scope.valid) { + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::InvalidArgument, + scope.error); + return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, scope.error); + } + + const auto snapshot = dmgr_.safetyManager().snapshot(); + response->set_system_state( + toApiSystemAdmissionState(snapshot.system_state)); + response->set_safety_epoch(snapshot.safety_epoch); + response->set_control_service_instance_id(snapshot.service_instance_id); + response->set_enforcement_mode( + cmvr::safety::toString(snapshot.enforcement_mode)); + response->set_active_operation_id(snapshot.active_operation_id); + response->set_active_operation_phase(snapshot.active_operation_phase); + response->set_sampled_at_unix_ms(unixTimeMs()); + + std::unordered_set requested_ids( + scope.device_ids.begin(), scope.device_ids.end()); + for (const auto& device : snapshot.devices) { + if (!scope.all_devices && + requested_ids.erase(device.descriptor.device_id) == 0U) { + continue; + } + populateDeviceSafetyState(device, *response->add_devices()); + } + for (const auto& participant : snapshot.participants) { + populateSafetyParticipantState( + participant, *response->add_participants()); + } + if (!requested_ids.empty()) { + const auto detail = + "safety device is not registered: " + *requested_ids.begin(); + response->Clear(); + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::DeviceNotFound, + detail); + return grpc::Status(grpc::StatusCode::NOT_FOUND, detail); + } + + response->mutable_header()->set_success(true); + response->mutable_header()->set_reason_code( + cmvr::api::COMMAND_REASON_CODE_NONE); + response->mutable_header()->set_service_instance_id( + snapshot.service_instance_id); + response->mutable_header()->set_safety_epoch(snapshot.safety_epoch); + response->mutable_header()->set_execution_state( + cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; +} + +grpc::Status gRPCSystemServiceImpl::RecoverSafetyState( + grpc::ServerContext* context, + const cmvr::api::RecoverSafetyStateCommand_Request* request, + cmvr::api::RecoverSafetyStateCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/RecoverSafetyState"); + if (!request || !response) { + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "RecoverSafetyState request and response are required"); + } + + const auto scope = parseSafetyScope(request->scope(), false); + if (!scope.valid || request->recovery_id().empty() || + request->reason().empty() || request->expected_safety_epoch() == 0 || + request->mode() == + cmvr::api::RecoverSafetyStateCommand::MODE_UNSPECIFIED) { + std::string detail = scope.valid + ? "recovery_id, reason, expected_safety_epoch, and mode are required" + : scope.error; + setSafetyHeaderFailure( + response->mutable_header(), + request->reason().empty() + ? cmvr::safety::SafetyReason::RecoveryReasonRequired + : cmvr::safety::SafetyReason::InvalidArgument, + detail); + return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, detail); + } + if (!recovery_audit_sink_) { + const std::string detail = + "persistent recovery audit is not configured"; + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::RecoveryAuditFailed, + detail); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, + "RECOVERY_AUDIT_FAILED"); + } + + const bool verify_only = request->mode() == + cmvr::api::RecoverSafetyStateCommand::VERIFY_ONLY; + RecoveryAuditRecord audit; + audit.occurred_at_unix_ms = unixTimeMs(); + audit.stage = "accepted"; + audit.correlation_id = cmvr_grpc_call_guard.context().correlation_id; + audit.principal_id = cmvr_grpc_call_guard.context().principal.id; + audit.peer = cmvr_grpc_call_guard.context().peer; + audit.recovery_id = request->recovery_id(); + audit.reason = request->reason(); + audit.mode = verify_only ? "verify_only" : "clear_software_latch"; + audit.all_devices = scope.all_devices; + audit.device_ids = scope.device_ids; + audit.expected_safety_epoch = request->expected_safety_epoch(); + audit.result = "pending"; + std::string audit_error; + if (!recovery_audit_sink_->append(audit, &audit_error)) { + const auto detail = audit_error.empty() + ? std::string("persistent recovery audit write failed") + : audit_error; + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::RecoveryAuditFailed, + detail); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, + "RECOVERY_AUDIT_FAILED"); + } + + auto deadline = cmvr_grpc_call_guard.context().deadline; + const auto configured_deadline = + cmvr::safety::SafetyClock::now() + + dmgr_.safetyManager().config().recovery_timeout; + if (deadline == cmvr::safety::SafetyClock::time_point::max() || + configured_deadline < deadline) { + deadline = configured_deadline; + } + if (request->timeout_ms() != 0) { + deadline = std::min( + deadline, + cmvr::safety::SafetyClock::now() + + std::chrono::milliseconds(request->timeout_ms())); + } + + cmvr::safety::RecoveryRequest coordinator_request; + coordinator_request.recovery_id = request->recovery_id(); + coordinator_request.device_ids = scope.device_ids; + coordinator_request.all_devices = scope.all_devices; + coordinator_request.expected_safety_epoch = + request->expected_safety_epoch(); + coordinator_request.verify_only = verify_only; + coordinator_request.reason = request->reason(); + coordinator_request.deadline = deadline; + if (!verify_only) { + auto commit_audit = audit; + commit_audit.stage = "clear_commit"; + commit_audit.result = "authorized"; + const auto sink = recovery_audit_sink_; + coordinator_request.authorize_clear = + [sink, commit_audit = std::move(commit_audit)]() mutable { + commit_audit.occurred_at_unix_ms = unixTimeMs(); + std::string error; + const bool persisted = sink->append(commit_audit, &error); + if (!persisted) { + CMVR_LOG(ERROR) + << "[gRPCSystemServiceImpl] Recovery clear audit " + "failed: " + << error; + } + return persisted; + }; + } + + const auto result = + dmgr_.safetyManager().recover(coordinator_request); + response->set_recovery_id(result.recovery_id); + response->set_result(toApiRecoveryResult(result.result)); + response->set_previous_safety_epoch(result.previous_safety_epoch); + response->set_current_safety_epoch(result.current_safety_epoch); + response->set_system_state( + toApiSystemAdmissionState(result.system_state)); + for (const auto& target : result.targets) { + populateSafetyTargetResult(target, *response->add_targets()); + } + + const bool success = recoveryCompletedAsRequested(result.result); + auto* header = response->mutable_header(); + header->set_success(success); + header->set_command_id(request->recovery_id()); + header->set_service_instance_id( + dmgr_.safetyManager().serviceInstanceId()); + header->set_safety_epoch(result.current_safety_epoch); + header->set_execution_state( + success ? cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED + : cmvr::api::COMMAND_EXECUTION_STATE_FAILED); + if (success) { + header->set_reason_code(cmvr::api::COMMAND_REASON_CODE_NONE); + } else if (!result.targets.empty()) { + header->set_reason_code( + toApiSafetyReason(result.targets.front().reason)); + header->set_error_message(result.targets.front().detail); + } else { + header->set_reason_code( + cmvr::api::COMMAND_REASON_CODE_INTERNAL_ERROR); + header->set_error_message("recovery failed without a target result"); + } + setCurrentTimestamp(header->mutable_timestamp()); + + audit.occurred_at_unix_ms = unixTimeMs(); + audit.stage = "completed"; + audit.previous_safety_epoch = result.previous_safety_epoch; + audit.current_safety_epoch = result.current_safety_epoch; + audit.result = cmvr::safety::toString(result.result); + if (!recovery_audit_sink_->append(audit, &audit_error)) { + CMVR_LOG(ERROR) + << "[gRPCSystemServiceImpl] Recovery completion audit failed: " + << audit_error; + } + return grpc::Status::OK; +} + +grpc::Status gRPCSystemServiceImpl::RestoreOperationalState( + grpc::ServerContext* context, + const cmvr::api::RestoreOperationalStateCommand_Request* request, + cmvr::api::RestoreOperationalStateCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/RestoreOperationalState"); + if (!request || !response) { + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "RestoreOperationalState request and response are required"); + } + if (request->recovery_id().empty() || request->reason().empty()) { + const std::string detail = + "recovery_id and reason are required"; + setSafetyHeaderFailure( + response->mutable_header(), + request->reason().empty() + ? cmvr::safety::SafetyReason::RecoveryReasonRequired + : cmvr::safety::SafetyReason::InvalidArgument, + detail); + return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, detail); + } + if (!recovery_audit_sink_) { + const std::string detail = + "persistent recovery audit is not configured"; + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::RecoveryAuditFailed, + detail); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, + "RECOVERY_AUDIT_FAILED"); + } + + const auto accepted_snapshot = dmgr_.safetyManager().snapshot(); + RecoveryAuditRecord audit; + audit.occurred_at_unix_ms = unixTimeMs(); + audit.stage = "accepted"; + audit.correlation_id = cmvr_grpc_call_guard.context().correlation_id; + audit.principal_id = cmvr_grpc_call_guard.context().principal.id; + audit.peer = cmvr_grpc_call_guard.context().peer; + audit.recovery_id = request->recovery_id(); + audit.reason = request->reason(); + audit.mode = "restore_operational_state"; + audit.all_devices = true; + audit.expected_safety_epoch = accepted_snapshot.safety_epoch; + audit.result = "pending"; + std::string audit_error; + if (!recovery_audit_sink_->append(audit, &audit_error)) { + const auto detail = audit_error.empty() + ? std::string("persistent recovery audit write failed") + : audit_error; + setSafetyHeaderFailure( + response->mutable_header(), + cmvr::safety::SafetyReason::RecoveryAuditFailed, + detail); + return grpc::Status( + grpc::StatusCode::FAILED_PRECONDITION, + "RECOVERY_AUDIT_FAILED"); + } + + auto deadline = cmvr_grpc_call_guard.context().deadline; + const auto configured_deadline = + cmvr::safety::SafetyClock::now() + + dmgr_.safetyManager().config().recovery_timeout; + if (deadline == cmvr::safety::SafetyClock::time_point::max() || + configured_deadline < deadline) { + deadline = configured_deadline; + } + if (request->timeout_ms() != 0) { + deadline = std::min( + deadline, + cmvr::safety::SafetyClock::now() + + std::chrono::milliseconds(request->timeout_ms())); + } + + auto commit_audit = audit; + commit_audit.stage = "restore_commit"; + commit_audit.result = "authorized"; + const auto sink = recovery_audit_sink_; + + cmvr::safety::RecoveryRequest coordinator_request; + coordinator_request.recovery_id = request->recovery_id(); + coordinator_request.all_devices = true; + coordinator_request.expected_safety_epoch = + accepted_snapshot.safety_epoch; + coordinator_request.verify_only = false; + coordinator_request.restore_operational_state = true; + coordinator_request.reason = request->reason(); + coordinator_request.deadline = deadline; + coordinator_request.authorize_clear = + [sink, commit_audit = std::move(commit_audit)]() mutable { + commit_audit.occurred_at_unix_ms = unixTimeMs(); + std::string error; + const bool persisted = sink->append(commit_audit, &error); + if (!persisted) { + CMVR_LOG(ERROR) + << "[gRPCSystemServiceImpl] Operational restore audit " + "failed: " + << error; + } + return persisted; + }; + + const auto result = + dmgr_.safetyManager().recover(coordinator_request); + response->set_recovery_id(result.recovery_id); + response->set_result(toApiRecoveryResult(result.result)); + response->set_previous_safety_epoch(result.previous_safety_epoch); + response->set_current_safety_epoch(result.current_safety_epoch); + response->set_system_state( + toApiSystemAdmissionState(result.system_state)); + for (const auto& target : result.targets) { + populateSafetyTargetResult(target, *response->add_targets()); + } + + const bool success = recoveryCompletedAsRequested(result.result); + auto* header = response->mutable_header(); + header->set_success(success); + header->set_command_id(request->recovery_id()); + header->set_service_instance_id( + dmgr_.safetyManager().serviceInstanceId()); + header->set_safety_epoch(result.current_safety_epoch); + header->set_execution_state( + success ? cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED + : cmvr::api::COMMAND_EXECUTION_STATE_FAILED); + if (success) { + header->set_reason_code(cmvr::api::COMMAND_REASON_CODE_NONE); + } else { + const auto failed = std::find_if( + result.targets.begin(), result.targets.end(), + [](const auto& target) { return !target.success; }); + if (failed != result.targets.end()) { + header->set_reason_code(toApiSafetyReason(failed->reason)); + header->set_error_message(failed->detail); + } else { + header->set_reason_code( + cmvr::api::COMMAND_REASON_CODE_INTERNAL_ERROR); + header->set_error_message( + "operational restore failed without a target result"); + } + } + setCurrentTimestamp(header->mutable_timestamp()); + + audit.occurred_at_unix_ms = unixTimeMs(); + audit.stage = "completed"; + audit.previous_safety_epoch = result.previous_safety_epoch; + audit.current_safety_epoch = result.current_safety_epoch; + audit.result = cmvr::safety::toString(result.result); + if (!recovery_audit_sink_->append(audit, &audit_error)) { + CMVR_LOG(ERROR) + << "[gRPCSystemServiceImpl] Operational restore completion audit " + "failed: " + << audit_error; + } + return grpc::Status::OK; +} + +grpc::Status gRPCSystemServiceImpl::UpdateParams(grpc::ServerContext* context, const cmvr::api::UpdateParamsCommand_Request* request, cmvr::api::UpdateParamsCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/UpdateParams"); + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message("UpdateParams is no longer supported. Use typed device commands or reload configuration."); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; +} + +grpc::Status gRPCSystemServiceImpl::StopAll(grpc::ServerContext* context, + const cmvr::api::StopAllCommand_Request* request, cmvr::api::StopAllCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, "/cmvr.api.SystemService/StopAll"); + if (!request || !response) { + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "StopAll request and response are required"); + } + if (dmgr_.safetyManager().config().enforcement_mode != + cmvr::safety::EnforcementMode::Legacy) { + auto deadline = cmvr_grpc_call_guard.context().deadline; + const auto configured_deadline = + cmvr::safety::SafetyClock::now() + stop_timeout_; + if (deadline == cmvr::safety::SafetyClock::time_point::max() || + configured_deadline < deadline) { + deadline = configured_deadline; + } + if (request->timeout_ms() != 0) { + deadline = std::min( + deadline, + cmvr::safety::SafetyClock::now() + + std::chrono::milliseconds(request->timeout_ms())); + } + + std::string operation_id = request->operation_id(); + if (operation_id.empty() && request->has_header()) { + operation_id = request->header().command_id(); + } + const auto result = dmgr_.safetyManager().stopAll( + std::move(operation_id), deadline); + response->set_operation_id(result.operation_id); + response->set_previous_safety_epoch( + result.previous_safety_epoch); + response->set_current_safety_epoch( + result.current_safety_epoch); + response->set_system_state( + toApiSystemAdmissionState(result.system_state)); + for (const auto& target : result.targets) { + populateSafetyTargetResult(target, *response->add_targets()); + } + + auto* header = response->mutable_header(); + header->set_success(result.success); + header->set_command_id(result.operation_id); + header->set_service_instance_id( + dmgr_.safetyManager().serviceInstanceId()); + header->set_safety_epoch(result.current_safety_epoch); + header->set_execution_state( + result.success + ? cmvr::api::COMMAND_EXECUTION_STATE_COMPLETED + : cmvr::api::COMMAND_EXECUTION_STATE_FAILED); + if (result.success) { + header->set_reason_code(cmvr::api::COMMAND_REASON_CODE_NONE); + } else if (!result.targets.empty()) { + const auto failed = std::find_if( + result.targets.begin(), result.targets.end(), + [](const auto& target) { return !target.success; }); + if (failed != result.targets.end()) { + header->set_reason_code(toApiSafetyReason(failed->reason)); + header->set_error_message(failed->detail); + } + } else { + header->set_reason_code( + cmvr::api::COMMAND_REASON_CODE_STOP_UNCONFIRMED); + header->set_error_message( + "StopAll did not produce a participant result"); + } + setCurrentTimestamp(header->mutable_timestamp()); + return grpc::Status::OK; + } + (void)request; + const auto stop_deadline = + std::chrono::steady_clock::now() + stop_timeout_; + + std::unique_lock stop_all_lock( + processStopAllMutex(), std::defer_lock); + while (!stop_all_lock.try_lock_for(std::min( + std::chrono::milliseconds(50), + remainingStopBudget(stop_deadline)))) { + if (context && context->IsCancelled()) { + return grpc::Status( + grpc::StatusCode::CANCELLED, + "StopAll was cancelled while waiting for another StopAll round"); + } + if (remainingStopBudget(stop_deadline) == + std::chrono::milliseconds::zero()) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message( + "StopAll timed out waiting for another StopAll round"); + setCurrentTimestamp( + response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } + } + + try { + // Close every admission domain before resolving devices or issuing + // stops. The process remains alive; only new operational work pauses. + ScopedAdmissionStopAll admission_stop; + ScopedMediaStopAll media_stop; + ScopedMotorStopAll motor_stop; + ScopedActionQueueStopAll action_stop(*action_queue_); + if (!admission_stop.valid()) { + throw std::runtime_error( + "StopAll could not establish the system admission barrier"); + } + if (!media_stop.valid()) { + throw std::runtime_error( + "StopAll could not establish the media activity barrier"); + } + if (!action_stop.valid()) { + throw std::runtime_error( + "StopAll cannot start because the service is shutting down"); + } + if (!motor_stop.valid()) { + throw std::runtime_error( + "StopAll could not establish the motor activity barrier"); + } + + // This snapshot is intentionally metadata-only. A wedged health query + // must not prevent physical stop requests from being dispatched. + const auto inventory = dmgr_.inventorySnapshot(); + ScopedControlBarrierSet control_barriers; + std::vector unconfirmed_devices; + + struct ControlTarget final { + std::string id; + cmvr::device::DeviceKind kind{ + cmvr::device::DeviceKind::Unknown}; + std::shared_ptr arm; + std::shared_ptr agv; + std::shared_ptr hand; + cmvr::control::ControlLeaseToken barrier; + }; + std::vector control_targets; + control_targets.reserve(inventory.size()); + + struct OtherTarget final { + std::string id; + std::shared_ptr camera; + std::shared_ptr microphone; + std::shared_ptr speaker; + std::shared_ptr head; + std::shared_ptr gripper; + bool tracked_media{false}; + }; + std::unordered_map other_targets; + other_targets.reserve(inventory.size()); + + for (const auto& device : inventory) { + const bool is_control = + device.kind == cmvr::device::DeviceKind::Arm || + device.kind == cmvr::device::DeviceKind::AGV || + device.kind == cmvr::device::DeviceKind::DexHand; + if (!is_control) { + OtherTarget target; + target.id = device.id; + switch (device.kind) { + case cmvr::device::DeviceKind::Camera: + target.camera = std::dynamic_pointer_cast< + cmvr::device::AbstractCamera>(device.device); + break; + case cmvr::device::DeviceKind::Microphone: + target.microphone = std::dynamic_pointer_cast< + cmvr::device::AbstractMicrophone>(device.device); + break; + case cmvr::device::DeviceKind::Speaker: + target.speaker = std::dynamic_pointer_cast< + cmvr::device::AbstractSpeaker>(device.device); + break; + case cmvr::device::DeviceKind::BioHead: + target.head = std::dynamic_pointer_cast< + cmvr::device::AbstractBiohead>(device.device); + break; + case cmvr::device::DeviceKind::Gripper: + target.gripper = std::dynamic_pointer_cast< + cmvr::device::AbstractGripper>(device.device); + break; + default: + continue; + } + if (!target.camera && !target.microphone && + !target.speaker && !target.head && !target.gripper) { + appendFailure( + unconfirmed_devices, device.id, + "inventory type did not resolve to its typed device"); + continue; + } + other_targets.emplace(device.id, std::move(target)); + continue; + } + + ControlTarget target; + target.id = device.id; + target.kind = device.kind; + if (device.kind == cmvr::device::DeviceKind::Arm) { + target.arm = std::dynamic_pointer_cast< + cmvr::device::RobotArm>(device.device); + } else if (device.kind == cmvr::device::DeviceKind::AGV) { + target.agv = std::dynamic_pointer_cast< + cmvr::device::AbstractAGV>(device.device); + } else { + target.hand = std::dynamic_pointer_cast< + cmvr::device::AbstractDexHand>(device.device); + } + if (!target.arm && !target.agv && !target.hand) { + appendFailure( + unconfirmed_devices, device.id, + "inventory type did not resolve to the typed control device"); + continue; + } + + std::string detail; + bool acquired = false; + try { + acquired = control_barriers.acquire( + device.id, detail, target.barrier); + } catch (const std::exception& error) { + detail = error.what(); + } catch (...) { + detail = "unknown exception"; + } + if (!acquired) { + appendFailure( + unconfirmed_devices, device.id, + "could not establish the device safety barrier" + + (detail.empty() ? "" : ": " + detail)); + continue; + } + control_targets.push_back(std::move(target)); + } + + std::unordered_set tracked_media_ids; + const auto merge_tracked_ids = [&tracked_media_ids]( + const std::vector& ids) { + tracked_media_ids.insert(ids.begin(), ids.end()); + }; + merge_tracked_ids( + cmvr::media::globalMediaSourceManager().trackedSourceIds()); + merge_tracked_ids( + globalCameraPtzActivityRegistry().trackedDeviceIds()); + merge_tracked_ids( + globalCameraOperationalActivityRegistry().trackedDeviceIds()); + for (const auto& id : tracked_media_ids) { + auto [target, inserted] = other_targets.try_emplace(id); + if (inserted) { + target->second.id = id; + } + target->second.tracked_media = true; + } + + // Every independent stop is submitted before waiting for any result. + // A blocked backend therefore cannot delay peer motion or media stops. + std::vector control_stops; + control_stops.reserve(control_targets.size()); + for (const auto& target : control_targets) { + StopHandle handle; + auto deadline_detail = std::make_shared(); + if (target.arm) { + const auto arm = target.arm; + const auto barrier = target.barrier; + deadline_detail->publishInitial( + "initial RobotArm stop did not complete before the " + "StopAll deadline"); + handle = stop_dispatcher_->submit( + "control:" + stopResourceKey(target.id), + [arm, barrier, stop_deadline, deadline_detail] { + return stopControlWithFence( + barrier, stop_deadline, + [arm] { return stopArm(arm, false); }, + [arm] { return stopArm(arm, true); }, + "RobotArm", deadline_detail); + }, + [deadline_detail] { + return deadline_detail->snapshot(); + }); + } else if (target.agv) { + const auto agv = target.agv; + const auto barrier = target.barrier; + deadline_detail->publishInitial( + "initial AGV stop did not complete before the StopAll " + "deadline"); + handle = stop_dispatcher_->submit( + "control:" + stopResourceKey(target.id), + [agv, barrier, stop_deadline, deadline_detail] { + return stopControlWithFence( + barrier, stop_deadline, + [agv] { return stopAgv(agv, false); }, + [agv] { return stopAgv(agv, true); }, + "AGV", deadline_detail); + }, + [deadline_detail] { + return deadline_detail->snapshot(); + }); + } else { + const auto hand = target.hand; + const auto barrier = target.barrier; + deadline_detail->publishInitial( + "initial DexHand stop did not complete before the " + "StopAll deadline"); + handle = stop_dispatcher_->submit( + "control:" + stopResourceKey(target.id), + [hand, barrier, stop_deadline, deadline_detail] { + return stopControlWithFence( + barrier, stop_deadline, + [hand] { return stopDexHand(hand, false); }, + [hand] { return stopDexHand(hand, true); }, + "DexHand", deadline_detail); + }, + [deadline_detail] { + return deadline_detail->snapshot(); + }); + } + control_stops.push_back( + {target.id, std::move(handle), true, true}); + } + + std::vector motor_operations; + std::vector + deferred_motor_operations; + std::string motor_collection_error; + if (!motor_stop.collectStopOperations( + deferred_motor_operations, &motor_collection_error)) { + appendFailure( + unconfirmed_devices, "motors", + motor_collection_error.empty() + ? "could not collect registered motor stop operations" + : motor_collection_error); + } else { + submitDeferredOperations( + *stop_dispatcher_, std::move(deferred_motor_operations), + motor_operations); + } + + std::vector media_cancellations; + std::vector + deferred_media_cancellations; + std::string media_collection_error; + if (!media_stop.collectCancellationOperations( + deferred_media_cancellations, &media_collection_error)) { + appendFailure( + unconfirmed_devices, "media", + media_collection_error.empty() + ? "could not collect active media cancellations" + : media_collection_error); + } else { + submitDeferredOperations( + *stop_dispatcher_, std::move(deferred_media_cancellations), + media_cancellations); + } + + std::vector task_stops; + const auto task_targets = + cmvr::task::TaskManager::activitySnapshotIfInitialized(); + task_stops.reserve(task_targets.size()); + for (const auto& task : task_targets) { + const auto task_id = task ? task->id() : std::string{"unknown"}; + auto handle = stop_dispatcher_->submit( + "task:" + task_id, + [task] { + return invokeStopOperation( + [task] { return stopTaskActivity(task); }, + "task activity stop"); + }); + task_stops.push_back( + {task_id, std::move(handle), false, true}); + } + + std::vector other_stops; + other_stops.reserve(other_targets.size()); + for (const auto& [id, target] : other_targets) { + const auto camera = target.camera; + const auto microphone = target.microphone; + const auto speaker = target.speaker; + const auto head = target.head; + const auto gripper = target.gripper; + const bool tracked_media = target.tracked_media; + auto handle = stop_dispatcher_->submit( + "activity:" + stopResourceKey(id), + [id, camera, microphone, speaker, head, gripper, + tracked_media] { + return stopOtherActivities( + id, camera, microphone, speaker, head, gripper, + tracked_media); + }); + other_stops.push_back( + {id, std::move(handle), false, true}); + } + + std::unordered_set completed_control_stops; + (void)waitForStopOperations( + control_stops, stop_deadline, control_barriers, + unconfirmed_devices, &completed_control_stops); + (void)waitForStopOperations( + motor_operations, stop_deadline, control_barriers, + unconfirmed_devices); + (void)waitForStopOperations( + media_cancellations, stop_deadline, control_barriers, + unconfirmed_devices); + (void)waitForStopOperations( + task_stops, stop_deadline, control_barriers, + unconfirmed_devices); + std::unordered_set completed_other_stops; + (void)waitForStopOperations( + other_stops, stop_deadline, control_barriers, + unconfirmed_devices, &completed_other_stops); + + std::string motor_error; + const bool motors_stopped = motor_stop.waitForStopped( + remainingStopBudget(stop_deadline), &motor_error); + if (!motors_stopped) { + unconfirmed_devices.push_back( + "motors: " + (motor_error.empty() + ? "operational stop was not confirmed" + : motor_error)); + } + + const bool media_stopped = media_stop.waitForStopped( + remainingStopBudget(stop_deadline)); + if (!media_stopped) { + unconfirmed_devices.push_back( + "media: timed out waiting for active RPCs to stop"); + } else { + // The first device stop runs in parallel with media cancellation so + // motion stops are never delayed by a blocked media handler. A + // handler already inside runIfCurrent(), however, can finish a + // start/resume after that first stop. Once every old media session + // has drained, repeat the typed operational stops while all + // admission gates are still closed. Do not retry a device whose + // first stop is still running; StopOperationDispatcher would only + // join that old job and a concurrent driver stop would be unsafe. + std::vector final_media_stops; + final_media_stops.reserve(completed_other_stops.size()); + for (const auto& [id, target] : other_targets) { + const bool needs_final_media_stop = + target.camera || target.microphone || target.speaker || + target.tracked_media; + if (!needs_final_media_stop || + completed_other_stops.count(id) == 0U) { + continue; + } + + const auto camera = target.camera; + const auto microphone = target.microphone; + const auto speaker = target.speaker; + const bool tracked_media = target.tracked_media; + auto handle = stop_dispatcher_->submit( + "activity:" + stopResourceKey(id), + [id, camera, microphone, speaker, tracked_media] { + return stopOtherActivities( + id, camera, microphone, speaker, nullptr, nullptr, + tracked_media); + }); + final_media_stops.push_back( + {id, std::move(handle), false, true}); + } + + // DexHand sensor RPCs also belong to the media coordinator and can + // race their resumeOperationalActivity() with the initial control + // stop. Their typed safety barrier is still held here, so a final + // operational stop cannot admit a new hand command. + for (const auto& target : control_targets) { + if (!target.hand || + completed_control_stops.count(target.id) == 0U) { + continue; + } + const auto hand = target.hand; + auto handle = stop_dispatcher_->submit( + "final-media-control:" + stopResourceKey(target.id), + [hand] { + return invokeStopOperation( + [hand] { return stopDexHand(hand, true); }, + "final DexHand media activity stop"); + }); + final_media_stops.push_back( + {target.id, std::move(handle), true, true}); + } + (void)waitForStopOperations( + final_media_stops, stop_deadline, control_barriers, + unconfirmed_devices); + } + + if (!action_queue_->waitForIdle( + remainingStopBudget(stop_deadline))) { + unconfirmed_devices.push_back( + "ActionQueue: timed out waiting for the execution queue to " + "become idle"); + } + if (!unconfirmed_devices.empty()) { + control_barriers.quarantineAll(); + throw std::runtime_error( + "StopAll could not confirm that every device stopped; " + "control remains paused and affected resources remain " + "quarantined: " + + unconfirmed_devices.front()); + } + control_barriers.recoverRetiredSafetyHoldersAll(); + if (!action_stop.complete(true)) { + throw std::runtime_error( + "StopAll stopped all devices but could not safely resume " + "ActionQueue admission"); + } + if (!media_stop.complete(true)) { + throw std::runtime_error( + "StopAll stopped all media but could not safely resume " + "media activity admission"); + } + if (!motor_stop.complete(true)) { + throw std::runtime_error( + "StopAll stopped all motors but could not safely resume " + "motor command admission"); + } + // Release the current round's typed control barriers while the global + // gate is still closed. Retired barriers from earlier failed rounds + // were recovered above; unrelated active safety holders are preserved. + control_barriers.releaseAll(); + if (!admission_stop.complete(true)) { + throw std::runtime_error( + "StopAll stopped all activities but could not safely resume " + "system admission"); + } + response->mutable_header()->set_success(true); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + CMVR_LOG(DEBUG) << "[gRPCSystemServiceImpl] (StopAll): success"; + return grpc::Status::OK; + } + catch (std::exception& e) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(e.what()); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } + catch (...) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message( + "StopAll failed with an unknown exception"); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} + +grpc::Status gRPCSystemServiceImpl::ExecuteActionQueue( + grpc::ServerContext* context, + const cmvr::api::ActionQueueCommand_Request* request, + cmvr::api::ActionQueueCommand_Feedback* response) +{ + CMVR_GRPC_REQUIRE_REGISTERED_CALL( + security_gateway_, context, + "/cmvr.api.SystemService/ExecuteActionQueue"); + if (!request || !response) { + return grpc::Status( + grpc::StatusCode::INVALID_ARGUMENT, + "ActionQueue request and response are required"); + } + try { + cmvr::safety::CommandActor actor; + actor.principal_id = + cmvr_grpc_call_guard.context().principal.id; + actor.authenticated = + cmvr_grpc_call_guard.context().principal.authenticated; + for (const auto role : + cmvr_grpc_call_guard.context().principal.roles) { + actor.roles.emplace_back(cmvr::service::toString(role)); + } + // The callback is consumed only on this synchronous handler stack. It + // is never retained by the worker-owned action Record, so returning the + // RPC cannot leave a dangling ServerContext reference. + const auto wait_result = action_queue_->submitAndWait( + *request, + *response, + [context]() { + return context && context->IsCancelled(); + }, + std::move(actor)); + if (wait_result == + ActionQueueExecutor::WaitResult::CanceledBeforeAdmission) { + return grpc::Status( + grpc::StatusCode::CANCELLED, + "ActionQueue RPC was canceled before admission"); + } + if (wait_result == + ActionQueueExecutor::WaitResult::CanceledAfterAdmission) { + return grpc::Status( + grpc::StatusCode::CANCELLED, + "ActionQueue RPC waiter was canceled after admission; the edge action continues and its result can be retrieved with the same action_id"); + } + return grpc::Status::OK; + } catch (const std::exception& error) { + response->Clear(); + response->set_action_id(request->action_id()); + response->set_service_instance_id(action_queue_->instanceId()); + response->set_result(api::ACTION_RESULT_CODE_FAILED); + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(error.what()); + setCurrentTimestamp( + response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} diff --git a/cmvr-es/service/grpc/src/grpc_agv_service.cpp b/cmvr-es/service/grpc/src/grpc_agv_service.cpp index 1f8d160f..622889cb 100644 --- a/cmvr-es/service/grpc/src/grpc_agv_service.cpp +++ b/cmvr-es/service/grpc/src/grpc_agv_service.cpp @@ -749,4 +749,24 @@ grpc::Status gRPCAgvServiceImpl::stopMapping(grpc::ServerContext*, } } +grpc::Status gRPCAgvServiceImpl::relocalize( + grpc::ServerContext*, + const api::AgvRelocalizeCommand_Request* request, + api::AgvRelocalizeCommand_Feedback* response) +{ + try { + const std::string device_id = request->header().device_id(); + auto agv = dmgr_.getDevice(device_id); + if (!agv) { + return setDeviceNotFound(response, device_id); + } + return setResponseResult( + response, + agv->relocalize(toPose2d(request->pose()))); + } catch (const std::exception& e) { + fillFeedback(response->mutable_header(), false, e.what()); + return grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } +} + } // namespace cmvr::service diff --git a/cmvr-es/task/ume_teleop_task/CMakeLists.txt b/cmvr-es/task/ume_teleop_task/CMakeLists.txt new file mode 100644 index 00000000..d1d1b8b5 --- /dev/null +++ b/cmvr-es/task/ume_teleop_task/CMakeLists.txt @@ -0,0 +1,20 @@ +find_package(Threads REQUIRED) + +add_library(ume_teleop_task STATIC + src/ume_teleop_task.cpp +) +target_compile_features(ume_teleop_task PUBLIC cxx_std_17) +target_include_directories(ume_teleop_task PUBLIC ${PROJECT_SOURCE_DIR}/cmvr-es) +target_link_libraries(ume_teleop_task + PUBLIC + cmvr_es::task + cmvr_es::arm_teleop_client + cmvr_es::proto + PRIVATE + cmvr_es::logging + cmvr_es::stop_all_admission_gate + Threads::Threads +) + +add_library(cmvr_es::ume_teleop_task ALIAS ume_teleop_task) +install(TARGETS ume_teleop_task ARCHIVE DESTINATION lib) diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index f50be0c1..00000000 --- a/compile_commands.json +++ /dev/null @@ -1,986 +0,0 @@ -[ -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o CMakeFiles/cmvr_es.dir/cmvr-es/main.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/main.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/main.cpp", - "output": "CMakeFiles/cmvr_es.dir/cmvr-es/main.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/thread_pool.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/thread_pool.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/thread_pool.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/thread_pool.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/timer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/timer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/timer.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/timer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/abstract_interpolation.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/abstract_interpolation.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/abstract_interpolation.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/abstract_interpolation.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/inertial.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/inertial.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/inertial.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/inertial.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/joint.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/joint.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/joint.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/joint.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/link.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/link.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/link.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/link.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/robot.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/robot.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/robot.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/robot.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/qp_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/qp_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/qp_solver.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/qp_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/se2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se2.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/se2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/se3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se3.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/se3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/so3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/so3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/so3.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/so3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/controller/src/cartesian_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/controller/src/cartesian_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/controller/src/cartesian_controller.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/controller/src/cartesian_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/serial_interface.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/serial_interface.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/serial_interface.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/serial_interface.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/esp32_serial_port.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/esp32_serial_port.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/esp32_serial_port.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/esp32_serial_port.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/posix_serial_transport.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/posix_serial_transport.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/posix_serial_transport.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/posix_serial_transport.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Duvc_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/uvc_camera/CMakeFiles/uvc_camera.dir/src/uvc_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp", - "output": "cmvr-es/devices/camera/uvc_camera/CMakeFiles/uvc_camera.dir/src/uvc_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Drealsense_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera.dir/src/realsense_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera.cpp", - "output": "cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera.dir/src/realsense_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera_test.dir/src/realsense_camera_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera_test.cpp", - "output": "cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera_test.dir/src/realsense_camera_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/mujoco_camera/CMakeFiles/mujoco_camera.dir/src/mujoco_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera/src/mujoco_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera/src/mujoco_camera.cpp", - "output": "cmvr-es/devices/camera/mujoco_camera/CMakeFiles/mujoco_camera.dir/src/mujoco_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dffmpeg_speaker_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -g -std=gnu++17 -fPIC -o cmvr-es/devices/speaker/ffmpeg_speaker/CMakeFiles/ffmpeg_speaker.dir/src/ffmpeg_speaker.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker/src/ffmpeg_speaker.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker/src/ffmpeg_speaker.cpp", - "output": "cmvr-es/devices/speaker/ffmpeg_speaker/CMakeFiles/ffmpeg_speaker.dir/src/ffmpeg_speaker.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dffmpeg_microphone_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -g -std=gnu++17 -fPIC -o cmvr-es/devices/microphone/ffmpeg_microphone/CMakeFiles/ffmpeg_microphone.dir/src/ffmpeg_microphone.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone/src/ffmpeg_microphone.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone/src/ffmpeg_microphone.cpp", - "output": "cmvr-es/devices/microphone/ffmpeg_microphone/CMakeFiles/ffmpeg_microphone.dir/src/ffmpeg_microphone.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Drh56dftp_dexhand_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand.dir/src/rh56dftp_dexhand.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand.cpp", - "output": "cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand.dir/src/rh56dftp_dexhand.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand_test.dir/src/rh56dftp_dexhand_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand_test.cpp", - "output": "cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand_test.dir/src/rh56dftp_dexhand_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dpx_6ax_gen3_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3.dir/src/px_6ax_gen3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3.cpp", - "output": "cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3.dir/src/px_6ax_gen3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3_test.dir/src/px_6ax_gen3_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3_test.cpp", - "output": "cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3_test.dir/src/px_6ax_gen3_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhead_esp32_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/devices/biohead/biohead_esp32/CMakeFiles/head_esp32.dir/src/biohead_esp32.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32/src/biohead_esp32.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32/src/biohead_esp32.cpp", - "output": "cmvr-es/devices/biohead/biohead_esp32/CMakeFiles/head_esp32.dir/src/biohead_esp32.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dhumanoid_robot_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot.dir/src/humanoid_robot.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot.cpp", - "output": "cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot.dir/src/humanoid_robot.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot_test.dir/src/humanoid_robot_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot_test.cpp", - "output": "cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot_test.dir/src/humanoid_robot_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcanbus_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/canbus/CMakeFiles/canbus.dir/can_client/socket/socket_can_client_raw.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/canbus.dir/can_client/socket/socket_can_client_raw.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcanbus_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/canbus/CMakeFiles/canbus.dir/common/byte.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/common/byte.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/common/byte.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/canbus.dir/common/byte.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/socket_can_client_raw_test.dir/can_client/socket/socket_can_client_raw_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/socket_can_client_raw_test.dir/can_client/socket/socket_can_client_raw_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/protocol_data_test.dir/can_comm/protocol_data_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/protocol_data_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/protocol_data_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/protocol_data_test.dir/can_comm/protocol_data_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/message_manager_test.dir/can_comm/message_manager_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/message_manager_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/message_manager_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/message_manager_test.dir/can_comm/message_manager_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/can_sender_test.dir/can_comm/can_sender_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_sender_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_sender_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/can_sender_test.dir/can_comm/can_sender_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/can_receiver_test.dir/can_comm/can_receiver_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_receiver_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_receiver_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/can_receiver_test.dir/can_comm/can_receiver_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/motor/CMakeFiles/motor_manager_test.dir/motor_manager_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/motor_manager_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/motor_manager_test.cpp", - "output": "cmvr-es/devices/motor/CMakeFiles/motor_manager_test.dir/motor_manager_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_sdo_response.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_sdo_response.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_sdo_response.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_sdo_response.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo1.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo1.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo1.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo1.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo2.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo1.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo1.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo1.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo1.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo2.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/ti5_motor_canopen_protocol.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/ti5_motor_canopen_protocol.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/ti5_motor_canopen_protocol.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/ti5_motor_canopen_protocol.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/ti5_motor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/ti5_motor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/ti5_motor.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/ti5_motor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_factory.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_factory.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_factory.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_factory.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_manager.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_manager.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_manager.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_manager.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/system_monitor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/system_monitor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/system_monitor.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/system_monitor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Ddisk_monitor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor/diskmonitor/CMakeFiles/disk_monitor.dir/src/disk_monitor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor/src/disk_monitor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor/src/disk_monitor.cpp", - "output": "cmvr-es/monitor/diskmonitor/CMakeFiles/disk_monitor.dir/src/disk_monitor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_factory.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_factory.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_factory.cpp", - "output": "cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_factory.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_manager.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_manager.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_manager.cpp", - "output": "cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_manager.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_camera_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_camera_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_camera_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_camera_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_system_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_system_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_system_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_system_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_speaker_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_speaker_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_speaker_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_speaker_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_microphone_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_microphone_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_microphone_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_microphone_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_head_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_head_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_head_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_head_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_dexhand_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_dexhand_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_dexhand_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_dexhand_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_humanoid_robot_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_humanoid_robot_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_hlc_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_hlc_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/server_runner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/server_runner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/server_runner.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/server_runner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/service/CMakeFiles/grpc_humanoid_robot_client_test.dir/grpc/src/grpc_humanoid_robot_client_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_client_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_client_test.cpp", - "output": "cmvr-es/service/CMakeFiles/grpc_humanoid_robot_client_test.dir/grpc/src/grpc_humanoid_robot_client_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/service/CMakeFiles/grpc_hlc_client_test.dir/grpc/src/grpc_hlc_client_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_client_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_client_test.cpp", - "output": "cmvr-es/service/CMakeFiles/grpc_hlc_client_test.dir/grpc/src/grpc_hlc_client_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dperception_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/perception/CMakeFiles/perception.dir/src/tag_relative_target_3d.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d.cpp", - "output": "cmvr-es/perception/CMakeFiles/perception.dir/src/tag_relative_target_3d.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dperception_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/perception/CMakeFiles/perception.dir/src/apriltag_perception.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/apriltag_perception.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/apriltag_perception.cpp", - "output": "cmvr-es/perception/CMakeFiles/perception.dir/src/apriltag_perception.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/perception/CMakeFiles/tag_relative_target_3d_test.dir/src/tag_relative_target_3d_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d_test.cpp", - "output": "cmvr-es/perception/CMakeFiles/tag_relative_target_3d_test.dir/src/tag_relative_target_3d_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcontroller_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/controller/CMakeFiles/controller.dir/src/ibvs_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/ibvs_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/ibvs_controller.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller.dir/src/ibvs_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcontroller_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/controller/CMakeFiles/controller.dir/src/pid_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/pid_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/pid_controller.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller.dir/src/pid_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DELPP_NO_DEFAULT_LOG_FILE -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/controller/CMakeFiles/controller_test.dir/src/controller_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/controller_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/controller_test.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller_test.dir/src/controller_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner_creator.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_creator.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_creator.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner_creator.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/toppra_bspline.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/toppra_bspline.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/toppra_bspline.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/toppra_bspline.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_position_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_position_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_position_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_position_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_velocity_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_velocity_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_velocity_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_velocity_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/cartesian_space_planner/src/cartesian_twist_limiter.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/cartesian_space_planner/src/cartesian_twist_limiter.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/planner/CMakeFiles/joint_space_planner_test.dir/joint_space_planner/src/joint_space_planner_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_test.cpp", - "output": "cmvr-es/planner/CMakeFiles/joint_space_planner_test.dir/joint_space_planner/src/joint_space_planner_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/planner/CMakeFiles/cartesian_twist_limiter_test.dir/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp", - "output": "cmvr-es/planner/CMakeFiles/cartesian_twist_limiter_test.dir/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver_creator.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver_creator.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver_creator.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver_creator.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/urdf_parser.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/urdf_parser.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/urdf_parser.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/urdf_parser.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_ik_base.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_ik_base.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_ik_base.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_ik_base.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_dls_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_dls_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_dls_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_dls_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_qp_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_qp_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_qp_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_qp_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/bias_srs_ik_slover.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/bias_srs_ik_slover.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/bias_srs_ik_slover.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/bias_srs_ik_slover.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/joints_limit_analyzer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/joints_limit_analyzer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/joints_limit_analyzer.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/joints_limit_analyzer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/lawba_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/lawba_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/lawba_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/lawba_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/opt_psi_selector.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/opt_psi_selector.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/opt_psi_selector.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/opt_psi_selector.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/ik_solver/CMakeFiles/srs_ik_test.dir/src/srs_ik_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/srs_ik_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/srs_ik_test.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/srs_ik_test.dir/src/srs_ik_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/ik_solver/CMakeFiles/ik_test.dir/src/ik_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_test.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_test.dir/src/ik_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -g -std=gnu++17 -fPIC -o cmvr-es/data_center/CMakeFiles/data_center.dir/src/data_center.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/data_center.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/data_center.cpp", - "output": "cmvr-es/data_center/CMakeFiles/data_center.dir/src/data_center.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -g -std=gnu++17 -fPIC -o cmvr-es/data_center/CMakeFiles/data_center.dir/src/motors_info.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/motors_info.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/motors_info.cpp", - "output": "cmvr-es/data_center/CMakeFiles/data_center.dir/src/motors_info.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/applications/CMakeFiles/applications.dir/src/touch_screen_app.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app.cpp", - "output": "cmvr-es/applications/CMakeFiles/applications.dir/src/touch_screen_app.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/applications/CMakeFiles/touch_screen_app_test.dir/src/touch_screen_app_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app_test.cpp", - "output": "cmvr-es/applications/CMakeFiles/touch_screen_app_test.dir/src/touch_screen_app_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_adapter.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_adapter.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_adapter.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_adapter.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_dispatch.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_dispatch.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_dispatch.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_dispatch.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/mujoco_viewer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/mujoco_viewer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/mujoco_viewer.cpp", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/mujoco_viewer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/platform_ui_adapter.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/platform_ui_adapter.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/platform_ui_adapter.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/platform_ui_adapter.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/simulate.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/simulate.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/simulate.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/simulate.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/curve/src/s_curve.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/curve/src/s_curve.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/curve/src/s_curve.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/curve/src/s_curve.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/config_helper/src/config_setting.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/config_helper/src/config_setting.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/config_helper/src/config_setting.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/config_helper/src/config_setting.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/CameraCapture.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/CameraCapture.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/CameraCapture.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/CameraCapture.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/RealSenseCapture.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/RealSenseCapture.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/RealSenseCapture.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/RealSenseCapture.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoFrameEncoder.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoFrameEncoder.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoFrameEncoder.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoFrameEncoder.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoWriter.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoWriter.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoWriter.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoWriter.cpp.o" -} -] \ No newline at end of file diff --git a/data/plot.png b/data/plot.png deleted file mode 100644 index fa1eda91..00000000 Binary files a/data/plot.png and /dev/null differ diff --git a/data/plot1.png b/data/plot1.png deleted file mode 100644 index 11a4ca21..00000000 Binary files a/data/plot1.png and /dev/null differ diff --git a/data/s_curve_acceleration.png b/data/s_curve_acceleration.png deleted file mode 100644 index c25c21ea..00000000 Binary files a/data/s_curve_acceleration.png and /dev/null differ diff --git a/data/s_curve_acceleration.svg b/data/s_curve_acceleration.svg deleted file mode 100644 index 08f41d97..00000000 --- a/data/s_curve_acceleration.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -6 - - - - - - - - - - - - - -4 - - - - - - - - - - - - - -2 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 4 - - - - - - - - - - - - - 6 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - acceleration [m/s2] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Acceleration - - - - - - - diff --git a/data/s_curve_jerk.png b/data/s_curve_jerk.png deleted file mode 100644 index 26bdd840..00000000 Binary files a/data/s_curve_jerk.png and /dev/null differ diff --git a/data/s_curve_jerk.svg b/data/s_curve_jerk.svg deleted file mode 100644 index 9c43a0a9..00000000 --- a/data/s_curve_jerk.svg +++ /dev/null @@ -1,518 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -10 - - - - - - - - - - - - - -5 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 5 - - - - - - - - - - - - - 10 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - jerk [m/s3] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Jerk - - - - - - - diff --git a/data/s_curve_position.png b/data/s_curve_position.png deleted file mode 100644 index b811df44..00000000 Binary files a/data/s_curve_position.png and /dev/null differ diff --git a/data/s_curve_position.svg b/data/s_curve_position.svg deleted file mode 100644 index 27d2cfcb..00000000 --- a/data/s_curve_position.svg +++ /dev/null @@ -1,531 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 3 - - - - - - - - - - - - - 4 - - - - - - - - - - - - - 5 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - position [m] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Position - - - - - - - diff --git a/data/s_curve_velocity.png b/data/s_curve_velocity.png deleted file mode 100644 index 887b0764..00000000 Binary files a/data/s_curve_velocity.png and /dev/null differ diff --git a/data/s_curve_velocity.svg b/data/s_curve_velocity.svg deleted file mode 100644 index 825bab4e..00000000 --- a/data/s_curve_velocity.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - velocity [m/s] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Velocity - - - - - - - diff --git a/docs/device_safety_control_plane_architecture.md b/docs/device_safety_control_plane_architecture.md new file mode 100644 index 00000000..4e4ac300 --- /dev/null +++ b/docs/device_safety_control_plane_architecture.md @@ -0,0 +1,1846 @@ +# CMVR-ES 统一设备安全控制面架构设计 + +状态:Implemented in software;默认 Shadow rollout;真实硬件与发布验收待完成 + +修订:2026-08-14,具体认证实现延后,保留统一安全扩展边界并收紧匿名 Recover 暴露 + +范围:设备命令准入、控制权、StopAll、软件锁止恢复、gRPC 请求上下文与安全扩展边界、命令幂等、设备安全状态上报 + +实施方式:阶段 0 到阶段 5,共六个阶段 + +## 当前实施状态(2026-08-14) + +当前分支已经完成六阶段所需的软件骨架和主要入口迁移,但没有把“代码已具备能力”误写成 +“生产安全验收已完成”。源码默认配置仍使用 `SHADOW`、`INSECURE + DISABLED` 和 +`RECOVERY_DISABLED`;切换 `ENFORCE_SELECTED/ENFORCE_ALL` 或开放本机恢复前,必须先完成 +对应设备和部署环境的验收。 + +| 阶段 | 当前状态 | 已落地内容 | 尚未完成 | +| --- | --- | --- | --- | +| 0 | 软件完成 | 统一 RequestContext、完整 method policy/call guard、anonymous principal、显式 Insecure/Disabled 配置、RecoveryExposure 和持久审计边界 | TLS、Token、JWT、mTLS provider 按本轮决策不实现 | +| 1 | 软件完成 | safety types、SnapshotStore、设备 adapter、公共 reason/execution state、service instance、CommandLedger | 厂商结果语义仍需逐台真机校准 | +| 2 | 软件完成 | DeviceManager 持有 SafetyManager、legacy participant、GetSafetyState、启动 coverage 校验、Shadow/Enforce 配置 | 真实运行 Shadow 日志评审 | +| 3 | 软件完成 | Arm、ArmTeleop、AGV、Motor、DexHand、PTZ、ActionQueue 统一准入;dispatch 前 permit/final check;PTZ START/STOP 服务端派生 lane | 每类设备真实停车确认和 ACK/断网故障注入 | +| 4 | 软件完成 | 通用 participant StopAll、RecoveryLedger、RecoverSafetyState、LocalOnly/Authorized policy、审计失败 fail-closed、shutdown quiesce | LocalOnly 现场入口和审计文件运维验收 | +| 5 | 部分完成 | Camera/Microphone/Speaker/BioHead/HLC、TouchScreenTask、媒体 Hub/QUIC Sensor start 已迁移;Enforce 启动覆盖校验已实现 | 默认切换 EnforceAll、删除兼容 gate、capability manifest、安装产物 smoke、TSAN 和真机台架 | + +认证和证书不是本次整改的运行前提。当前只实现无证书的兼容 Profile;配置选择尚未实现的 +认证或 TLS 模式会启动失败,不会静默回退。匿名部署的恢复默认关闭,只有显式配置 +`RECOVERY_LOCAL_ONLY`、服务端确认实际 peer 为 loopback/Unix socket 且持久审计可写时才可开放。 + +AUBO 另有一条设备内硬件语义:示教器/控制柜 `RobotEmergencyStop` 或外部系统输入 +`SystemEmergencyStop` 曾有效、随后输入消失且控制器重新报告 `Normal/ReducedMode` 时, +驱动会自动上电到 `Idle`、清理旧队列、执行 `startup()`,并在 `Running` 下再次确认 +quiescent 后解除该硬件锁存,使新的 gRPC 指令可以重新准入; +软件 `emergencyStop()` 使用独立 `SoftwareEmergencyStop` 锁存,即使它与硬件急停重叠也绝不被 +硬件输入释放自动清除。自动流程不 resume、不重放旧目标;显式 Stop/PowerOff 会取消本轮自动上电。 + +## 1. 决策摘要 + +本设计采用以下核心决策: + +1. `DeviceManager` 继续负责设备注册和生命周期,并持有一个独立、可测试的 + `SafetyManager`。状态机代码不直接堆入 `DeviceManager`。 +2. Service 不再自行组合 StopAll gate、设备状态和控制权判断。所有会改变设备或 + 活动状态的命令必须声明 `CommandIntent`,通过统一准入获得短生命周期的 + `AdmissionPermit`。 +3. 设备层不把厂商硬件规则上移。设备或设备适配器持续发布硬件事实,并在真正下发 + 命令前执行最后一次硬件安全检查。 +4. 生命周期、健康状态和安全状态保持正交。`Running`、`Healthy` 都不等于当前可以 + 接受执行器命令。 +5. 策略分为 `SensorPolicy` 和 `ControlPolicy` 两个默认族,但最终按命令意图判定。 + DexHand、Camera PTZ 等混合设备不能只按整个设备归类。 +6. Stop、状态查询和安全恢复使用独立安全通道,不受普通命令 gate 阻塞。 +7. 对外接口命名为 `RecoverSafetyState`。它只在重新验证硬件事实后清除软件准入锁止, + 不能忽略急停、保护停、未知状态或仍未确认的运动。 +8. 普通 unary 控制命令使用统一幂等账本;流式控制使用 session epoch 和严格递增的 + sequence。任何 `OUTCOME_UNKNOWN` 都不得自动重发。 +9. 当前小范围部署不把 TLS、Token、mTLS 等具体认证实现作为设备安全架构的前置条件, + 但阶段 0 必须先建立统一 `RequestContext`、认证提供者、授权策略和审计扩展边界。 +10. 认证关闭时由服务端注入固定的 `anonymous` principal,不能接受客户端自报身份或角色; + `RecoverSafetyState` 默认禁用,只有本机受限模式可以显式开放。 +11. 传输加密、身份认证和方法授权是三个正交层。后续增加静态 Token、JWT 或 mTLS 时, + 只能替换安全网关组件,不修改设备、`SafetyManager` 或业务 Proto。 +12. 该软件控制面不替代独立物理急停,也不声明 SIL、PL 或其他功能安全等级。 + +## 2. 改造前基础与需要保留的行为 + +项目已有一些经过并发测试的能力,应当迁移和复用,而不是重新实现: + +| 当前能力 | 目标用法 | +| --- | --- | +| `ControlAuthorityManager` 的 lease、generation、dispatch fence、quarantine | 作为 `SafetyManager` 内部控制权组件 | +| `StopAllAdmissionGate` 的并发 round 和失败后 fail-closed | 作为阶段 2、3 的兼容参与者,最终由统一状态机接管 | +| `ActionQueueExecutor` 的 `action_id`、service instance 和精确 retired ID 账本 | 作为普通命令幂等账本的语义模板 | +| Motor、Media、Camera activity coordinator | 先包装为 `SafetyParticipant`,最后逐步合并 | +| `StopOperationDispatcher` 的有界异步停止和生命周期管理 | 作为统一 StopAll 执行器的基础 | +| `DeviceManager::inventorySnapshot()` | StopAll 枚举设备时继续使用,禁止持锁进入驱动 | +| `Runtime` 的启动失败回滚和退出时 Task/Device 停止 | 保留,并在退出前增加全局安全准入关闭 | + +整改开始时的主要缺口是: + +- gRPC 默认全网卡明文监听,没有认证和授权;当前阶段可以接受该部署风险,但必须通过显式配置、 + 网络隔离和恢复接口限制控制暴露范围; +- 普通控制 RPC 缺少 `command_id` 和统一重试语义; +- StopAll 在 `grpc_system_service.cpp` 内按设备类型硬编码; +- Arm、AGV、Motor、Media、ActionQueue 分别维护 gate 和 generation; +- 只有少数设备实现 `healthSnapshot()`,且健康状态不能表示硬件安全事实; +- `DeviceManager::snapshot()` 仍会在调用线程逐个调用设备方法; +- 普通 service 直接取得设备并调用驱动,无法保证所有入口都经过同一准入; +- Aubo 等驱动存在“硬件可能已接受,但软件未观察到执行 ID”的不确定结果窗口; +- 错误类型没有统一映射,客户端容易对不应重试的命令进行重试。 + +当前实现锚点: + +- gRPC 监听和 credentials:`cmvr-es/task/grpc_server_task/src/grpc_server_task.cpp`; +- SystemService StopAll:`cmvr-es/service/grpc/server/src/grpc_system_service.cpp`; +- 全局 gate:`cmvr-es/service/grpc/stop_all/include/stop_all_admission_gate.h`; +- 控制权:`cmvr-es/manager/control_authority_manager/include/control_authority_manager.h`; +- 设备生命周期和快照:`cmvr-es/manager/device_manager/`; +- 通用请求头:`protos/cmvr/api/common.proto`; +- System API:`protos/cmvr/api/system_service.proto` 和 `system_command.proto`。 + +## 3. 目标、非目标与安全不变量 + +### 3.1 目标 + +- 所有 gRPC、ActionQueue、Teleoperation 和未来 QUIC 控制入口共享同一安全准入。 +- 新增设备时,安全层只要求注册能力和策略,不修改 StopAll 或 SystemService 主流程。 +- 单个驱动、网络或状态刷新阻塞不能拖住其他设备的 Stop、Status 或 Recover。 +- StopAll、设备级不确定结果和进程重启都能通过 generation 使旧命令永久失效。 +- 锁止原因、状态新鲜度、阻塞设备和恢复结果能够被机器读取和审计。 +- 迁移期间保持现有 API wire compatibility,并允许按设备逐步启用 enforce。 +- 具体认证实现延后时,所有请求仍经过稳定的安全上下文边界;未来启用认证不需要改动 + Service 业务分支、状态机、驱动接口或业务 Proto。 + +### 3.2 非目标 + +- 不把厂商协议、关节限制、工作空间或设备专用故障码搬入 `DeviceManager`。 +- 不允许远程接口绕过真实硬件急停或保护停。 +- 不保证所有设备在一个阶段内同时完成迁移。 +- 不用软件 StopAll 替代机器人、PLC、驱动器或安全控制器的独立安全回路。 +- 不在本设计中实现运行期卸载设备插件;只消除安全协调器中的设备类型硬编码。 +- 首轮六阶段实施不要求交付证书、静态 Token、JWT 或 mTLS;这些能力作为独立的后续安全加固项。 + +### 3.3 必须始终成立的不变量 + +1. `Stop`、`Status`、`GetSafetyState` 和 `RecoverSafetyState` 不依赖普通准入为 OPEN。 +2. 一次 StopAll 开始后,旧 epoch 的命令不能再进入设备下发点。 +3. StopAll 与正常命令竞态时,命令只能是“未下发”或“已被登记并纳入停止”,不能存在 + 未登记的第三种状态。 +4. 状态过期、设备失联、安全能力缺失对控制命令一律 fail-closed。 +5. 同一 effective principal 的同一 `command_id` 最多触发一次硬件提交;认证关闭时所有调用者 + 共享服务端生成的 `anonymous` principal,因此 command ID 必须在整个匿名部署内唯一。 +6. 相同 ID、不同语义 payload 必须返回冲突,不能覆盖旧记录。 +7. 硬件结果不确定时保存 `OUTCOME_UNKNOWN`,重试只能查询该结果,不能再次下发。 +8. 通用 `RecoverSafetyState` 成功只表示软件准入可重新评估,不表示设备被上电、使能、 + 解除急停或自动运动。AUBO 物理急停释放后的自动上电是独立、显式配置的设备内策略。 +9. `SafetyManager` 持有内部锁时不得调用设备、网络或可能阻塞的 participant 方法。 +10. 驱动最终安全检查失败时,即使已经获得 permit,也不能下发设备命令。 +11. 进程重启后,控制设备在新鲜状态确认完成前不能自动恢复到可控制状态。 +12. 所有安全状态转换都增加 epoch、产生事件,并记录明确 reason code。 +13. 匿名网络调用不能执行 `RecoverSafetyState`;认证关闭时只能显式禁用恢复,或仅允许 + 服务端判定为 loopback/Unix Domain Socket 的本机调用。该限制不能由请求字段覆盖。 + +## 4. 统一概念模型 + +### 4.1 三个互不替代的状态维度 + +| 维度 | 说明 | 示例 | +| --- | --- | --- | +| Lifecycle | 进程对设备对象的生命周期管理 | Initializing、Running、Stopped、Error | +| Health | 设备是否正常工作和是否存在故障 | Healthy、Degraded、Fault、Unknown | +| Safety | 当前事实是否足以接受某一类命令 | Nominal、Restricted、Unsafe、Unknown | + +`Lifecycle=Running` 只说明设备 worker 已启动;`Health=Healthy` 只说明没有已知故障; +两者都不能替代 Safety 中的状态新鲜度、急停、运动、使能和代际信息。 + +### 4.2 命令意图 + +```cpp +enum class CommandIntent { + Observe, // 只读状态、图像、传感数据 + StartActivity, // 启动采集、录制、播放等非运动活动 + Configure, // 修改参数、地图、非安全 IO 等 + Actuate, // 运动、速度、力、位置、使能、扭矩输出 + Stop, // 停车、取消、torque-off、停止活动 + ResetFault, // 设备级、不会自动产生运动的故障复位 + RecoverAdmission, // 系统级软件锁止恢复 +}; +``` + +每个 handler 必须在代码中声明固定意图。客户端不能通过请求字段自行选择意图。 + +### 4.3 两个默认策略族 + +```cpp +enum class SafetyPolicyFamily { + Sensor, + Control, +}; +``` + +- `Sensor` 表示非运动型采集或外围活动,不要求它在字面上一定是传感器。Camera、 + Microphone、Battery、普通 Speaker activity 可使用该策略。 +- `Control` 表示能够导致位置、速度、力、扭矩或机械结构变化的能力。Arm、AGV、Motor、 + DexHand 动作、Camera PTZ、BioHead 表情和仿真执行器使用该策略。 +- 混合设备按命令选择策略。例如 Camera 图像流是 Sensor,PTZ START 是 Control, + PTZ STOP 是 Stop。 + +### 4.4 硬件事实使用三值逻辑 + +安全事实不能把“未实现”解释为 false: + +```cpp +enum class TriState { Unknown, False, True }; + +enum class SafetyCondition { + Nominal, // 已知正常,可继续按具体命令规则判断 + Restricted, // 已知静止或受硬件抑制,但不满足普通执行条件 + Unsafe, // 已观察到不允许继续控制的状态 + Unknown, // 缺失、过期、失联或无法解释 +}; +``` + +推荐的进程内快照: + +```cpp +struct DeviceSafetySnapshot { + std::string device_id; + SafetyCondition condition{SafetyCondition::Unknown}; + std::uint64_t device_generation{0}; + std::uint64_t sample_sequence{0}; + std::chrono::steady_clock::time_point observed_at; + std::uint64_t observed_at_unix_ms{0}; + + TriState connected{TriState::Unknown}; + TriState operational_ready{TriState::Unknown}; + TriState quiescent{TriState::Unknown}; + TriState motion_active{TriState::Unknown}; + TriState actuator_enabled{TriState::Unknown}; + TriState emergency_stop_active{TriState::Unknown}; + TriState protective_stop_active{TriState::Unknown}; + TriState fault_active{TriState::Unknown}; + + std::vector blockers; +}; +``` + +`SafetyBlocker` 必须包含稳定 reason、来源和作用域: + +```cpp +enum class BlockerScope { Device, System }; +enum class RecoveryRequirement { + RefreshOnly, + ClearSoftwareLatch, + HardwareReleaseRequired, + ManualInspectionRequired, +}; + +struct SafetyBlocker { + SafetyReason reason; + BlockerScope scope; + RecoveryRequirement recovery_requirement; + std::string source_id; + std::string operation_id; +}; +``` + +设备本地急停可以只阻塞该设备;连接到整机安全链的急停必须发布 `System` scope,并阻止 +全局准入恢复。作用域由经过评审的设备/安全链 adapter 固定,不能由客户端或普通配置修改。 + +安全判断使用本机 monotonic age。UTC 只用于日志和跨系统诊断,不能参与准入时序。 + +`device_generation` 在以下情况增加: + +- 设备后端重新初始化; +- SDK、总线或网络 session 重连; +- 驱动状态机执行需要使旧命令失效的 reset; +- 设备被重新注册。 + +## 5. 目标架构与所有权 + +```mermaid +flowchart LR + Client["gRPC / QUIC / Local Task"] --> Gateway["Request Context Gateway
限制 可选认证 授权策略 审计"] + Gateway --> Adapter["Typed Service Adapter
声明 CommandIntent"] + Adapter --> Ledger["CommandLedger
幂等和结果"] + Adapter --> Coordinator["DeviceManager::SafetyManager"] + Coordinator --> Policy["SensorPolicy / ControlPolicy"] + Coordinator --> Authority["ControlAuthorityManager"] + Coordinator --> Participants["SafetyParticipant Registry"] + Coordinator --> Cache["SafetySnapshotStore"] + Coordinator --> Permit["AdmissionPermit"] + Permit --> Driver["DeviceSafetyEndpoint + Driver"] + Driver --> Cache + StopRecover["StopAll / Recover 安全通道"] --> Coordinator +``` + +### 5.1 建议目录 + +```text +cmvr-es/manager/safety_manager/ + include/safety_types.h + include/safety_reason.h + include/device_safety_endpoint.h + include/safety_participant.h + include/safety_snapshot_store.h + include/command_admission_controller.h + include/command_ledger.h + include/safety_operation_orchestrator.h + include/safety_manager.h + src/... + tests/... + +cmvr-es/service/grpc/security/ + include/grpc_request_context.h + include/grpc_authentication_provider.h + include/grpc_authorization_policy.h + include/grpc_method_policy_registry.h + include/grpc_security_interceptor.h + src/... + tests/... +``` + +新增 CMake target:`cmvr_es::safety_manager`。它可以依赖通用类型和 +`ControlAuthorityManager`,但不能依赖 gRPC、具体设备后端或厂商 SDK。 + +### 5.2 `DeviceManager` 的职责变化 + +`DeviceManager` 增加: + +```cpp +SafetyManager& safetyManager() noexcept; +const SafetyManager& safetyManager() const noexcept; +``` + +它负责: + +- 在设备创建后注册设备描述、Safety endpoint 和快照槽位; +- 在设备销毁前注销 participant; +- 在 lifecycle start/stop/restart 时推进 device generation; +- 在 Runtime shutdown 开始时先关闭全局准入; +- 对外提供纯内存的 Manager + Safety 联合快照。 + +它不负责: + +- 解析 Aubo、Huayan、SEER、Modbus 等厂商状态; +- 根据 `DeviceKind` 写具体停止逻辑; +- 在 Manager mutex 下执行硬件 I/O; +- 判断具体运动目标是否超限。 + +### 5.3 依赖注入 + +最终状态下,gRPC service 构造函数显式接收: + +```cpp +DeviceManager& +SafetyManager& +CommandLedger& +GrpcSecurityGateway& +``` + +每个 handler 通过一个统一 call guard 取得不可变 `RequestContext`。认证 metadata 的解析、 +peer 归一化、角色生成和恢复接口暴露检查只存在于 `GrpcSecurityGateway`;业务 Service 不直接 +解析 metadata,也不从 request message 读取 principal 或 role。具体实现可以由 interceptor +完成前置检查,再由 call guard 取得同一次调用的上下文,但不能依赖 thread-local 传递上下文。 + +阶段 2 可以保留无参构造函数作为兼容入口,但它只能转发到上述依赖。阶段 5 删除业务 +代码对进程级 safety singleton 的直接访问。测试使用独立 coordinator,不再依赖 +`clearForTesting()` 清理全局状态。 + +### 5.4 管理面与设备运行面分离 + +“Stop/Status/Recover 始终可达”不仅要求它们绕过普通 gate,也要求单个设备初始化失败时 +gRPC 管理面仍能启动。目标 Runtime 启动顺序为: + +```text +load config and logging + -> construct DeviceManager core and SafetyManager + -> validate selected gRPC security profile and start management-plane services + -> initialize/start devices + -> reconcile required control snapshots + -> start operational tasks + -> Open with device-level Blocked, or global Latched +``` + +- 配置损坏、所选安全 Profile 的身份材料无效或 SafetyManager 核心构造失败仍使进程启动失败; +- `AuthenticationMode::Disabled` 是显式兼容模式,不伪装成“已认证”;如果使用非 loopback + 明文监听,启动日志、GetSystemInfo 和指标必须持续暴露该风险; +- 单个设备 create/init/start 失败记录在 inventory,并使相关资源 Blocked; +- Device scope 的动态 Unknown/Unsafe 使相关资源 Blocked,System scope blocker 使全局 Latched, + 两者都不停止 SystemService; +- 普通设备 service 可以继续注册,访问失败设备时返回结构化 DEVICE_UNAVAILABLE; +- TaskManager 需要区分 ManagementPlane 和 Operational task,后者失败不能回滚前者; +- 物理急停和本机停机手段始终独立于该网络管理面。 + +在完成该拆分前,“始终可达”只保证 gRPC server 已成功运行期间的行为,不能覆盖当前 +Runtime 在任一 required device 启动失败时直接退出的情况。 + +## 6. 快照发布与线程模型 + +### 6.1 发布模型 + +正常准入和状态查询只能读取 `SafetySnapshotStore`,不能同步查询驱动。 + +```text +driver callback / polling worker + | + v +DeviceSafetyEndpoint normalizes vendor facts + | + v +SafetySnapshotPublisher::publish(value) + | + v +SafetySnapshotStore atomic value slot +``` + +现有设备可以先通过独立 adapter worker 拉取状态;新设备应优先在自己的 SDK callback 或 +状态轮询线程中发布。Manager heartbeat、gRPC Status 和准入只复制值。 + +现有 `healthSnapshot()` 在迁移期只能由 DeviceMonitor 后台 worker 调用,并使用每设备隔离和 +超时;不能继续由 `DeviceManager::snapshot()` 的调用线程执行。目标状态是设备同时发布缓存的 +Health 和 Safety,两者仍保持独立字段。 + +### 6.2 Freshness + +每个 `DeviceSafetyDescriptor` 声明默认最大状态年龄。配置只允许将阈值收紧,不能在生产模式下 +放宽超过代码定义的硬上限。 + +- Sensor Observe 可在业务允许时返回带 `stale=true` 的历史值; +- Sensor StartActivity 在 Missing/Stale 时拒绝; +- Control Actuate、Configure 和 ResetFault 在 Missing/Stale 时拒绝; +- Stop 不因状态过期而拒绝,仍直接尝试安全停止; +- Recover 必须获得一个晚于本次 refresh request 的新样本。 + +### 6.3 主动刷新 + +`RecoverSafetyState` 需要主动复核,但仍不在 gRPC 线程直接做设备 I/O: + +1. 记录当前 `sample_sequence`; +2. 调用 endpoint 的非阻塞 `requestSafetyRefresh()`; +3. 在专用 recovery executor 等待 sequence 增加; +4. 超时则产生 `SAFETY_STATE_STALE` blocker,保持锁止。 + +### 6.4 锁和执行器约束 + +- Coordinator 锁只保护状态转换、epoch、slot 和 participant registry; +- Snapshot slot 使用原子 shared snapshot 或短持有独立 mutex; +- `beginDispatch()` 只建立 fence 和 in-flight 计数,不等待物理运动结束; +- 设备调用、停止和刷新均在锁外执行; +- Stop/Recover 使用有界 worker pool,不为每次调用创建 detached thread; +- 每个 legacy health probe 最多允许一个 in-flight worker,卡住后只标记 stale,不重复创建线程; +- participant 注销前必须等待自己的 callback 和 stop handle 退出。 + +## 7. 状态机 + +### 7.1 系统准入状态 + +```mermaid +stateDiagram-v2 + [*] --> Starting + Starting --> Open: required snapshots reconciled + Starting --> Latched: unknown active control or startup failure + Open --> Stopping: StopAll + Stopping --> Open: all participants quiescent + Stopping --> Latched: timeout or unconfirmed stop + Latched --> Recovering: authorized recovery + Recovering --> Open: every required latch cleared + Recovering --> Latched: blocker remains + Starting --> ShuttingDown: shutdown + Open --> ShuttingDown: shutdown + Stopping --> ShuttingDown: shutdown + Latched --> ShuttingDown: shutdown + Recovering --> ShuttingDown: shutdown +``` + +每次进入 `Stopping`、`Latched`、`Recovering` 或 `ShuttingDown` 都增加 `safety_epoch`。 + +### 7.2 设备准入状态 + +```cpp +enum class DeviceAdmissionState { + Observing, // 已注册,等待第一份有效快照 + Open, + Blocked, // 确定的硬件或生命周期条件不满足 + Quarantined, // 命令或停止结果不确定,需要人工恢复流程 + Recovering, + Removed, +}; +``` + +- `Blocked` 可以在新鲜硬件事实改善后自动回到 Open,例如设备故障被合法清除; +- `Quarantined` 不能仅靠一份健康快照自动清除,必须经过 recovery transaction; +- 一个普通设备命令的结果不确定时,默认只 quarantine 对应 control resource; +- StopAll 无法确认全部参与者时,全局状态进入 Latched。 + +### 7.3 命令生命周期 + +```text +RECEIVED + -> RESERVED + -> REJECTED_BEFORE_DISPATCH + -> ADMITTED + -> DISPATCHING + -> ACCEPTED_BY_HARDWARE + -> COMPLETED | FAILED | CANCELED | OUTCOME_UNKNOWN +``` + +`ACCEPTED_BY_HARDWARE` 的含义必须由每个 adapter 明确定义。SDK 返回码、queue ID、任务 ID、 +ACK 或写入总线分别可能具有不同强度,不能统一解释成“运动完成”。 + +## 8. 命令准入算法 + +### 8.1 普通 unary 控制命令 + +1. Request Context Gateway 完成大小限制、correlation ID、上下文构造和授权策略检查;只有 + 当前 Profile 启用 AuthN 时才执行身份认证。 +2. 解析 `command_id`、service instance、device generation 和本地有效期。 +3. CommandLedger 按 effective principal 预留 ID,并计算语义 payload hash;Disabled 模式使用 + 服务端固定的 `anonymous` namespace。 +4. 若存在同 ID 记录:相同 hash 返回/等待原结果;不同 hash 返回冲突。 +5. Service 使用固定 `CommandDescriptor` 调用 `SafetyManager::admit()`。 +6. Coordinator 在短锁内读取 global state、safety epoch、device slot 和 cached snapshot。 +7. Policy 判断意图、freshness、硬件事实、设备状态和调用角色。 +8. Control intent 获取或校验 `ControlAuthorityManager` lease。 +9. 返回 move-only `AdmissionPermit`,其中固定所有 generation 和 deadline。 +10. Service 调用 `beginDispatch(permit)`。这里是 StopAll 与命令提交的线性化点。 +11. 驱动在自己的串行化上下文中执行最终硬件检查。 +12. 通过检查后调用 SDK,并把结果写入 ledger;失败或异常也必须终结 ledger 记录。 + +`AdmissionPermit` 至少包含: + +```cpp +struct AdmissionPermit { + std::string command_id; + std::string device_id; + CommandIntent intent; + std::uint64_t safety_epoch; + std::uint64_t device_generation; + std::uint64_t authority_generation; + std::chrono::steady_clock::time_point deadline; +}; +``` + +### 8.2 Stop 与 ResetFault + +- Stop 走安全通道,不需要普通 permit,也不受全局 Latched 阻塞; +- Stop 仍需经过 RequestContext、当前 Profile 的访问策略、参数校验、超时和审计;认证关闭时 + 不额外拒绝 Stop,因为停止能力必须保持可达; +- Stop 不因 expected service instance、device generation 或 safety epoch 过期而拒绝;这些字段 + 对 Stop 仅用于诊断,因为安全停止必须优先于防重放限制; +- 重复 Stop 应加入当前 stop operation 或执行幂等停止,不能因为缺少 command ID 而拒绝; +- ResetFault 可在 Latched 下执行,但必须声明为不会上电、使能或恢复运动; +- 如果某厂商的 clear-fault 同时会 resume、enable 或移动,必须拆成两个 typed 操作, + 不能把它登记成 ResetFault; +- ResetFault 成功只触发安全快照刷新,不直接清除 central quarantine。 + +### 8.2.1 整机运行态恢复 + +`SystemService.RestoreOperationalState` 是面向上层平台的整机恢复事务,与 +`RecoverSafetyState` 的软件准入恢复语义分离: + +- 请求必须携带唯一 `recovery_id`、非空 `reason`,并通过与 Recover 相同的 + `RecoveryExposure` 和持久审计策略; +- 事务固定覆盖全部已注册设备,并与 StopAll、其他恢复事务通过 process operation mutex + 串行;事务期间系统处于 Recovering,拒绝新的普通运动命令; +- 硬件恢复前必须主动取得新鲜快照,确认设备已连接;Control 设备还必须确认物理急停已释放 + 且已经静止。条件未知、急停仍有效、设备仍运动或审计授权失败时,不调用设备恢复能力; +- 对尚未达到 Nominal/operational-ready 的支持设备调用 + `DeviceSafetyEndpoint::restoreOperationalState()`。Legacy Arm 和 AGV adapter 分别调用设备 + `clearFault()`;该操作允许按设备实现执行上电、使能和故障复位,但不得恢复旧轨迹、导航、 + teleop session、control lease 或 ActionQueue; +- 每个硬件恢复动作完成后必须再次主动刷新,确认连接、新鲜度、急停、保护停、fault、静止和 + operational-ready。任一设备失败时系统保持 Latched,并返回逐设备失败原因;中央 quarantine、 + retained barrier 和全局 gate 不做部分释放; +- 只有全部必需设备验证成功后,才协调释放软件 latch 和 retained barrier,将系统切回 Open。 + 调用成功只表示整机已使能、空闲并可接受新的 gRPC 命令,不会续跑中断前的任务。 + +### 8.3 流式控制 + +Teleoperation、Motor cyclic stream 和未来连续控制不为每个 setpoint 写 unary ledger: + +1. OPEN frame 生成 `control_session_id`,绑定 service instance、device generation、 + safety epoch 和 control lease; +2. setpoint sequence 必须严格递增,且带本地可解释的 `valid_for`; +3. 每个 setpoint 下发前轻量校验 session epoch、permit epoch、watchdog 和快照 freshness; +4. StopAll 或 Recover 增加 epoch 后,旧 stream 立即进入 HOLD/STOP,不可自动续接; +5. reconnect 必须创建新 session,不能恢复旧 ACTIVE 状态; +6. stream 结束、write/read 失败和 watchdog 均执行可验证的安全停止。 + +### 8.4 ActionQueue + +- 保留现有 ActionQueue `action_id` 和 service instance; +- 预校验阶段确认所有 step 已分类,但不提前获取可长期持有的 permit; +- 每个 step 真正开始前重新准入并取得当前 epoch 的 permit; +- step 的内部 command ID 由 `action_id + step_id` 确定性派生,不能要求嵌套请求再提供一个 + 可与 action 身份冲突的独立 ID; +- StopAll 仍能抢占队列和活动 step; +- 迁移完成后 ActionQueue 不再拥有独立的普通准入 generation,只保留队列执行 generation; +- 队列结果和单步 CommandLedger 记录使用关联 ID,但不得造成一次 step 两套独立重试语义。 + +## 9. 策略矩阵 + +### 9.1 SensorPolicy + +| Intent | Global Latched | Snapshot 要求 | 默认结果 | +| --- | --- | --- | --- | +| Observe | 允许 | 可返回 stale 标记;不能伪造为 fresh | Allow | +| StartActivity | 拒绝或按设备 Blocked | connected、fresh、无已知 fault | Conditional | +| Configure | 拒绝 | connected、fresh、配置操作已分类 | Conditional | +| Stop | 允许 | 不要求 fresh | Allow safety lane | +| ResetFault | 仅明确支持的设备 | fresh,且操作不会启动活动 | Conditional | +| RecoverAdmission | SafetyAdmin only | fresh sample required | Safety lane | + +### 9.2 ControlPolicy + +| Intent | 必要条件 | +| --- | --- | +| Observe | 始终允许读取缓存;返回 freshness 和 blocker | +| Configure | 全局 Open、设备非 Quarantined、fresh、命令不会隐式 Actuate | +| Actuate | 全局 Open、设备 Open、condition=Nominal、fresh、generation 匹配、lease 有效、deadline 有效、最终硬件检查通过 | +| Stop | 无条件进入安全通道;状态未知仍尝试 stop | +| ResetFault | 允许在 Blocked/Latched 下执行,但只允许非使能、非运动的 typed reset | +| RecoverAdmission | SafetyAdmin、expected epoch 匹配、主动刷新完成、quiescent=true、没有未知 stop worker | + +`emergency_stop_active=true` 或 `protective_stop_active=true` 可以表示设备被硬件抑制且物理上 +静止,但不能被 Recover 清除。Device scope blocker 继续阻止该设备 Actuate;System scope +blocker 继续保持全局 Latched。只有硬件被合法处理并发布新的事实后,恢复事务才可清理对应 +软件 latch。 + +## 10. 设备安全能力接口 + +### 10.1 描述与注册 + +```cpp +struct DeviceSafetyDescriptor { + std::string device_id; + DeviceKind kind; + SafetyPolicyFamily default_policy; + std::chrono::milliseconds maximum_snapshot_age; + bool requires_safe_stop; + bool supports_active_refresh; + bool supports_non_enabling_fault_reset; +}; + +struct DeviceSafetyRegistration { + DeviceSafetyDescriptor descriptor; + std::shared_ptr endpoint; + std::shared_ptr participant; +}; +``` + +控制设备在 enforce 模式下缺少 endpoint、fresh snapshot 或 safe-stop participant 时: + +- 启动阶段标记设备 safety capability invalid; +- 设备可以继续出现在 inventory 和诊断接口中; +- 所有 Actuate 命令拒绝; +- 配置要求严格启动时,可以直接使 Runtime 初始化失败。 + +新增全新 DeviceKind 仍可能需要修改现有 DeviceFactory、配置 Proto 和对外业务 API;本设计 +保证的是不再修改 SafetyManager、StopAll 和 Recover 的设备类型分支。 + +### 10.2 Endpoint + +```cpp +class DeviceSafetyEndpoint { +public: + virtual ~DeviceSafetyEndpoint() = default; + + virtual DeviceSafetyDescriptor descriptor() const = 0; + virtual void bindPublisher(SafetySnapshotPublisher publisher) = 0; + virtual void requestSafetyRefresh() noexcept = 0; + + // 在驱动自己的串行化上下文内执行。不得更改设备状态。 + virtual HardwareCheckResult validateBeforeDispatch( + const AdmissionPermit&) = 0; + + // 只协调驱动内部软件状态,不得上电、使能或启动运动。 + virtual RecoveryCheckResult reconcileAdmissionState( + const RecoveryContext&) = 0; +}; +``` + +如果最终检查需要厂商 I/O,它必须有设备级 deadline,并在驱动 executor 中执行;Manager +不持锁等待。超时返回 Unknown,不允许继续下发。 + +### 10.3 Safe-stop participant + +```cpp +class SafetyParticipant { +public: + virtual ParticipantDescriptor descriptor() const = 0; + + // 纯内存、快速关闭本 participant 的新工作准入。 + virtual BarrierToken beginBarrier(const SafetyOperationContext&) = 0; + + // 非阻塞提交停止,返回可等待 handle。 + virtual StopHandle requestQuiesce( + const BarrierToken&, const SafetyOperationContext&) = 0; + + // 验证“旧 generation 不会继续、当前输出已静止”。 + virtual QuiescenceResult verifyQuiescent( + const BarrierToken&, const SafetyOperationContext&) = 0; + + // 只清理软件 gate、retired holder 或内部 session。 + virtual RecoveryCheckResult recoverAdmission( + const BarrierToken&, const RecoveryContext&) = 0; + + virtual void releaseBarrier(const BarrierToken&) noexcept = 0; +}; +``` + +participant 可以代表设备,也可以代表 ActionQueue、MediaSourceManager、Motor session registry 等 +跨设备活动域。StopAll 不再知道具体 C++ 设备类型。 + +## 11. CommandLedger 与结果语义 + +### 11.1 Key 和 payload hash + +推荐 key:`(effective_principal_id, command_id)`。 + +`effective_principal_id` 只能由服务端安全网关产生:认证启用时取认证结果中的稳定 principal ID; +认证关闭时固定为 `anonymous`。不能使用 request、普通 metadata 中自报的 client ID,也不使用 +易变化的 TCP source port。匿名模式因此要求 command ID 在整个部署内全局唯一。 + +payload hash 包含: + +- 完整 gRPC method 名; +- device/resource ID; +- deterministic protobuf semantic payload; +- expected service instance 和 device generation; +- 不包含诊断 timestamp、认证 metadata 和 command ID 本身。 + +同一 effective principal 内 command ID 必须全局唯一。不同 method 复用同一 ID 会因 hash 不同而冲突。 + +### 11.2 记录内容 + +```cpp +struct CommandRecord { + CommandKey key; + PayloadHash payload_hash; + CommandLifecycle lifecycle; + CommandOutcome outcome; + std::uint64_t safety_epoch; + std::uint64_t device_generation; + bool hardware_submission_possible; + steady_clock::time_point accepted_at; + steady_clock::time_point terminal_at; +}; +``` + +- In-flight 和近期 terminal 结果保留完整响应; +- 淘汰完整结果后保留精确 retired-ID tombstone; +- 达到硬容量后拒绝新 ID,不淘汰仍可能被重放的 tombstone; +- 账本耗尽使用 `RESOURCE_EXHAUSTED/LEDGER_EXHAUSTED`,不能降级成无幂等执行; +- 进程内账本不要求落盘,但客户端必须携带 expected service instance; +- 进程重启后旧 instance 请求拒绝,控制设备先完成 startup reconciliation 才可 Open。 + +### 11.3 RPC 取消 + +- 在 RESERVED/ADMITTED 且未 dispatch 时取消:终结为 `CANCELED_BEFORE_DISPATCH`; +- 硬件已接受后客户端断开:不能假设命令取消,继续记录实际结果; +- 需要“断线即停”的命令必须显式使用 session/watchdog 协议; +- retry 相同 ID 只能加入原执行或读取原结果。 + +## 12. StopAll 统一事务 + +### 12.1 Participant 分组 + +建议固定阶段而非依赖注册顺序: + +1. `Ingress`:关闭 gRPC/QUIC/local task 普通准入; +2. `Scheduler`:取消 ActionQueue 和待执行作业; +3. `ControlSession`:撤销 teleop、motor cyclic、velocity 等连续控制 session; +4. `Actuator`:Arm、AGV、Motor、DexHand、PTZ、BioHead 请求安全停止; +5. `PeripheralActivity`:Camera、Microphone、Speaker、recording 和媒体 producer; +6. `Verification`:等待每个 required participant 的 quiescence 证明。 + +组内可以并行,组间顺序固定。每个 participant 有独立 timeout,外层还有总 deadline。 + +### 12.2 算法 + +1. 使用 process-wide operation mutex 创建或加入当前 StopAll round; +2. 状态设为 Stopping,增加 safety epoch,关闭全局准入; +3. 对当前 participant registry 建立不可变快照; +4. 对所有 participant 调用 `beginBarrier()`; +5. 撤销普通 control lease,并等待已进入 dispatch fence 的短提交退出; +6. 分阶段提交 `requestQuiesce()`; +7. 等待 handle,并调用 `verifyQuiescent()`; +8. 任一 required participant 超时、异常或 Unknown:保留其 barrier,记录 blocker,进入 Latched; +9. 全部成功:清理旧 retired holders,释放本轮 barrier,状态回到 Open; +10. 返回结构化 per-participant 结果和新 epoch。 + +多个 StopAll 调用加入同一 round,并各自得到同一最终结果。RPC waiter 取消不能取消已经开始的 +系统停止事务。 + +成功 StopAll 是一个“已经在本轮确认全部静止”的同步屏障,不是持续维护锁。状态回到 Open 后, +其他通过当前访问策略的客户端可以提交新命令,甚至可能在 StopAll 调用方收到响应前完成准入。需要长期禁止 +控制时应设计独立的 maintenance lock,不复用 StopAll 或 Recover 语义。 + +### 12.3 迟到结果 + +- 旧 round 的 worker 完成后只允许更新该 round 的诊断记录; +- worker 不能凭旧 token 重新打开准入; +- participant 的 release 必须验证 operation ID 和 epoch; +- worker 仍运行时 participant 保持 blocker,Recover 不得跳过它。 + +## 13. RecoverSafetyState 事务 + +### 13.1 语义边界 + +`RecoverSafetyState` 的准确含义是: + +> 在独立安全通道中重新确认设备和活动域已经静止,并清除由软件 StopAll、超时、取消、 +> 旧 session 或不确定结果留下的准入锁止。 + +它不执行: + +- 解除物理急停; +- 自动解除保护停; +- torque-on、power-on、brake-release; +- 自动继续旧轨迹、导航、ActionQueue 或 teleop session; +- 把 Unknown 解释为 Safe; +- 调用测试接口 `clearForTesting()`。 + +### 13.2 恢复算法 + +1. Request Context Gateway 先执行恢复暴露策略:认证模式要求 `SafetyAdmin`;认证关闭时默认 + 禁用,只有 `LOCAL_ONLY` 且服务端确认 peer 为 loopback/Unix Domain Socket 才允许继续; + 随后校验 `recovery_id`、scope、reason 和 deadline; +2. RecoveryLedger 对 `recovery_id` 做幂等处理; +3. 与 StopAll 串行化;expected safety epoch 不匹配立即拒绝; +4. 状态转为 Recovering 并增加 epoch,使所有旧 permit/session 失效; +5. 选取 scope 内处于 Blocked/Quarantined 的 device 和 subsystem participant; +6. 确认没有旧 stop worker、dispatch fence 或 active command 仍未退出; +7. 对设备发起 active refresh,等待晚于本次请求的新 snapshot; +8. 控制设备要求 `quiescent=true`,且 condition 不能是 Unsafe/Unknown;任何 System scope + hardware blocker 都保持全局锁止; +9. 调用 endpoint/participant 的非使能 `reconcileAdmissionState()` 和 `recoverAdmission()`; +10. 清理已经验证的 quarantine、retired safety holder 和软件 gate; +11. scope 外 blocker 或失败 participant 继续保留;只有全部 required latch 清除才回到 Open; +12. 返回 previous/new epoch、每个对象的 before/after 状态和 blocker。 + +### 13.3 部分恢复 + +- 请求可以只恢复指定 device,但不能偷偷排除 subsystem blocker; +- 设备级 quarantine 可以单独清除; +- 如果 global gate 仍被其他 participant 持有,系统状态仍为 Latched; +- response 必须区分 `RECOVERED`、`VERIFIED_BUT_STILL_BLOCKED`、`BLOCKER_REMAINS`、 + `EPOCH_MISMATCH` 和 `NOTHING_TO_RECOVER`。 + +## 14. gRPC API 设计 + +### 14.1 扩展公共命令头 + +保持字段 1、2 不变,使用新 tag 增量扩展: + +```protobuf +message CommandHeader { + message Request { + string device_id = 1; + google.protobuf.Timestamp timestamp = 2; // 仅诊断 + string command_id = 3; + string expected_service_instance_id = 4; + optional uint64 expected_device_generation = 5; + uint32 valid_for_ms = 6; + } + + message Feedback { + bool success = 1; + string error_message = 2; + google.protobuf.Timestamp timestamp = 3; + CommandReasonCode reason_code = 4; + string command_id = 5; + string service_instance_id = 6; + uint64 safety_epoch = 7; + uint64 device_generation = 8; + CommandExecutionState execution_state = 9; + } +} +``` + +兼容阶段中旧客户端字段为空: + +- Legacy/Shadow 模式允许,但记录 `missing_command_identity`; +- EnforceSelected 只对已迁移设备要求; +- EnforceAll 下所有普通 mutating unary 命令必须提供; +- Observe 不要求 command ID;安全 Stop 为保持可达性不把 ID/epoch 作为前置条件,但有 ID 时 + 用于合并结果和审计;Recover 必须提供 recovery ID 和 expected safety epoch。 + +`valid_for_ms` 从服务端收到请求的 monotonic time 开始计算,不能信任跨机器 timestamp。 +Safety Stop 忽略已经过期的普通命令有效期,但仍受服务端 stop operation 总 deadline 约束。 + +- `command_id` 建议使用 UUID,服务端至少限制字符集和最大长度; +- `valid_for_ms=0` 在 Legacy/Shadow 下使用有界服务端默认值,不能表示无限; +- EnforceSelected/EnforceAll 可以要求 Actuate 显式提供非零有效期; +- 服务端对所有客户端有效期施加硬上限,retry 不能延长原 ledger 记录的 deadline; +- expected service instance 为空只在兼容模式接受。 + +### 14.2 新增安全 API + +建议新增 `protos/cmvr/api/safety_command.proto`,并在现有 `SystemService` 增加: + +```protobuf +rpc GetSafetyState(GetSafetyStateCommand.Request) + returns (GetSafetyStateCommand.Feedback); + +rpc RecoverSafetyState(RecoverSafetyStateCommand.Request) + returns (RecoverSafetyStateCommand.Feedback); +``` + +建议核心消息: + +```protobuf +message DeviceIdList { + repeated string device_ids = 1; +} + +message SafetyScope { + oneof target { + bool all_devices = 1; // 必须显式为 true + DeviceIdList devices = 2; // 必须非空且无重复 + } +} + +message RecoverSafetyStateCommand { + enum Mode { + MODE_UNSPECIFIED = 0; + VERIFY_ONLY = 1; + CLEAR_SOFTWARE_LATCH = 2; + } + + message Request { + string recovery_id = 1; + SafetyScope scope = 2; + uint64 expected_safety_epoch = 3; + Mode mode = 4; + string reason = 5; + uint32 timeout_ms = 6; + } + + message Feedback { + CommandHeader.Feedback header = 1; + RecoveryResult result = 2; + uint64 previous_safety_epoch = 3; + uint64 current_safety_epoch = 4; + SystemAdmissionState system_state = 5; + repeated RecoveryTargetResult targets = 6; + } +} +``` + +不要增加 `force=true` 或 `ignore_hardware_state=true`。 + +### 14.3 GetSafetyState + +至少返回: + +- global admission state、safety epoch、control service instance ID; +- device lifecycle、health、device admission state; +- SafetyCondition、snapshot fresh、sample age、device generation; +- active control owner 的脱敏标识; +- blocker reason code、首次发生时间、最后更新时间、来源 operation/command ID; +- 当前 StopAll/Recover operation 的阶段和 deadline; +- subsystem participant 状态。 + +该接口只读内存,即使设备失联或 driver worker 卡住也必须及时返回。 + +### 14.4 gRPC status 与业务结果 + +- 没有产生有效业务结果时使用非 OK status:认证失败、权限不足、格式错误、服务关闭; +- command ID 已预留后,执行结果使用 `grpc::Status::OK + CommandOutcome`,便于相同 ID + 重放完整结果; +- Recover 的部分失败也返回 OK 和 per-target result; +- `INTERNAL` 只表示代码异常或不变量破坏; +- 兼容旧服务时继续填充 `success/error_message`,客户端应迁移到 reason code。 + +## 15. 稳定错误模型 + +建议公共 reason code 至少包括: + +| Reason | gRPC 映射 | 是否可用同 ID 重试 | +| --- | --- | --- | +| INVALID_ARGUMENT | INVALID_ARGUMENT | 否,修正后使用新 ID | +| UNAUTHENTICATED | UNAUTHENTICATED | 认证后重新请求 | +| PERMISSION_DENIED | PERMISSION_DENIED | 否 | +| RECOVERY_RPC_DISABLED | FAILED_PRECONDITION | 是;未进入 RecoveryLedger,本机改配置并重启后可重试 | +| DEVICE_NOT_FOUND | NOT_FOUND | 否 | +| UNSUPPORTED_COMMAND | UNIMPLEMENTED | 否 | +| SYSTEM_STOPPING | ABORTED | 原 ID 查询,不重新下发 | +| SAFETY_LATCHED | FAILED_PRECONDITION | 恢复后新 ID | +| SAFETY_STATE_STALE | UNAVAILABLE | 状态刷新后新 ID | +| HARDWARE_UNSAFE | FAILED_PRECONDITION | 处理硬件后新 ID | +| EMERGENCY_STOP_ACTIVE | FAILED_PRECONDITION | 物理处理后新 ID | +| PROTECTIVE_STOP_ACTIVE | FAILED_PRECONDITION | 合法复位后新 ID | +| DEVICE_DISCONNECTED | UNAVAILABLE | 重连并校验 generation 后新 ID | +| CONTROL_BUSY | RESOURCE_EXHAUSTED | 释放控制权后新 ID | +| GENERATION_MISMATCH | ABORTED | 刷新状态后新 ID | +| COMMAND_ID_CONFLICT | ALREADY_EXISTS | 否 | +| LEDGER_EXHAUSTED | RESOURCE_EXHAUSTED | 稍后提交新 ID | +| BACKPRESSURE | RESOURCE_EXHAUSTED | 仅确认未接收后使用新 ID | +| DEADLINE_EXCEEDED_BEFORE_DISPATCH | DEADLINE_EXCEEDED | 新 ID | +| OUTCOME_UNKNOWN | ABORTED | 不得自动重下发 | +| INTERNAL_ERROR | INTERNAL | 不得自动重下发运动 | + +response 可以附带 retry directive,但 `retryable=true` 不能用于 `OUTCOME_UNKNOWN`。 + +## 16. gRPC 请求上下文与安全扩展设计 + +### 16.1 延后认证的边界 + +本轮设备安全改造允许不实现 TLS、静态 Token、JWT 和 mTLS,但不能把“暂不认证”等同于 +“不设计认证边界”。现在必须固定以下三层接口,后续安全加固只能替换实现: + +| 层 | 当前小范围部署 | 后续可选实现 | 业务层是否感知 | +| --- | --- | --- | --- | +| Transport security | Insecure,可受限到 loopback/隔离网 | Server TLS、mTLS、Unix Domain Socket | 否 | +| Authentication | Disabled,服务端生成 `anonymous` | Static Token、JWT/OIDC、TLS client certificate、Unix peer credential | 否 | +| Authorization | Compatibility policy + Recover exposure policy | 基于 role/capability 的 policy | 只接收允许/拒绝结果 | + +这种调整只表示认证交付可以延后,不表示明文匿名网络具备安全性。使用非 loopback 明文监听时, +安全依赖部署网络、主机防火墙和物理访问控制;该风险必须在配置、启动日志、SystemInfo 和指标中 +保持可见。 + +认证信息继续使用 gRPC metadata 或 transport auth context,不进入业务 request Proto。这样不会 +污染设备 API,也避免以后为了增加 Token 给所有命令消息增加字段。 + +### 16.2 `RequestContext` 与扩展接口 + +建议定义与设备层无关的不可变上下文: + +```cpp +enum class AuthenticationMethod { + Disabled, + StaticToken, + Jwt, + TlsClientCertificate, + UnixPeerCredential, +}; + +struct Principal { + std::string id; // 由服务端生成 + AuthenticationMethod method; + bool authenticated; + std::vector roles; // Disabled 模式只能是 Anonymous +}; + +struct RequestContext { + std::string correlation_id; + std::string full_method_name; + std::string peer; + Principal principal; + bool transport_encrypted; + bool local_peer; + std::chrono::steady_clock::time_point received_at; + std::chrono::steady_clock::time_point deadline; +}; +``` + +核心扩展接口: + +```cpp +class GrpcAuthenticationProvider { +public: + virtual ~GrpcAuthenticationProvider() = default; + virtual AuthenticationResult authenticate(const GrpcCallFacts&) = 0; +}; + +class GrpcAuthorizationPolicy { +public: + virtual ~GrpcAuthorizationPolicy() = default; + virtual AuthorizationDecision authorize( + const RequestContext&, const GrpcMethodPolicy&) const = 0; +}; + +class GrpcSecurityGateway { +public: + virtual GrpcCallGuard beginCall( + grpc::ServerContext&, const GrpcMethodPolicy&) = 0; +}; +``` + +当前提供 `DisabledAuthenticationProvider`:它不读取客户端自报身份,始终产生 +`{id="anonymous", authenticated=false, roles=[Anonymous]}`。同时提供可注入的 fake provider, +用于证明未来切换认证实现时不需要修改 handler。 + +每个 gRPC handler 在入口取得 `GrpcCallGuard`,之后只使用其中的 `RequestContext`。call guard +负责上下文生命周期、统一拒绝状态和审计结束事件。可以用 server interceptor 完成全局前置检查, +但不能依赖 thread-local 在 interceptor 和 handler 之间传递身份;同步、异步和 callback RPC 都必须 +具有明确的 per-call 所有权。 + +`SafetyManager` 不依赖 gRPC 类型。Service 只把从 `RequestContext` 派生的稳定 +`CommandActor`/capability 传给准入和 ledger;驱动层完全不可见认证方式。 + +### 16.3 部署 Profile + +建议提供以下验证 Profile。Profile 是一组配置约束,不是散落在 Service 中的条件分支: + +| Profile | 监听与传输 | AuthN | Recover | 适用范围 | +| --- | --- | --- | --- | --- | +| `LOCAL_COMPATIBILITY` | loopback 或 Unix Domain Socket,可明文 | Disabled | 默认 Disabled,可显式 LocalOnly | 单机开发和维护 | +| `TRUSTED_NETWORK_COMPATIBILITY` | 显式受控网卡,可明文 | Disabled | Disabled | 当前隔离的小范围运行 | +| `LIGHTWEIGHT_AUTHENTICATED` | Server TLS | Static Token | SafetyAdmin | 客户端无需证书的轻量方案 | +| `PRODUCTION_AUTHENTICATED` | Server TLS 或 mTLS | JWT/Token/client certificate | SafetyAdmin | 后续正式部署 | + +本轮只要求实现前两个 Compatibility Profile 和后两个 Profile 的配置校验占位;选择尚未编译的 +认证 provider 必须启动失败,不能静默退回 Disabled。 + +约束如下: + +- Disabled 必须是显式模式,不能因为证书或 Token 文件加载失败而自动进入; +- 非 loopback 的 Insecure + Disabled 必须额外配置 `allow_insecure_non_loopback=true`,并产生 + 高可见度持续告警; +- Profile 只能通过本机配置和进程重启改变,不提供远程降级接口; +- QUIC heartbeat 和 GetSystemInfo 发布实际 transport/authentication/recovery exposure,不能 + 根据配置意图伪报; +- 后续 Static Token 客户端通过统一 client interceptor 添加 `authorization: Bearer ...`, + 业务调用点不变化; +- 启用了 TLS 时才校验证书、私钥、CA、有效期和文件权限。 + +### 16.4 授权与 Recover 暴露策略 + +方法权限仍预先分类,作为未来认证启用后的稳定契约: + +| Role | 权限 | +| --- | --- | +| Anonymous | Compatibility Profile 中除 Recover 外的现有兼容行为 | +| Observer | GetSystemInfo、GetDeviceList、GetSafetyState、只读状态和传感流 | +| Operator | Observer + 普通控制 + 设备 Stop + StopAll | +| SafetyAdmin | Operator + RecoverSafetyState + 安全配置诊断 | + +`GrpcMethodPolicyRegistry` 至少保存完整 method 名、read/mutate/stop/recover 分类、 +`CommandIntent` 和最低 role。未知方法在 Authenticated Profile 中 fail-closed;Compatibility +Profile 可以只为已有 RPC 保留当前行为,但仍必须产生 `unclassified_method` 告警并在阶段 2 前清零。 + +`RecoverSafetyState` 和 `RestoreOperationalState` 额外使用独立的 +`RecoveryExposure`: + +| RecoveryExposure | 行为 | +| --- | --- | +| `DISABLED` | 返回稳定的 `RECOVERY_RPC_DISABLED`,不进入 RecoveryLedger | +| `LOCAL_ONLY` | 仅接受服务端从实际 peer 判定的 loopback/Unix Domain Socket 调用 | +| `AUTHORIZED` | 要求 authenticated principal 且具有 SafetyAdmin | + +校验规则: + +- Authentication Disabled + Recovery Authorized 是非法配置; +- `TRUSTED_NETWORK_COMPATIBILITY` 不能配置 LocalOnly 后再信任代理转发的 IP/header;只有 gRPC + 连接的实际 peer 可以用于本机判定; +- LocalOnly 是部署范围限制,不宣称调用者身份已经认证;优先使用 Unix Domain Socket, + 平台支持时再校验 UID/GID; +- TCP loopback 的 LocalOnly 等价于信任主机上的所有进程。多用户主机、共享容器宿主机或存在 + 不可信本地进程时必须保持 Disabled,或改用具有文件权限/peer credential 的 Unix Domain Socket; +- request 中的 role、principal、`force=true` 或类似字段一律不能改变该策略; +- Stop/StopAll 始终走独立安全通道,不受普通 safety gate 或审计 sink 故障阻塞;Authenticated + Profile 仍执行其访问策略,独立物理急停不能依赖网络认证服务。 + +### 16.5 调用链与状态码 + +```text +request limits -> correlation ID -> selected authentication provider + -> immutable RequestContext -> method/recovery authorization policy + -> audit begin -> service handler -> audit outcome +``` + +- Disabled provider 成功结果仍标记 `authenticated=false`,不能伪造为 Observer/Operator; +- 认证信息无效返回 `UNAUTHENTICATED`,身份有效但权限不足返回 `PERMISSION_DENIED`; +- Recover 被部署配置关闭返回业务 reason `RECOVERY_RPC_DISABLED`; +- LocalOnly 收到非本机 peer 返回 `PERMISSION_DENIED`; +- reflection 独立配置。Authenticated Profile 默认关闭或仅向 SafetyAdmin 开放;Compatibility + Profile 保持显式开关,不能依靠 reflection 状态表示访问安全。 + +### 16.6 审计字段与失败策略 + +- effective principal ID、authentication method、authenticated、roles、peer; +- transport encrypted、security profile、recovery exposure; +- gRPC method、device/resource、intent; +- correlation ID、command/recovery/stop operation ID; +- payload hash,不记录 Token、Authorization metadata、原始音视频和敏感大 payload; +- 准入结果、reason code、safety/device/authority generation; +- 硬件提交状态、终态、耗时; +- Recover reason、before/after blocker; +- 审计写入失败的处理策略。 + +阶段 0 可以先把统一审计事件接入现有日志 sink,但事件 schema 必须稳定。阶段 4 开放任何形式的 +Recover 前必须具备持久本地审计;Recover 审计无法写入时 fail-closed。Stop/StopAll 不能因审计 +sink 不可用而被拒绝,实现应保留本地应急日志并继续停止。普通控制是否因审计失败而拒绝由 +Profile 决定。 + +### 16.7 后续启用认证的变更面 + +阶段 0 边界完成后,从 Disabled 升级到 Static Token/JWT/mTLS 只允许修改或新增: + +- `GrpcServerTask` 的 credential/provider builder; +- `GrpcAuthenticationProvider` 实现、secret/identity 配置加载和角色映射; +- 客户端统一 metadata interceptor 或 channel credential; +- 对应 Profile 的集成测试、密钥轮换和部署 Runbook。 + +以下内容不应因认证升级而修改: + +- 设备命令 request/feedback Proto; +- `DeviceManager`、`SafetyManager`、Sensor/Control policy; +- `DeviceSafetyEndpoint`、`SafetyParticipant` 和厂商驱动; +- handler 内的命令准入、StopAll 或 Recover 业务分支。 + +安全 Profile 只能在重启时切换。重启会生成新的 service instance ID,进程内 anonymous ledger +自然失效;不做运行期 `anonymous -> authenticated principal` 账本迁移,也不允许认证加载失败时 +保留旧监听并降级运行。 + +## 17. 配置设计 + +### 17.1 SafetyManagerConfig + +建议在 `DeviceManagerConfig` 中增加: + +```protobuf +message SafetyManagerConfig { + enum EnforcementMode { + ENFORCEMENT_MODE_UNSPECIFIED = 0; + LEGACY = 1; + SHADOW = 2; + ENFORCE_SELECTED = 3; + ENFORCE_ALL = 4; + } + + EnforcementMode mode = 1; + repeated string enforced_device_ids = 2; + uint32 stop_all_timeout_ms = 3; + uint32 recovery_timeout_ms = 4; + uint32 command_ledger_result_capacity = 5; + uint32 command_ledger_total_id_capacity = 6; + uint32 event_history_capacity = 7; + bool fail_startup_on_missing_control_capability = 8; +} +``` + +阶段 1 到阶段 4 允许旧配置缺失并进入 Legacy/Shadow,同时产生高可见度告警。阶段 5 的 +Production 配置若仍为 UNSPECIFIED 或 LEGACY,启动失败。 + +### 17.2 设备级覆盖 + +设备 entry 可增加: + +- 是否纳入当前 enforce rollout; +- 更短的 snapshot freshness; +- 更短的 stop/recovery timeout; +- 是否为启动所必需。 + +配置不能: + +- 把 Control endpoint 改成 Sensor; +- 把 required safe-stop 改成 optional; +- 允许 Unknown 通过; +- 关闭驱动最终硬件检查; +- 远程修改 enforce 为 legacy。 + +策略族和 capability 由编译后的 adapter 注册,配置只能收紧。 + +该启动失败开关只针对结构性缺陷,例如控制设备没有 endpoint 或 safe-stop capability。运行时 +设备断线、急停或动态 Unknown 应进入 Blocked/Latched,并保持管理面在线。 + +### 17.3 GRPCSecurityConfig + +建议在现有 `GRPCServerConfig` 中增加独立安全配置。Transport 和 Authentication 不合并成一个 +布尔值,避免以后只能通过客户端证书获得加密连接: + +```protobuf +message GRPCSecurityConfig { + enum TransportMode { + TRANSPORT_MODE_UNSPECIFIED = 0; + INSECURE = 1; + SERVER_TLS = 2; + MUTUAL_TLS = 3; + } + + enum AuthenticationMode { + AUTHENTICATION_MODE_UNSPECIFIED = 0; + DISABLED = 1; + STATIC_TOKEN = 2; + JWT = 3; + TLS_CLIENT_CERTIFICATE = 4; + } + + enum RecoveryExposure { + RECOVERY_EXPOSURE_UNSPECIFIED = 0; + RECOVERY_DISABLED = 1; + RECOVERY_LOCAL_ONLY = 2; + RECOVERY_AUTHORIZED = 3; + } + + TransportMode transport_mode = 1; + AuthenticationMode authentication_mode = 2; + RecoveryExposure recovery_exposure = 3; + bool allow_insecure_non_loopback = 4; + bool enable_reflection = 5; + + string server_certificate_file = 6; + string server_private_key_file = 7; + string client_ca_file = 8; + string static_token_file = 9; + string jwt_issuer = 10; + string jwt_audience = 11; + string audit_file = 12; +} +``` + +阶段 0 只实现 `INSECURE + DISABLED`,以及 `RECOVERY_DISABLED/RECOVERY_LOCAL_ONLY` 的策略; +其他枚举值先形成稳定配置契约,选择未编译能力时返回明确启动错误。旧配置缺失该 message 时可有 +一个发布周期映射到当前行为,但必须告警;迁移窗口结束后 UNSPECIFIED 一律启动失败。 + +后续 provider 实现后的组合约束: + +| Transport | Authentication | 是否允许 | 说明 | +| --- | --- | --- | --- | +| Insecure/Unix socket | Disabled | 是 | Compatibility;按监听范围和 RecoveryExposure 限制 | +| Insecure TCP | StaticToken/JWT | 否 | 凭据可被监听和重放 | +| Server TLS | Disabled | 是 | 只加密,不识别客户端,仍属于 Compatibility | +| Server TLS | StaticToken/JWT | 是 | 推荐的轻量远程认证 | +| Mutual TLS | TLSClientCertificate | 是 | 后续强身份 Profile | +| Mutual TLS | Disabled | 否 | 要求客户端证书却丢弃身份没有明确语义 | + +首轮不实现多因素组合;如果未来需要 mTLS + Token,必须定义唯一 principal、角色合并和审计规则, +不能简单拼接两个 provider 的结果。 + +配置只保存凭据文件路径,不保存 Token 明文。后续实现静态 Token 时使用权限受限的独立文件, +日志和审计只能记录 token ID,不能记录 secret。所有组合在启动时集中校验,并把实际生效值写入 +capability manifest/SystemInfo。 + +## 18. 当前设备迁移映射 + +| 设备/入口 | 策略 | 关键安全事实 | Stop/恢复要点 | +| --- | --- | --- | --- | +| Aubo Arm | Control | connected、robot mode、exec/queue、power、硬件/软件 EStop、protective stop、fault | 硬件 EStop 释放后在 Normal/Reduced 下自动 poweron/startup,Running 且队列清空、quiescent 后才重新准入;显式 Stop/PowerOff 优先;软件 EStop 独立锁存;无法确认 exec 时 OutcomeUnknown | +| Huayan Arm | Control | lifecycle generation、motion state、fault、stop confirmation | 保留已强化的 fail-closed 生命周期,映射为统一 endpoint | +| MotorRobotArm | Control | group atomicity、joint freshness、bus generation | 不具备原子 group servo 时继续拒绝 teleop capability | +| UME RobotArm | Control | CAN session、watchdog、torque enable、feedback freshness | reconnect 不恢复 torque;本地 haptic loop 不做网络调用 | +| ArmTeleopService | Control(stream) | session ID、sequence、watchdog、lease、safety epoch | OPEN 时准入;每帧校验 epoch;StopAll 后必须新 session | +| SEER AGV | Control | controller session、navigation terminal、velocity、EStop、fault | cancel ACK 不等于停稳;连续零速度采样后才 quiescent | +| MotorManager/Motor | Control | bus session epoch、CiA402 state、enabled、quick-stop、actual velocity | 每个 motor resource 注册;Quick Stop 未确认则 quarantine | +| DexHand control | Control | hand lifecycle、command generation、actuator idle | tactile stream 与控制命令分开分类;stopOperationalActivity 必须可证明 | +| DexHand tactile | Sensor | polling worker、sample freshness | StopAll 可停 stream,但不能把 stream 状态当作手部运动状态 | +| Camera capture | Sensor | opened、streaming、worker generation | 复用 MediaSourceManager;gRPC/QUIC 和直接 startStreaming 在启动设备 producer 前取得 Sensor/StartActivity dispatch guard | +| Camera PTZ | Control | PTZ activity generation、stop ACK | 服务端按已校验 action 派生 START=Actuate、STOP=安全通道,锁止时 STOP 仍可下发 | +| Microphone | Sensor | capture lifecycle、sample freshness | activity participant | +| Speaker | Sensor | playback lifecycle、worker generation | Stop 始终允许;不视为机械执行器 | +| BioHead | Control | expression/speech activity、hardware fault | 表情可能产生机械运动,不能归入纯媒体 | +| Battery | Sensor | sample freshness、communication state | 只读;不参与 actuator StopAll | +| MuJoCo control | Control | simulation generation、active command | 使用与真机相同策略,便于故障注入,但不能代替真机验收 | +| HLC/touch | Control | 服务端解析真实 arm ID、任务 safety session、每次 arm submission 复核 | `touch` 为 Actuate;每次 move/speed/servo 前依次复核 permit、control authority、Coordinator dispatch 和设备最终检查;撤销后走 Stop lane | +| QUIC media | Sensor | Camera/Microphone source ID、snapshot freshness、media generation | 不提供执行器控制;全局 Hub 的设备 producer 启动使用与 gRPC 相同的 Sensor/StartActivity dispatch guard | + +Aubo JSON `get_di/get_do` 可以归类 Observe;`set_do` 必须归类 Configure/Control,并最终迁移 +为 typed RPC。未知 JSON command 在 Control 设备上默认拒绝。 + +## 19. 六阶段实施方案 + +| 阶段 | 核心产物 | 是否改变生产准入 | +| --- | --- | --- | +| 0 | RequestContext、AuthN/AuthZ/Audit 扩展边界 | 否,显式保持现有兼容行为 | +| 1 | 类型、快照、错误、幂等契约 | 否,旧 gate 仍权威 | +| 2 | SafetyManager shadow | 否,只比较决策 | +| 3 | 高风险设备逐个 enforce | 仅改变选中设备 | +| 4 | 泛化 StopAll、正式 Recover | 改变系统安全事务 | +| 5 | EnforceAll、真机签字、移除旧路径 | 全量切换 | + +每个阶段只有满足退出条件后才能进入下一阶段;不能为了尽快提供 Recover 而跳过阶段 0、1、 +2 或高风险设备迁移。 + +### 阶段 0:建立控制面安全扩展边界 + +#### 目标 + +在不增加现有客户端证书或 Token 配置负担的前提下,建立统一请求上下文和可替换的安全网关, +使以后增加认证只替换 provider/policy,不横向修改所有 Service。当前明文匿名暴露被显式记录, +但本阶段不改变已有普通 RPC 的允许/拒绝行为。 + +#### 实施项 + +1. 扩展 `grpc_server_config.proto`,增加 Transport、Authentication、RecoveryExposure 和 + `allow_insecure_non_loopback`;本阶段只实现 Insecure + Disabled。 +2. 定义不可变 `RequestContext`、`Principal`、与 gRPC 无关的 `CommandActor`,以及明确的 + effective principal 规则。 +3. 实现 `DisabledAuthenticationProvider`、`GrpcAuthorizationPolicy`、 + `GrpcSecurityGateway/GrpcCallGuard` 和可注入 fake provider。 +4. 建立完整 method 名驱动的 `GrpcMethodPolicyRegistry`,先固定 read/mutate/stop/recover、 + 最低未来 role;CommandIntent 最迟在阶段 2 补齐。 +5. 所有现有 handler 统一通过 call guard 取得上下文;Service 不直接读取认证 metadata, + 不从 request 读取 principal/role。 +6. Compatibility policy 保持现有 RPC 行为。`RecoverSafetyState` 标记为独立 Recovery policy, + 此阶段只预留,不注册实现。 +7. 增加 correlation ID 和统一审计事件 schema,先接入现有日志 sink;保留 error logging + interceptor,并明确多个 interceptor/call guard 的生命周期顺序。 +8. GrpcServerTask 集中校验配置组合;选择 StaticToken/JWT/mTLS 等未实现 provider 时启动失败, + 不允许静默退回 Disabled。 +9. QUIC heartbeat、GetSystemInfo、启动日志和指标发布实际 transport、authentication 和 + recovery exposure;非 loopback 明文匿名模式持续告警。 +10. 为旧配置提供一个发布周期的兼容映射,并更新部署文档和显式示例配置。 + +#### 测试 + +- Disabled provider 忽略伪造的 principal/role metadata,结果始终是未认证 `anonymous`; +- 现有客户端不增加 metadata 仍可调用已有 RPC,允许/拒绝结果不变; +- IPv4/IPv6 loopback、Unix Domain Socket 和非本机 peer 分类; +- Disabled + Authorized Recovery、未实现 provider、非 loopback insecure 未显式确认等非法组合; +- fake authenticated provider 下 Observer/Operator/SafetyAdmin 的 method policy; +- sync、stream、callback、deadline/cancellation 下 RequestContext 生命周期和清理; +- correlation ID、审计字段脱敏、audit sink 异常和 interceptor 顺序; +- 旧配置迁移及实际 security capability 上报。 + +#### 退出条件 + +- 每个现有 gRPC method 都经过统一 gateway,并有 access class; +- `anonymous` 只能由服务端生成,伪造 metadata 不会获得 role; +- 当前兼容模式行为未改变,但明文/匿名/监听范围在配置和运行状态中可见; +- 非本机匿名 Recover 没有可执行路径; +- fake provider 测试证明启用认证不需要修改业务 handler、Coordinator 或驱动; +- 部署文档、风险说明和显式示例配置已更新。 + +#### 回滚边界 + +可以让 Compatibility policy 继续保持旧行为,但 RequestContext、method registry 和配置字段 +不能删除;否则会重新引入后续横向改造。任何安全 Profile 变化只能通过本机配置和进程重启, +不能提供远程降级 RPC。 + +### 阶段 1:统一类型、快照、错误与幂等契约 + +#### 目标 + +建立后续状态机所需的数据契约,但不改变现有命令准入结果。 + +#### 实施项 + +1. 新建 `manager/safety_manager` target 和 `safety_types.h`。 +2. 定义 CommandIntent、SafetyCondition、TriState、SafetyBlocker、SafetySnapshot。 +3. 定义 DeviceSafetyDescriptor、Endpoint、Participant 接口。 +4. 在 DeviceManager 中建立 `SafetySnapshotStore`,Manager snapshot 只读缓存。 +5. 为现有设备建立 adapter;未支持设备发布 Unknown,不伪造安全。 +6. 扩展 `CommandHeader` 和 Feedback;新增 reason code 和 execution state。 +7. 生成统一 control service instance ID,并通过 GetSystemInfo 暴露。 +8. 实现进程内 CommandLedger,复用 ActionQueue 的容量和 retired-ID 设计原则。 +9. 建立 vendor result 到公共 reason code 的映射层。 +10. 给 AbstractDevice 的宽松默认生命周期能力增加弃用标记;Control 注册要求显式能力。 +11. 更新 Manager/Service/Proto 文档中已经过时的生命周期说明。 + +#### 测试 + +- snapshot 并发发布/读取、stale 计算、generation 单调性; +- endpoint 未实现、设备重连、设备重新注册; +- ledger 同 ID 同 payload、不同 payload、in-flight join、淘汰和容量耗尽; +- deterministic payload hash; +- reason code 映射完整性; +- protobuf 旧 client payload 解析和旧配置解析。 + +#### 退出条件 + +- gRPC 状态查询和 QUIC heartbeat 不再调用设备方法; +- 所有 Control 类型至少有显式 Unknown adapter,不再依赖默认 Healthy; +- 新字段保持 wire compatible; +- ledger 的 OutcomeUnknown 测试证明不会二次 dispatch; +- 此阶段生产行为仍由旧 gate 决定。 + +#### 回滚边界 + +新 Proto 字段不可删除或复用;可以停止使用新字段,但必须保留 wire schema。SnapshotStore +可以退回仅诊断模式,不影响旧 gate。 + +### 阶段 2:SafetyManager 影子运行 + +#### 目标 + +在不改变线上允许/拒绝结果的情况下,对全部命令计算新策略结果并验证分类完整性。 + +#### 实施项 + +1. DeviceManager 构造并持有 SafetyManager。 +2. 在阶段 0 的 GrpcMethodPolicyRegistry 中补齐 CommandIntent,并引入 typed CommandDescriptor。 +3. gRPC service 增加可注入构造函数;GrpcServerTask 统一传入 coordinator/ledger,沿用既有 + GrpcSecurityGateway。 +4. 每个 handler 在旧 gate 前后调用 shadow evaluation,记录旧/新决策差异。 +5. 把 StopAll gate、Motor、Media、Camera registry、ActionQueue 包装成 legacy participant。 +6. 新增只读 `GetSafetyState`,先发布 shadow decision、freshness 和 blocker。 +7. 增加 admission latency、decision mismatch、unknown snapshot、unclassified method 指标。 +8. 启动状态使用 Starting;只做诊断,不因 shadow 结果阻止旧业务。 +9. 将 Runtime/TaskManager 划分为 management-plane 和 operational 启动组;设备动态故障不再 + 使已经通过所选安全 Profile 配置校验的 SystemService 一并退出。 + +#### 影子比较分类 + +| 旧结果 | 新结果 | 处理 | +| --- | --- | --- | +| Allow | Allow | 正常 | +| Deny | Deny | 正常,比较 reason | +| Allow | Deny | 记录 `would_deny`,优先修正快照或旧行为 | +| Deny | Allow | 高风险 `would_allow`,在进入阶段 3 前必须归零或有书面解释 | + +#### 测试 + +- 所有 protobuf service method 都在 method access policy 和 command-intent registry 中; +- shadow evaluation 无硬件 I/O; +- coordinator 销毁时 participant 全部注销且无 callback; +- StopAll 与 shadow admit 并发不改变旧 gate 行为; +- GetSafetyState 在设备 endpoint 阻塞时仍快速返回。 +- 单个设备 create/init/start 失败时,GetSafetyState 仍可按当前安全 Profile 访问。 + +#### 退出条件 + +- 所有 mutating method 均有固定 intent; +- 所有 Control 设备都有 DeviceSafetyDescriptor; +- 没有未解释的 `legacy deny / new allow`; +- Shadow 准入 p99 只包含内存操作,不受硬件 RTT 影响; +- 至少完成一轮真实运行日志评审。 +- 管理面 degraded-start 和正常 shutdown 路径都有生命周期测试。 + +#### 回滚边界 + +可关闭 shadow evaluation,但保留 snapshot 和 method registry。旧 gate 仍是唯一 authority。 + +### 阶段 3:迁移高风险控制设备 + +#### 目标 + +让 Arm、Teleoperation、AGV、Motor、DexHand control 和 Camera PTZ 的普通命令由 +SafetyManager 权威准入,并统一幂等与执行结果语义。 + +#### 迁移顺序 + +1. Aubo/Huayan unary Arm; +2. ArmTeleopService 和 UME session; +3. AGV navigation/velocity; +4. Motor unary 和 cyclic stream; +5. DexHand control; +6. Camera PTZ; +7. ActionQueue step dispatch。 + +#### 单设备迁移步骤 + +1. 完成 endpoint 和新鲜 snapshot; +2. 明确每个 SDK 返回值的 Accepted/Completed/Rejected/Unknown 语义; +3. 实现 safe-stop request 和 quiescence verification; +4. handler 先通过 Coordinator,再保留 legacy gate 作为第二道 deny-only adapter; +5. dispatch 前执行 permit revalidation 和 driver final check; +6. unary mutating 命令接入 CommandLedger; +7. 流式命令绑定 safety epoch、device generation 和 lease generation; +8. 开启该设备 `ENFORCE_SELECTED`; +9. 通过 fake、并发和真机测试后,删除该设备 handler 中重复的旧状态判断。 + +#### 驱动执行契约 + +- Aubo queue full 只有在 SDK 能证明命令未接收时才能返回 Backpressure; +- 未及时观察到 exec ID 但无法证明未接收时返回 OutcomeUnknown,并 quarantine arm; +- Huayan 保留已有的停止确认和生命周期 generation; +- AGV cancel/zero command ACK 后继续等待导航终态和连续零速度样本; +- Motor Quick Stop 未确认时保留 motor resource quarantine; +- Teleop/stream 的 reconnect 总是新 session,旧轨迹不续跑; +- DexHand void 返回接口逐步改为结构化 result,不能只靠日志判断成功。 + +#### 测试 + +- admit 与 StopAll 的线性化竞态; +- snapshot 在 admit 后、dispatch 前过期; +- lease 在 dispatch 前被抢占; +- ACK 丢失、队列满、控制器断线、进程重连; +- 同 command ID 并发请求; +- stream sequence 重复、倒退、watchdog、断线; +- Stop 后旧 session/permit 无法恢复; +- 每个设备的真实停车确认。 + +#### 退出条件 + +- 上述高风险入口不存在绕过 Coordinator 的设备调用; +- 每类命令都有结构化结果,Internal 不再承载所有业务错误; +- 旧 gate 只作为兼容 deny,不再能单独 reopen 新 Coordinator; +- 设备级 OutcomeUnknown 可通过 GetSafetyState 定位并进入恢复流程; +- 新控制设备接入安全层不需要修改 SafetyManager switch。 + +#### 回滚边界 + +按 device ID 从 EnforceSelected 退回 Shadow。已产生的 quarantine 不能因回滚配置自动清除, +必须 StopAll 成功或通过当前 RecoveryExposure 允许的恢复流程处理。 + +### 阶段 4:泛化 StopAll 并开放正式恢复 RPC + +#### 目标 + +删除 SystemService 中的设备类型停止编排,使 StopAll 和 Recover 成为统一、可观察、可重试的 +安全事务。 + +#### 实施项 + +1. 实现 `SafetyOperationOrchestrator` 和 participant 分阶段执行。 +2. 所有 legacy coordinator 注册为 participant,保留其已有 barrier 语义。 +3. 设备通过注册的 safe-stop participant 加入,不再由 SystemService dynamic cast。 +4. `gRPCSystemServiceImpl::StopAll` 缩减为 RequestContext、参数适配和结果映射。 +5. StopAll 请求增加 operation ID、诊断用 service instance 和结构化 per-target response;旧或 + 缺失 instance 不能阻止安全停止。 +6. 实现 RecoveryLedger、active refresh、quiescence check 和软件 latch reconcile。 +7. 在 SystemService 注册 `GetSafetyState` 和 `RecoverSafetyState`。 +8. Recover 统一执行 RecoveryExposure:Disabled 拒绝、LocalOnly 校验实际本机 peer、 + Authorized 要求 authenticated SafetyAdmin;所有允许路径都要求非空 reason 并写持久审计。 +9. `clearForTesting()` 保持测试可见或移入 test support,运行代码无法调用。 +10. 调整 Runtime shutdown:先进入 ShuttingDown/关闭准入,再在 participant 存活时执行 + 有界 quiesce,之后停止 TaskManager 和 DeviceManager。 + +#### 并发规则 + +| 并发场景 | 规则 | +| --- | --- | +| StopAll vs normal command | epoch 线性化;命令要么被拒绝,要么被登记并停止 | +| StopAll vs StopAll | 加入同一 round,返回同一结果 | +| Recover vs normal command | Recovering 全程关闭普通准入 | +| Recover vs StopAll | process operation mutex 串行化,Stop 优先 | +| Recover vs Recover | 相同 recovery ID join;不同 ID 串行 | +| RPC cancellation vs Stop/Recover | 只取消 waiter,不取消已开始的系统安全事务 | +| late worker vs new epoch | 只能写旧 operation 诊断,不能 release 新 barrier | +| shutdown vs Recover | shutdown 终止新 recovery,保持 gate 关闭并执行 quiesce | + +#### 测试 + +- participant 注册顺序随机但执行阶段稳定; +- participant throw、timeout、永不返回、返回 Unknown; +- 部分恢复和 global blocker; +- Recover 时硬件 EStop、protective stop、fault、stale、disconnect、still moving; +- 恢复过程中状态再次变坏; +- expected epoch mismatch 和 recovery ID payload conflict; +- Disabled/LocalOnly/Authorized 三种 RecoveryExposure,尤其是非本机伪造 metadata 无法绕过; +- audit 写失败; +- service 析构、dispatcher join 和 Runtime shutdown。 + +#### 退出条件 + +- SystemService StopAll 不包含具体 DeviceKind 停止分支; +- StopAll/Recover 都返回 per-participant 结构化结果; +- 任何失败路径都保持明确 Latched/Quarantined 状态; +- Recover 无法绕过 Unknown、未结束 worker 或未确认运动; +- 一次成功 Recover 使系统能接受新命令,但不会恢复旧命令或自动使能硬件; +- Recover RPC 默认 Disabled;匿名部署只有 LocalOnly 验收通过才能开放,远程开放必须启用 + authenticated SafetyAdmin;任何开放模式都要求持久审计验收通过。 + +#### 回滚边界 + +保留旧 StopAll adapter 一个发布周期,可通过本地启动配置切换实现。正式 Recover 已产生的 +epoch 和审计不能回滚;禁止退回运行期无检查 clear。 + +### 阶段 5:全量 enforce、真机验证和旧路径移除 + +#### 目标 + +覆盖剩余外围设备和所有命令入口,验证发布产物与真实硬件,并删除重复全局状态。 + +#### 实施项 + +1. 迁移 Camera/Microphone/Speaker/BioHead/HLC 和剩余 local task; +2. 对所有 protobuf method 做 descriptor 驱动的 access-policy/intent 完整性测试; +3. Production 强制 `ENFORCE_ALL`,Control Unknown 拒绝; +4. 删除 service 对 `globalStopAllAdmissionGate()`、global media/motor registry 的业务依赖; +5. 保留必要 registry 的领域功能,但准入 authority 只属于 Coordinator; +6. 建立 build capability manifest,包含已编译的 transport/auth provider、MsQuic、硬件 SDK、 + Safety schema version; +7. GetSystemInfo 和启动日志发布实际 capability,不以源码存在推断二进制能力; +8. 建立安装产物 smoke test,而不只测试 build tree; +9. 建立真实设备台架和故障注入矩阵; +10. 完成运维 Runbook:StopAll、blocker 诊断、硬件处理、dry-run、Recover 和审计查询。 + +#### 真机矩阵 + +至少覆盖: + +- Aubo/Huayan:运动中断网、ACK 丢失、queue full、保护停、急停释放、SDK reconnect; +- AGV:导航取消 ACK 后仍移动、速度反馈丢失、地图切换中 StopAll; +- Motor:Modbus/EtherCAT 断线、bus epoch 改变、Quick Stop 未确认、stream watchdog; +- DexHand/PTZ/BioHead:连续命令中 StopAll、stop ACK 丢失、sensor stream 并发; +- 进程:控制中 SIGTERM、任务启动失败、服务重启后硬件仍活动; +- 网络:RPC 超时后相同 ID 重试、不同 payload 冲突、匿名 namespace、实际 peer 分类;如果构建 + 包含认证 provider,再覆盖 Token/证书轮换和权限变化; +- 多平台 QUIC:重连和多 heartbeat 不能改变本地控制 safety epoch。 + +#### 退出条件 + +- 所有 mutating 入口都经过 Coordinator 或显式安全通道; +- 所有 Control capability 都有 fresh snapshot、final check、safe-stop 和真机签字; +- 进程重启不会自动继续运动或接受旧请求; +- install artifact capability 与配置一致; +- 全量自动测试、TSAN/并发测试和硬件台架通过; +- 运维人员能只依赖结构化状态完成一次故障定位和恢复; +- 删除遗留 runtime clear 和无主 global gate。 + +#### 回滚边界 + +单设备可以通过本地配置从 EnforceSelected 退回 Shadow,但 RequestContext 安全边界、幂等和 +Stop/Recover epoch 不能关闭。RecoveryExposure 或网络暴露范围的任何放宽都要求重启、审计和 +现场审批,不能通过远程 RPC 修改。 + +## 20. 测试体系 + +### 20.1 单元测试 + +- Sensor/Control policy 全状态表; +- safety state transition 和非法 transition; +- snapshot freshness 和 generation; +- permit move/expiry/revalidation; +- ledger 和 recovery ledger; +- reason code 与 gRPC 映射; +- participant barrier/token epoch; +- RequestContext 构造、anonymous effective principal、provider/policy 组合; +- RecoveryExposure 和 actual peer classifier。 + +### 20.2 并发与性质测试 + +建议用可控 scheduler/fake clock 重复验证: + +1. StopAll 和 dispatch 的所有交错最终满足“不丢失活动”; +2. Recover 和 late stop callback 的所有交错都不能提前 reopen; +3. 相同 command ID 任意并发度下 dispatch count 最大为 1; +4. generation 单调增加,旧 permit 永远无法重新合法; +5. participant 异常不会跳过其他 required stop; +6. Coordinator 销毁后不存在访问已释放对象的 callback。 + +### 20.3 Service 集成测试 + +- Disabled/Fake provider、method policy 和伪造 metadata; +- legacy/new protobuf client; +- handler 分类完整性; +- Stop/Status 在 Latched 时可调用,Recover 在 exposure 允许时不受普通 gate 阻塞; +- Recover per-target response; +- gRPC deadline/cancellation 与 operation 生命周期分离。 + +### 20.4 故障注入 + +| 故障点 | 期望结果 | +| --- | --- | +| Admit 后 snapshot 过期 | final check 拒绝,无 SDK dispatch | +| SDK 调用超时且接收状态未知 | OutcomeUnknown + device quarantine | +| Stop worker 超时 | global Latched,worker token 保留 | +| Recovery refresh 超时 | blocker remains,不清 gate | +| 相同 ID 不同 payload | conflict,无第二次 dispatch | +| 进程重启期间硬件仍运动 | Starting/Latched,不自动 Open | +| 审计落盘失败 | Recover fail-closed | +| 一个设备 health worker 卡住 | 其他 Status/Stop/Recover 仍可执行 | + +### 20.5 发布产物验证 + +- 对安装目录启动二进制; +- 校验 capability manifest; +- Insecure + Disabled 的 loopback 和显式 trusted-network grpcurl smoke; +- Recovery Disabled/LocalOnly 的实际 peer smoke; +- reflection 与安全 Profile 的显式配置 smoke; +- 配置要求未编译 AuthN/Transport provider、MsQuic 或 driver capability 时启动失败; +- 构建包含可选 Token/TLS/mTLS provider 时,才执行对应认证矩阵; +- 生成 C++ 和 Java API 兼容测试。 + +## 21. 可观测性与运维 + +### 21.1 指标 + +建议至少提供: + +```text +cmvr_safety_admission_decisions_total{device,intent,decision,reason} +cmvr_safety_snapshot_age_ms{device} +cmvr_safety_device_state{device,state} +cmvr_safety_global_state{state} +cmvr_safety_stop_duration_ms{participant,result} +cmvr_safety_recovery_attempts_total{result} +cmvr_command_dedup_total{status} +cmvr_command_outcome_unknown_total{device,method} +cmvr_control_lease_conflicts_total{resource} +cmvr_grpc_authz_denied_total{method,role} +cmvr_grpc_requests_total{auth_method,authenticated} +cmvr_grpc_insecure_listener{non_loopback} +cmvr_grpc_recovery_access_denied_total{exposure,peer_kind,reason} +``` + +### 21.2 事件历史 + +Coordinator 保存有界内存事件环,并将关键事件写入持久审计: + +- global/device transition; +- snapshot stale/fresh、generation changed; +- quarantine 创建和清除; +- StopAll/Recover phase; +- permit reject、final check reject; +- OutcomeUnknown; +- participant timeout/late completion。 + +错误字符串只用于人读,自动化必须使用 reason code 和结构化 blocker。 + +### 21.3 Runbook 顺序 + +1. 调用 GetSafetyState 获取 epoch 和 blocker; +2. 确认当前 RecoveryExposure;Disabled 模式不能尝试网络绕过,需按本机变更流程处理; +3. 在现场确认物理环境和设备状态; +4. 必要时调用 typed ResetFault,不能直接 Recover 代替硬件处理; +5. 使用符合 LocalOnly/Authorized 策略的调用方执行 RecoverSafetyState `VERIFY_ONLY`; +6. blocker 全部满足后调用 `CLEAR_SOFTWARE_LATCH`; +7. 重新读取 SafetyState,确认新 epoch 和 Open/设备级状态; +8. 使用新的 command ID、service instance 和 device generation 下发后续命令。 + +## 22. 建议 PR 拆分 + +为避免一次性改动所有设备,建议按以下独立可回滚单元提交: + +1. 设计文档和安全不变量; +2. GRPCSecurityConfig、RequestContext、Disabled/Fake provider、method policy 和 call guard; +3. correlation/audit schema、实际 security capability 上报和 Compatibility Profile 测试; +4. Safety types、snapshot store 和 tests; +5. CommandHeader/reason code additive Proto; +6. CommandLedger; +7. SafetyManager shadow 和 GetSafetyState; +8. legacy participant adapters; +9. Arm + ArmTeleop migration; +10. AGV migration; +11. Motor migration; +12. DexHand/PTZ/ActionQueue migration; +13. generic StopAll; +14. RecoverSafetyState; +15. peripheral migration、EnforceAll 和 legacy removal; +16. capability manifest、install smoke 和硬件验证报告; +17. 可选后续:Server TLS + Static Token provider 和客户端 interceptor; +18. 可选后续:JWT/OIDC 或 mTLS provider、正式身份生命周期和密钥轮换。 + +每个迁移 PR 必须包含:命令分类表、snapshot 定义、stop verification、错误映射、竞态测试和 +回滚开关。不得只把 handler 前的一个 `if` 移到 Coordinator 就宣称完成迁移。 + +## 23. 最终验收清单 + +- [x] 所有 gRPC handler 都通过统一 RequestContext/call guard,业务代码不解析认证 metadata +- [x] Disabled 模式始终产生未认证 anonymous principal,实际安全 Profile 和监听风险可观测 +- [x] 所有方法都有 access policy 和 CommandIntent,未知方法不会绕过安全网关 +- [x] Recover 默认 Disabled;匿名模式只允许 LocalOnly,远程模式只允许 authenticated SafetyAdmin +- [x] Recover 所有开放方式都要求持久审计,审计失败时 fail-closed +- [ ] 启用 Authenticated Profile 时,传输/AuthN/AuthZ 按该 Profile 的独立验收矩阵通过 +- [x] 生命周期、健康和安全状态是独立字段 +- [x] Manager snapshot/status 路径只读 Manager 缓存,不执行设备 I/O +- [x] 普通 mutating unary 命令使用 command ID、service instance 和统一 ledger 语义 +- [x] 流式控制绑定 session、sequence、watchdog 和 safety epoch +- [x] 已迁移的 Control 命令经过统一准入和驱动最终检查 +- [x] Stop/Status 在软件锁止状态下可达;Recover 在 exposure 允许时不受普通 gate 阻塞 +- [x] SystemService StopAll 不按 DeviceKind 硬编码设备停止逻辑 +- [x] StopAll 失败留下结构化 blocker 和不可绕过 latch +- [x] Recover 不能忽略 Unknown、EStop、未确认运动或旧 worker +- [x] Recover 不上电、不使能、不恢复旧轨迹或旧 session +- [x] 同一 command ID 最大一次 dispatch,OutcomeUnknown 不自动重发 +- [x] 新设备只需注册 DeviceSafetyDescriptor、Endpoint、Participant 和 method intent +- [x] startup/shutdown 与 safety epoch 有明确顺序 +- [x] 单个设备动态故障不会关闭按当前安全 Profile 启动的 SystemService 管理面 +- [ ] 所有发布 capability 来自实际安装二进制 +- [ ] fake、并发、故障注入、安装产物和真机台架全部完成 + +## 24. 实施前需要确定的工程参数 + +以下参数需要通过设备手册和台架测量确定,但不改变架构: + +- 各设备 snapshot polling 周期和 maximum age; +- StopAll 总 deadline 与每类 participant timeout; +- 连续零速度/静止确认的阈值和样本数; +- Aubo、Huayan、SEER 等 SDK 对“已接受命令”的精确定义; +- ledger 容量和结果保留时间; +- 审计文件保留、轮转和上传策略; +- 当前部署允许监听的网卡/CIDR、主机防火墙规则和 `allow_insecure_non_loopback` 责任人; +- RecoveryExposure 初始选择 Disabled 还是 LocalOnly,以及本机维护入口; +- 旧安全配置兼容窗口长度,以及启用 Static Token/Server TLS 的触发条件; +- 后续认证启用时的 principal 命名、Token/证书轮换和角色绑定; +- 哪些设备是启动时 required control device。 + +这些值必须以显式配置和硬上限进入代码,不能以缺省零值表达“无限”或“允许全部”。 diff --git a/model/ume/README.md b/model/ume/README.md new file mode 100644 index 00000000..794c3fb5 --- /dev/null +++ b/model/ume/README.md @@ -0,0 +1,28 @@ +# UME legacy dynamics models + +These MJCF files are exact copies from Universal-Manipulation-Exoskeleton +commit `e087df5cd3b281418722e155d9975695f163698e`: + +- `v6_bimanual/robot.xml`: fixed-base model used for + `LOCAL_WORLD_ALIGNED` shoulder/wrist rotational Jacobians. + SHA-256: + `c185fe505ab52275d1be9c5b563df5c6505a3da81e0e622cffd66324e3839f3b`. +- `v6_imu/robot.xml`: floating-base model used for the original + `rnea(q, v, 0)` compensation path. + SHA-256: + `db1dad82ebca9413edf268a980c5be5a307c990b86654db840098095d8bd5e14`. + +The source paths are +`ume/robot/ume/v6_bimanual/models/robot.xml` and +`ume/robot/ume/v6_imu/models/robot.xml`, respectively. + +Only the model topology/dynamics parser is used. Pinocchio 3.6 +`mjcf::buildModel` and the model adapter load these files without resolving +their visual STL assets, so no geometry files are duplicated here. + +The adapter enforces the model's structural contract. Integrations that require +byte-for-byte model identity must also compare the SHA-256 values above before +arming motion. + +The repository's root install rule copies `model/` to the deployment tree at +`bin/model/`. diff --git a/protos/cmvr/api/agv_command.proto b/protos/cmvr/api/agv_command.proto index 267c88f3..5edc2004 100644 --- a/protos/cmvr/api/agv_command.proto +++ b/protos/cmvr/api/agv_command.proto @@ -37,6 +37,23 @@ message AgvNavigationStatusCommand { } } + +// 在当前活动地图中重新设置 AGV 定位位姿。 +message AgvRelocalizeCommand { + message Request { + // header.device_id 指定目标 AGV 设备。 + CommandHeader.Request header = 1; + // x/y 单位:米,theta 单位:弧度,逆时针为正。 + cmvr.msgs.AgvPose2d pose = 2; + } + + message Feedback { + // 成功仅表示控制器接受命令,不表示定位已经收敛。 + CommandHeader.Feedback header = 1; + } +} + + // 导航到指定地图位姿命令。 message AgvNavigateToPoseCommand { // 请求体。 diff --git a/protos/cmvr/api/agv_service.proto b/protos/cmvr/api/agv_service.proto index f0bdc5b2..04847156 100644 --- a/protos/cmvr/api/agv_service.proto +++ b/protos/cmvr/api/agv_service.proto @@ -20,6 +20,9 @@ service AgvService { // 清除可恢复故障或告警。 rpc clearFault(CommandHeader.Request) returns (CommandHeader.Feedback); + // 在当前活动地图中重新设置定位位姿。调用前 AGV 必须已经停止。 + rpc relocalize(AgvRelocalizeCommand.Request)returns (AgvRelocalizeCommand.Feedback); + // 导航到指定地图位姿。目标位姿 x/y 单位为米,theta 单位为弧度。 rpc navigateToPose(AgvNavigateToPoseCommand.Request) returns (AgvNavigateToPoseCommand.Feedback); diff --git a/protos/cmvr/api/common.proto b/protos/cmvr/api/common.proto index 5686a18a..64988d45 100644 --- a/protos/cmvr/api/common.proto +++ b/protos/cmvr/api/common.proto @@ -4,6 +4,59 @@ package cmvr.api; import "google/protobuf/timestamp.proto"; +enum CommandReasonCode { + COMMAND_REASON_CODE_UNSPECIFIED = 0; + COMMAND_REASON_CODE_NONE = 1; + COMMAND_REASON_CODE_INVALID_ARGUMENT = 2; + COMMAND_REASON_CODE_UNAUTHENTICATED = 3; + COMMAND_REASON_CODE_PERMISSION_DENIED = 4; + COMMAND_REASON_CODE_RECOVERY_RPC_DISABLED = 5; + COMMAND_REASON_CODE_DEVICE_NOT_FOUND = 6; + COMMAND_REASON_CODE_DEVICE_UNAVAILABLE = 7; + COMMAND_REASON_CODE_UNSUPPORTED_COMMAND = 8; + COMMAND_REASON_CODE_SYSTEM_STARTING = 9; + COMMAND_REASON_CODE_SYSTEM_STOPPING = 10; + COMMAND_REASON_CODE_SAFETY_LATCHED = 11; + COMMAND_REASON_CODE_SAFETY_STATE_MISSING = 12; + COMMAND_REASON_CODE_SAFETY_STATE_STALE = 13; + COMMAND_REASON_CODE_HARDWARE_UNSAFE = 14; + COMMAND_REASON_CODE_EMERGENCY_STOP_ACTIVE = 15; + COMMAND_REASON_CODE_PROTECTIVE_STOP_ACTIVE = 16; + COMMAND_REASON_CODE_DEVICE_DISCONNECTED = 17; + COMMAND_REASON_CODE_DEVICE_FAULT = 18; + COMMAND_REASON_CODE_DEVICE_NOT_READY = 19; + COMMAND_REASON_CODE_DEVICE_STILL_MOVING = 20; + COMMAND_REASON_CODE_CONTROL_BUSY = 21; + COMMAND_REASON_CODE_GENERATION_MISMATCH = 22; + COMMAND_REASON_CODE_COMMAND_ID_REQUIRED = 23; + COMMAND_REASON_CODE_COMMAND_ID_CONFLICT = 24; + COMMAND_REASON_CODE_RESULT_EVICTED = 25; + COMMAND_REASON_CODE_LEDGER_EXHAUSTED = 26; + COMMAND_REASON_CODE_BACKPRESSURE = 27; + COMMAND_REASON_CODE_DEADLINE_EXCEEDED_BEFORE_DISPATCH = 28; + COMMAND_REASON_CODE_OUTCOME_UNKNOWN = 29; + COMMAND_REASON_CODE_PARTICIPANT_TIMEOUT = 30; + COMMAND_REASON_CODE_STOP_UNCONFIRMED = 31; + COMMAND_REASON_CODE_RECOVERY_EPOCH_MISMATCH = 32; + COMMAND_REASON_CODE_RECOVERY_REASON_REQUIRED = 33; + COMMAND_REASON_CODE_RECOVERY_AUDIT_FAILED = 34; + COMMAND_REASON_CODE_INTERNAL_ERROR = 35; +} + +enum CommandExecutionState { + COMMAND_EXECUTION_STATE_UNSPECIFIED = 0; + COMMAND_EXECUTION_STATE_RECEIVED = 1; + COMMAND_EXECUTION_STATE_RESERVED = 2; + COMMAND_EXECUTION_STATE_REJECTED_BEFORE_DISPATCH = 3; + COMMAND_EXECUTION_STATE_ADMITTED = 4; + COMMAND_EXECUTION_STATE_DISPATCHING = 5; + COMMAND_EXECUTION_STATE_ACCEPTED_BY_HARDWARE = 6; + COMMAND_EXECUTION_STATE_COMPLETED = 7; + COMMAND_EXECUTION_STATE_FAILED = 8; + COMMAND_EXECUTION_STATE_CANCELED_BEFORE_DISPATCH = 9; + COMMAND_EXECUTION_STATE_OUTCOME_UNKNOWN = 10; +} + message DeviceLifecycle { enum Lifecycle { STATE_INIT = 0; @@ -20,12 +73,22 @@ message CommandHeader { message Request { string device_id = 1; // 目标设备名称 google.protobuf.Timestamp timestamp = 2; // 请求时间 + string command_id = 3; + string expected_service_instance_id = 4; + optional uint64 expected_device_generation = 5; + uint32 valid_for_ms = 6; } message Feedback { bool success = 1; // 是否成功 string error_message = 2; // 错误信息(成功时为空) google.protobuf.Timestamp timestamp = 3; // 回复时间 + CommandReasonCode reason_code = 4; + string command_id = 5; + string service_instance_id = 6; + uint64 safety_epoch = 7; + uint64 device_generation = 8; + CommandExecutionState execution_state = 9; } } diff --git a/protos/cmvr/api/safety_command.proto b/protos/cmvr/api/safety_command.proto new file mode 100644 index 00000000..4e5b774c --- /dev/null +++ b/protos/cmvr/api/safety_command.proto @@ -0,0 +1,204 @@ +syntax = "proto3"; + +package cmvr.api; + +import "cmvr/api/common.proto"; + +enum SafetyTriState { + SAFETY_TRI_STATE_UNKNOWN = 0; + SAFETY_TRI_STATE_FALSE = 1; + SAFETY_TRI_STATE_TRUE = 2; +} + +enum SafetyCondition { + SAFETY_CONDITION_UNKNOWN = 0; + SAFETY_CONDITION_NOMINAL = 1; + SAFETY_CONDITION_RESTRICTED = 2; + SAFETY_CONDITION_UNSAFE = 3; +} + +enum SystemAdmissionState { + SYSTEM_ADMISSION_STATE_UNSPECIFIED = 0; + SYSTEM_ADMISSION_STATE_STARTING = 1; + SYSTEM_ADMISSION_STATE_OPEN = 2; + SYSTEM_ADMISSION_STATE_STOPPING = 3; + SYSTEM_ADMISSION_STATE_LATCHED = 4; + SYSTEM_ADMISSION_STATE_RECOVERING = 5; + SYSTEM_ADMISSION_STATE_SHUTTING_DOWN = 6; +} + +enum DeviceAdmissionState { + DEVICE_ADMISSION_STATE_UNSPECIFIED = 0; + DEVICE_ADMISSION_STATE_OBSERVING = 1; + DEVICE_ADMISSION_STATE_OPEN = 2; + DEVICE_ADMISSION_STATE_BLOCKED = 3; + DEVICE_ADMISSION_STATE_QUARANTINED = 4; + DEVICE_ADMISSION_STATE_RECOVERING = 5; + DEVICE_ADMISSION_STATE_REMOVED = 6; +} + +enum SafetyBlockerScope { + SAFETY_BLOCKER_SCOPE_UNSPECIFIED = 0; + SAFETY_BLOCKER_SCOPE_DEVICE = 1; + SAFETY_BLOCKER_SCOPE_SYSTEM = 2; +} + +enum SafetyRecoveryRequirement { + SAFETY_RECOVERY_REQUIREMENT_UNSPECIFIED = 0; + SAFETY_RECOVERY_REQUIREMENT_REFRESH_ONLY = 1; + SAFETY_RECOVERY_REQUIREMENT_CLEAR_SOFTWARE_LATCH = 2; + SAFETY_RECOVERY_REQUIREMENT_HARDWARE_RELEASE_REQUIRED = 3; + SAFETY_RECOVERY_REQUIREMENT_MANUAL_INSPECTION_REQUIRED = 4; +} + +enum SafetyOperationResult { + SAFETY_OPERATION_RESULT_UNSPECIFIED = 0; + SAFETY_OPERATION_RESULT_SUCCEEDED = 1; + SAFETY_OPERATION_RESULT_RECOVERED = 2; + SAFETY_OPERATION_RESULT_VERIFIED_BUT_STILL_BLOCKED = 3; + SAFETY_OPERATION_RESULT_BLOCKER_REMAINS = 4; + SAFETY_OPERATION_RESULT_EPOCH_MISMATCH = 5; + SAFETY_OPERATION_RESULT_NOTHING_TO_RECOVER = 6; + SAFETY_OPERATION_RESULT_TIMED_OUT = 7; + SAFETY_OPERATION_RESULT_FAILED = 8; +} + +message DeviceIdList { + repeated string device_ids = 1; +} + +message SafetyScope { + oneof target { + bool all_devices = 1; + DeviceIdList devices = 2; + } +} + +message SafetyBlockerInfo { + CommandReasonCode reason_code = 1; + SafetyBlockerScope scope = 2; + SafetyRecoveryRequirement recovery_requirement = 3; + string source_id = 4; + string operation_id = 5; + uint64 first_observed_at_unix_ms = 6; + uint64 last_observed_at_unix_ms = 7; +} + +message DeviceSafetyStateInfo { + string device_id = 1; + string device_kind = 2; + string policy_family = 3; + string lifecycle_state = 4; + string health_state = 5; + DeviceAdmissionState admission_state = 6; + SafetyCondition condition = 7; + bool has_sample = 8; + bool snapshot_fresh = 9; + uint64 sample_age_ms = 10; + uint64 sample_sequence = 11; + uint64 observed_at_unix_ms = 12; + uint64 device_generation = 13; + SafetyTriState connected = 14; + SafetyTriState operational_ready = 15; + SafetyTriState quiescent = 16; + SafetyTriState motion_active = 17; + SafetyTriState actuator_enabled = 18; + SafetyTriState emergency_stop_active = 19; + SafetyTriState protective_stop_active = 20; + SafetyTriState fault_active = 21; + repeated SafetyBlockerInfo blockers = 22; +} + +message SafetyOperationTargetResult { + string target_id = 1; + SafetyOperationResult result = 2; + CommandReasonCode reason_code = 3; + string detail = 4; + DeviceAdmissionState before_state = 5; + DeviceAdmissionState after_state = 6; +} + +message SafetyParticipantResultInfo { + bool recorded = 1; + bool success = 2; + CommandReasonCode reason_code = 3; + string detail = 4; +} + +message SafetyParticipantStateInfo { + string participant_id = 1; + string phase = 2; + bool required = 3; + bool registered = 4; + bool barrier_active = 5; + bool barrier_retained = 6; + string operation_id = 7; + uint64 safety_epoch = 8; + SafetyParticipantResultInfo last_request = 9; + SafetyParticipantResultInfo last_verify = 10; + SafetyParticipantResultInfo last_release = 11; +} + +message GetSafetyStateCommand { + message Request { + SafetyScope scope = 1; + } + + message Feedback { + CommandHeader.Feedback header = 1; + SystemAdmissionState system_state = 2; + uint64 safety_epoch = 3; + string control_service_instance_id = 4; + string enforcement_mode = 5; + repeated DeviceSafetyStateInfo devices = 6; + string active_operation_id = 7; + string active_operation_phase = 8; + uint64 sampled_at_unix_ms = 9; + repeated SafetyParticipantStateInfo participants = 10; + } +} + +message RecoverSafetyStateCommand { + enum Mode { + MODE_UNSPECIFIED = 0; + VERIFY_ONLY = 1; + CLEAR_SOFTWARE_LATCH = 2; + } + + message Request { + string recovery_id = 1; + SafetyScope scope = 2; + uint64 expected_safety_epoch = 3; + Mode mode = 4; + string reason = 5; + uint32 timeout_ms = 6; + } + + message Feedback { + CommandHeader.Feedback header = 1; + SafetyOperationResult result = 2; + uint64 previous_safety_epoch = 3; + uint64 current_safety_epoch = 4; + SystemAdmissionState system_state = 5; + repeated SafetyOperationTargetResult targets = 6; + string recovery_id = 7; + } +} + +message RestoreOperationalStateCommand { + message Request { + string recovery_id = 1; + string reason = 2; + uint32 timeout_ms = 3; + } + + message Feedback { + CommandHeader.Feedback header = 1; + SafetyOperationResult result = 2; + uint64 previous_safety_epoch = 3; + uint64 current_safety_epoch = 4; + SystemAdmissionState system_state = 5; + repeated SafetyOperationTargetResult targets = 6; + string recovery_id = 7; + } +} diff --git a/protos/cmvr/api/system_command.proto b/protos/cmvr/api/system_command.proto index 52b99221..d99f623e 100644 --- a/protos/cmvr/api/system_command.proto +++ b/protos/cmvr/api/system_command.proto @@ -1,6 +1,9 @@ syntax = "proto3"; +import "cmvr/api/agv_command.proto"; +import "cmvr/api/arm_command.proto"; import "cmvr/api/common.proto"; +import "cmvr/api/safety_command.proto"; package cmvr.api; @@ -21,6 +24,77 @@ message DeviceList { DeviceType device_type = 2; } +// Stable device categories used by GetDeviceList. This intentionally does not +// reuse the legacy DeviceType enum above: its zero value is AGV and it does not +// cover all DeviceManager categories. +enum SystemDeviceType { + SYSTEM_DEVICE_TYPE_UNSPECIFIED = 0; + SYSTEM_DEVICE_TYPE_AGV = 1; + SYSTEM_DEVICE_TYPE_ARM = 2; + SYSTEM_DEVICE_TYPE_BATTERY = 3; + SYSTEM_DEVICE_TYPE_BIO_HEAD = 4; + SYSTEM_DEVICE_TYPE_CAMERA = 5; + SYSTEM_DEVICE_TYPE_CAN_BUS = 6; + SYSTEM_DEVICE_TYPE_DEX_HAND = 7; + SYSTEM_DEVICE_TYPE_GRIPPER = 8; + SYSTEM_DEVICE_TYPE_MICROPHONE = 9; + SYSTEM_DEVICE_TYPE_MOTOR = 10; + SYSTEM_DEVICE_TYPE_MOTOR_SYSTEM = 11; + SYSTEM_DEVICE_TYPE_MUJOCO_VIEWER = 12; + SYSTEM_DEVICE_TYPE_MUJOCO_WORLD = 13; + SYSTEM_DEVICE_TYPE_ROBOT = 14; + SYSTEM_DEVICE_TYPE_SPEAKER = 15; +} + +enum SystemDeviceState { + SYSTEM_DEVICE_STATE_UNSPECIFIED = 0; + SYSTEM_DEVICE_STATE_DISABLED = 1; + SYSTEM_DEVICE_STATE_INITIALIZING = 2; + SYSTEM_DEVICE_STATE_REGISTERED = 3; + SYSTEM_DEVICE_STATE_READY = 4; + SYSTEM_DEVICE_STATE_RUNNING = 5; + SYSTEM_DEVICE_STATE_STOPPED = 6; + SYSTEM_DEVICE_STATE_ERROR = 7; +} + +enum SystemDeviceHealth { + SYSTEM_DEVICE_HEALTH_UNSPECIFIED = 0; + SYSTEM_DEVICE_HEALTH_HEALTHY = 1; + SYSTEM_DEVICE_HEALTH_DEGRADED = 2; + SYSTEM_DEVICE_HEALTH_FAULT = 3; +} + +message SystemDeviceInfo { + string device_id = 1; + SystemDeviceType device_type = 2; + + // Concrete backend name for display and diagnostics only. Consumers must + // use device_type, rather than this free-form string, for decisions. + string type_name = 3; + + // GetDeviceList currently publishes only enabled entries. Keep this field + // explicit so each row remains self-describing and future-compatible. + bool enabled = 4; + SystemDeviceState manager_state = 5; + SystemDeviceHealth health = 6; + bool has_error = 7; + string error_message = 8; + uint64 status_updated_at_unix_ms = 9; +} + +message GetDeviceListCommand { + message Request {} + + message Feedback { + CommandHeader.Feedback header = 1; + string manager_name = 2; + string manager_version = 3; + string manager_description = 4; + repeated SystemDeviceInfo device_list = 5; + uint64 sampled_at_unix_ms = 6; + } +} + message GetSystemInfoCommand { message Request {} @@ -32,6 +106,20 @@ message GetSystemInfoCommand { string os = 5; string kernel_version = 6; string architecture = 7; + + // Changes whenever the in-process ActionQueue idempotency ledger is + // recreated. Clients bind submissions and retries to this value. + string action_service_instance_id = 8; + + // Effective server-side control-plane settings. These fields describe + // what is running, not merely what the configuration requested. + string grpc_transport_security = 9; + string grpc_authentication = 10; + string grpc_recovery_exposure = 11; + bool grpc_insecure_non_loopback = 12; + string control_service_instance_id = 13; + string safety_enforcement_mode = 14; + uint32 safety_schema_version = 15; } } @@ -64,9 +152,111 @@ message UpdateParamsCommand { message StopAllCommand { message Request { CommandHeader.Request header = 1; + string operation_id = 2; + string expected_service_instance_id = 3; + uint32 timeout_ms = 4; } message Feedback { CommandHeader.Feedback header = 1; + string operation_id = 2; + uint64 previous_safety_epoch = 3; + uint64 current_safety_epoch = 4; + SystemAdmissionState system_state = 5; + repeated SafetyOperationTargetResult targets = 6; } -} \ No newline at end of file +} + +// Final outcome of one ActionQueue execution. +enum ActionResultCode { + ACTION_RESULT_CODE_UNSPECIFIED = 0; + ACTION_RESULT_CODE_COMPLETED = 1; + ACTION_RESULT_CODE_FAILED = 2; + ACTION_RESULT_CODE_CANCELED = 3; + ACTION_RESULT_CODE_TIMED_OUT = 4; + ACTION_RESULT_CODE_REJECTED = 5; +} + +// Describes whether this RPC admitted a new action or observed an existing +// idempotency record. Clients must not infer this from an error string. +enum ActionDeduplicationStatus { + ACTION_DEDUPLICATION_STATUS_UNSPECIFIED = 0; + ACTION_DEDUPLICATION_STATUS_ACCEPTED_NEW = 1; + ACTION_DEDUPLICATION_STATUS_JOINED_IN_FLIGHT = 2; + ACTION_DEDUPLICATION_STATUS_CACHED_RESULT = 3; + ACTION_DEDUPLICATION_STATUS_RESULT_EVICTED = 4; + ACTION_DEDUPLICATION_STATUS_LEDGER_EXHAUSTED = 5; + ACTION_DEDUPLICATION_STATUS_ACTION_ID_CONFLICT = 6; + ACTION_DEDUPLICATION_STATUS_SERVICE_INSTANCE_MISMATCH = 7; +} + +// Edge-local delay between two device commands. +message DelayAction { + // Delay duration in milliseconds. The server applies a bounded maximum. + uint32 duration_ms = 1; +} + +// One finite, synchronous command in an ActionQueue request. +message ActionStep { + // Client-provided identifier used for diagnostics. It must be unique within + // one ActionQueue request. + string step_id = 1; + + // Per-step timeout in milliseconds. Zero inherits the remaining action + // timeout or the server default. + uint32 timeout_ms = 2; + + // Tags are grouped by domain so compatible commands can be added without + // renumbering existing alternatives: Arm 10-19, AGV 20-29, built-ins 90+. + oneof command { + MoveJ.Request arm_move_j = 10; + MoveL.Request arm_move_l = 11; + + AgvNavigateToPoseCommand.Request agv_navigate_to_pose = 20; + AgvNavigateToStationCommand.Request agv_navigate_to_station = 21; + AgvFollowPathCommand.Request agv_follow_path = 22; + + DelayAction delay = 90; + } +} + +// Atomically submits a complete command sequence for edge-local serial +// execution. Device motion alternatives must use synchronous execution. +message ActionQueueCommand { + message Request { + // Client-generated globally unique idempotency key. During one Action + // service instance, retrying an identical accepted request with the + // same action_id does not dispatch its steps a second time. Recent + // terminal results can be returned; older accepted IDs are rejected + // fail-closed after their result is evicted. Deduplication is not + // persisted across an edge-service restart; the required instance + // epoch below prevents an old retry from being replayed after restart. + string action_id = 1; + repeated ActionStep steps = 2; + + // Total queue-wait plus execution timeout in milliseconds. Zero uses a + // bounded server default. + uint32 total_timeout_ms = 3; + + // Required instance epoch obtained from GetSystemInfo. A mismatch + // means the process-local deduplication ledger was recreated, so the + // server rejects the request instead of risking a replay. + string expected_service_instance_id = 4; + } + + message Feedback { + CommandHeader.Feedback header = 1; + string action_id = 2; + + // Number of steps which completed successfully before the final result. + uint32 completed_steps = 3; + + // Present only when a particular step caused failure, cancellation, + // timeout, or rejection. Presence distinguishes index zero from no + // failed step. + optional uint32 failed_step_index = 4; + ActionResultCode result = 5; + string service_instance_id = 6; + ActionDeduplicationStatus deduplication_status = 7; + } +} diff --git a/protos/cmvr/api/system_service.proto b/protos/cmvr/api/system_service.proto index 84d1c9bd..60476ad0 100644 --- a/protos/cmvr/api/system_service.proto +++ b/protos/cmvr/api/system_service.proto @@ -2,6 +2,7 @@ syntax = "proto3"; import "cmvr/api/common.proto"; import "cmvr/api/system_command.proto"; +import "cmvr/api/safety_command.proto"; package cmvr.api; @@ -9,9 +10,16 @@ package cmvr.api; service SystemService { rpc GetSystemInfo(GetSystemInfoCommand.Request) returns (GetSystemInfoCommand.Feedback) {} rpc GetSystemStatus(GetSystemStatusCommand.Request) returns (GetSystemStatusCommand.Feedback) {} + rpc GetDeviceList(GetDeviceListCommand.Request) returns (GetDeviceListCommand.Feedback) {} rpc UpdateParams(UpdateParamsCommand.Request) returns (UpdateParamsCommand.Feedback) {} rpc ExecuteJsonCommand(JsonDeviceCommand.Request) returns (JsonDeviceCommand.Feedback) {} rpc StopAll(StopAllCommand.Request) returns (StopAllCommand.Feedback) {} + + rpc ExecuteActionQueue(ActionQueueCommand.Request) returns (ActionQueueCommand.Feedback) {} + + rpc GetSafetyState(GetSafetyStateCommand.Request) returns (GetSafetyStateCommand.Feedback) {} + rpc RecoverSafetyState(RecoverSafetyStateCommand.Request) returns (RecoverSafetyStateCommand.Feedback) {} + rpc RestoreOperationalState(RestoreOperationalStateCommand.Request) returns (RestoreOperationalStateCommand.Feedback) {} } diff --git a/protos/cmvr/config/arm_config/arm_config.proto b/protos/cmvr/config/arm_config/arm_config.proto index 06c0c33b..b717e89d 100644 --- a/protos/cmvr/config/arm_config/arm_config.proto +++ b/protos/cmvr/config/arm_config/arm_config.proto @@ -6,6 +6,7 @@ import "cmvr/config/pinocchio_dls_ik_config.proto"; import "cmvr/config/pinocchio_qp_ik_config.proto"; import "cmvr/config/srs_ik_config.proto"; import "cmvr/config/cartesian_motion_validation_config.proto"; +import "cmvr/config/motor_config/motor_config.proto"; enum ToppraPathType { TOPPRA_PATH_TYPE_UNKNOWN = 0; @@ -24,6 +25,10 @@ message MotorRobotArmBackendConfig { double default_vel = 7; double default_acc = 8; repeated string motor_group_ids = 9; + // Reserved opt-in for a future atomic/timed group position-servo primitive. + // MotorRobotArm's current sequential per-joint servoJ implementation + // deliberately rejects this capability even if this field is true. + bool enable_teleop_group_servo = 10; } enum VendorRobotArmBrand { @@ -43,6 +48,60 @@ message VendorRobotArmBackendConfig { string tool_frame = 8; string username = 9; string password = 10; + // AUBO only. Automatic energization after a physical E-stop is deliberately + // opt-in because releasing brakes changes the hardware energy state. + optional bool auto_power_on_after_hardware_estop_release = 11; +} + +enum DamiaoMotorModel { + DAMIAO_MOTOR_MODEL_UNKNOWN = 0; + DAMIAO_MOTOR_MODEL_DM4310 = 1; + DAMIAO_MOTOR_MODEL_DM4310_48V = 2; + DAMIAO_MOTOR_MODEL_DM4340 = 3; + DAMIAO_MOTOR_MODEL_DM4340_48V = 4; + DAMIAO_MOTOR_MODEL_DM6006 = 5; + DAMIAO_MOTOR_MODEL_DM8006 = 6; + DAMIAO_MOTOR_MODEL_DM8009 = 7; + DAMIAO_MOTOR_MODEL_DM10010L = 8; + DAMIAO_MOTOR_MODEL_DM10010 = 9; + DAMIAO_MOTOR_MODEL_DMH3510 = 10; + DAMIAO_MOTOR_MODEL_DMH6215 = 11; + DAMIAO_MOTOR_MODEL_DMG6220 = 12; +} + +message DamiaoJointConfig { + string joint_name = 1; + uint32 command_id = 2; + uint32 feedback_id = 3; + uint32 reported_motor_id = 4; + DamiaoMotorModel model = 5; + // Only +1 and -1 are accepted. + int32 direction = 6; + // q_joint = direction * q_motor + zero_offset_rad. + double zero_offset_rad = 7; + double joint_lower_rad = 8; + double joint_upper_rad = 9; + double max_velocity_rad_s = 10; + double max_torque_nm = 11; + // Explicit whitelist for the four-bit status nibble in MIT feedback. + // The code intentionally does not guess vendor/firmware meanings. At least + // one reviewed value is required before hardware_enabled may be true. + repeated uint32 healthy_feedback_status = 12; + // Raw byte thresholds, interpreted only as ordered protocol values. Nonzero + // reviewed limits are required before hardware_enabled may be true. + uint32 max_driver_temperature_raw = 13; + uint32 max_motor_temperature_raw = 14; +} + +message UmeRobotArmBackendConfig { + SocketCanConfig can = 1; + repeated DamiaoJointConfig joints = 2; + uint32 control_frequency_hz = 3; + uint32 cycle_deadline_us = 4; + uint32 feedback_watchdog_ms = 5; + uint32 shutdown_timeout_ms = 6; + // This is deliberately false in every checked-in configuration. + bool hardware_enabled = 7; } message SpeedLPlannerConfig { @@ -133,6 +192,7 @@ message RobotArmConfig { oneof backend { MotorRobotArmBackendConfig motor = 10; VendorRobotArmBackendConfig vendor = 11; + UmeRobotArmBackendConfig ume = 12; } ArmKinematicsConfig kinematics = 20; diff --git a/protos/cmvr/msgs/agv.proto b/protos/cmvr/msgs/agv.proto index 54439eeb..39109f43 100644 --- a/protos/cmvr/msgs/agv.proto +++ b/protos/cmvr/msgs/agv.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +// 文件随 AGV API 定义统一放在 cmvr/api 下,但保留 cmvr.msgs package, +// 以兼容既有生成代码、消息完整名称和 Any type URL。 package cmvr.msgs; // AGV 在地图平面坐标系中的二维位姿。 @@ -12,6 +14,29 @@ message AgvPose2d { double theta = 3; } +// 固定距离平移使用的距离参考模式。 +enum AgvTranslationMode { + // 根据底盘里程计算运动距离。 + AGV_TRANSLATION_MODE_ODOMETRY = 0; + // 根据定位结果计算运动距离。 + AGV_TRANSLATION_MODE_LOCALIZATION = 1; +} + + + +// AGV 车体坐标系下的固定距离平移参数。 +message AgvTranslation { + // 平移距离的绝对值,单位:米,必须大于 0。 + double distance = 1; + // 车体 X 方向速度,单位:米/秒;正为向前,负为向后。 + double vx = 2; + // 车体 Y 方向速度,单位:米/秒;正为向左,负为向右。 + double vy = 3; + // 距离参考模式;默认使用里程模式。 + AgvTranslationMode mode = 4; +} + + // AGV 车体坐标系下的平面速度。 message AgvVelocity { // 车体 X 方向线速度,单位:米/秒。 @@ -22,6 +47,9 @@ message AgvVelocity { double wz = 3; } + + + // AGV 电池状态。 message AgvBatteryState { // 电量比例,范围:[0, 1],例如 0.8 表示 80%。 @@ -52,8 +80,17 @@ message AgvMotionOptions { double reach_angle = 6; // 速度比例,范围通常为 [0, 1];1 表示不降速。 double speed_ratio = 7; - // 是否异步执行;true 表示下发任务后立即返回。 + // 是否异步执行;false(默认)表示到达、失败、取消或遇障停止后才返回, + // true 表示任务被控制器接受后立即返回。 bool asynchronous = 8; + // 同步导航的最大等待时间,单位:毫秒;0 表示使用适配器默认值。 + // gRPC deadline 应大于该值或预计行程时间,否则服务端会安全取消导航。 + int32 wait_timeout_ms = 9; + // 同步导航的状态轮询周期,单位:毫秒;0 表示使用适配器默认值。 + int32 poll_interval_ms = 10; + // 连续遇障且底盘停止时的最大等待时间,单位:毫秒; + // 0 或未传表示使用适配器默认值 60000 毫秒。 + int32 blocked_timeout_ms = 11; } // AGV 适配器扩展参数。用于传递厂商或控制器特有的参数。 diff --git a/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc b/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc deleted file mode 100644 index b90060ed..00000000 Binary files a/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc b/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc deleted file mode 100644 index 43ab91f6..00000000 Binary files a/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc b/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc deleted file mode 100644 index e992eb09..00000000 Binary files a/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/web-log b/python/hand_eye_calibration/libs/web-log deleted file mode 100644 index b0db76de..00000000 --- a/python/hand_eye_calibration/libs/web-log +++ /dev/null @@ -1,256 +0,0 @@ -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:26:55 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:26:55 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-08 14:26:55 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-08 14:26:55 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:29:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:30:53 - __main__ - INFO: 旋转矩阵是: - [[ 0.72638143 0.22269568 -0.65021278] - [ 0.420903 0.60375531 0.67699349] - [ 0.54333294 -0.76543201 0.34482337]] -2025-09-08 14:30:53 - __main__ - INFO: 平移向量是: - [[ 0.15849038] - [-0.26275262] - [-0.05082269]] -2025-09-08 14:30:53 - __main__ - INFO: 四元数是: - [-0.44096563 -0.36488029 0.0605942 0.81776526] -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:32:27 - __main__ - INFO: 旋转矩阵是: - [[ 0.05477568 0.03458859 0.99789942] - [-0.99767126 0.04257346 0.0532875 ] - [-0.04064089 -0.99849443 0.03684003]] -2025-09-08 14:32:27 - __main__ - INFO: 平移向量是: - [[-0.14908435] - [-0.19737896] - [-0.05964516]] -2025-09-08 14:32:27 - __main__ - INFO: 四元数是: - [-0.49380213 0.48758531 -0.48463669 0.53249159] -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:37:26 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-08 14:37:26 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-08 14:37:26 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-19.log b/python/hand_eye_calibration/libs/web-log.2025-08-19.log deleted file mode 100644 index 608d0060..00000000 Binary files a/python/hand_eye_calibration/libs/web-log.2025-08-19.log and /dev/null differ diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-20.log b/python/hand_eye_calibration/libs/web-log.2025-08-20.log deleted file mode 100644 index 7d24ec1e..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-20.log +++ /dev/null @@ -1,1104 +0,0 @@ -2025-08-20 09:54:43 - libs.auxiliary - INFO: create folder eye_hand_data/data20250820 -2025-08-20 09:54:43 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 09:54:56 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498036656379405, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:54:56 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819653 0.04587884] - [ 0.23038641 0.08867165 -0.96905079 -0.20770797] - [ 0.01293359 0.99547266 0.09416424 -0.45394911] - [ 0. 0. 0. 1. ]] -2025-08-20 09:54:56 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/1.jpg -2025-08-20 09:54:58 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498036656379405, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.02258255132660854] -2025-08-20 09:54:58 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422768 0.22819649 0.04587884] - [ 0.23038641 0.08867257 -0.96905071 -0.20770797] - [ 0.01293359 0.99547257 0.09416518 -0.45394911] - [ 0. 0. 0. 1. ]] -2025-08-20 09:54:58 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/2.jpg -2025-08-20 09:55:00 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.1525737285291187, -0.03590046621153153, 0.022583500572145598] -2025-08-20 09:55:00 - __main__ - INFO: 获取位姿成功: -[[ 0.97301353 -0.03422653 0.22819557 0.04587884] - [ 0.23038536 0.08867097 -0.96905111 -0.20770755] - [ 0.01293293 0.99547275 0.09416334 -0.45394917] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:00 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/3.jpg -2025-08-20 09:55:01 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.02258255132660854] -2025-08-20 09:55:01 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422768 0.22819649 0.04587884] - [ 0.23038639 0.08867163 -0.9690508 -0.2077075 ] - [ 0.01293381 0.99547266 0.09416426 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:01 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/4.jpg -2025-08-20 09:55:02 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:02 - __main__ - INFO: 获取位姿成功: -[[ 0.97301349 -0.03422745 0.2281956 0.04587884] - [ 0.23038547 0.08867075 -0.9690511 -0.20770755] - [ 0.01293387 0.99547274 0.09416334 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:02 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/5.jpg -2025-08-20 09:55:03 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.152574677774656, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:03 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422744 0.22819652 0.04587883] - [ 0.23038638 0.08867079 -0.96905088 -0.20770752] - [ 0.01293376 0.99547274 0.09416339 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:03 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/6.jpg -2025-08-20 09:55:05 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498038554870479, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:05 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819651 0.04587884] - [ 0.23038637 0.08866976 -0.96905098 -0.20770703] - [ 0.01293403 0.99547283 0.0941624 -0.45394918] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:05 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/7.jpg -2025-08-20 09:55:06 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498038554870479, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:06 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819651 0.04587884] - [ 0.23038637 0.08866976 -0.96905098 -0.20770703] - [ 0.01293403 0.99547283 0.0941624 -0.45394918] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:06 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/8.jpg -2025-08-20 09:55:07 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 09:55:07 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:00:41 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082001 -2025-08-20 10:00:41 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:00:55 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220779272207082, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:55 - __main__ - INFO: 获取位姿成功: -[[ 0.97301246 -0.0342392 0.22819824 0.045879 ] - [ 0.23038913 0.08866486 -0.96905077 -0.20770154] - [ 0.01294636 0.99547286 0.09416036 -0.45394925] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:55 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/1.jpg -2025-08-20 10:00:56 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:56 - __main__ - INFO: 获取位姿成功: -[[ 0.97301267 -0.03423919 0.22819731 0.045879 ] - [ 0.23038821 0.0886649 -0.96905098 -0.20770158] - [ 0.01294643 0.99547286 0.09416038 -0.45394924] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:56 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/2.jpg -2025-08-20 10:00:57 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035891923001698, 0.022575906607849135] -2025-08-20 10:00:57 - __main__ - INFO: 获取位姿成功: -[[ 0.97301271 -0.03423826 0.22819729 0.045879 ] - [ 0.2303881 0.08866512 -0.96905099 -0.20770159] - [ 0.01294548 0.99547287 0.09416038 -0.45394927] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:57 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/3.jpg -2025-08-20 10:00:58 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:58 - __main__ - INFO: 获取位姿成功: -[[ 0.97301266 -0.03424013 0.22819722 0.04587947] - [ 0.23038821 0.0886649 -0.96905098 -0.20770158] - [ 0.01294735 0.99547283 0.09416059 -0.4539492 ] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:58 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/4.jpg -2025-08-20 10:00:59 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 10:01:00 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:30:16 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082002 -2025-08-20 10:30:16 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:30:42 - __main__ - INFO: robot.torqueOff -2025-08-20 10:31:18 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 10:31:37 - __main__ - INFO: 当前关节角: [0.11186573880566779, 1.4627959158161286, 1.9220152770152625, -0.05093366778191822, -0.9092177512512868, -0.030951099981311396, 0.23845807287325255] -2025-08-20 10:31:37 - __main__ - INFO: 获取位姿成功: -[[ 0.52119764 -0.24736929 -0.81679952 0.05920395] - [-0.84974048 -0.06144587 -0.52360818 -0.24590889] - [ 0.07933562 0.96697096 -0.24222514 -0.4500887 ] - [ 0. 0. 0. 1. ]] -2025-08-20 10:31:37 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 10:31:37 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082002/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082002/1.jpg -2025-08-20 10:31:39 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 10:31:39 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:51:55 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082003 -2025-08-20 10:51:55 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:52:04 - __main__ - INFO: robot.torqueOff -2025-08-20 11:25:43 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:25:44 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 11:26:15 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082004 -2025-08-20 11:26:15 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 11:26:26 - __main__ - INFO: robot.torqueOff -2025-08-20 11:31:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:31:17 - __main__ - INFO: 当前关节角: [-2.651948074436878, -1.3060526957549723, 1.6455010013158198, -0.6103430476809071, 0.09948188152920982, -0.05029862251762646, -0.3020356912087826] -2025-08-20 11:31:17 - __main__ - INFO: 获取位姿成功: -[[ 0.27619125 -0.94809435 0.15759281 0.33867107] - [ 0.95266231 0.29174352 0.08555842 -0.27150635] - [-0.12709414 0.12650224 0.98379076 -0.27915331] - [ 0. 0. 0. 1. ]] -2025-08-20 11:31:17 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:31:17 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082004/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082004/1.jpg -2025-08-20 11:31:24 - __main__ - INFO: robot.torqueOff -2025-08-20 11:31:29 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:31:30 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 11:31:35 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082005 -2025-08-20 11:31:35 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 11:31:43 - __main__ - INFO: robot.torqueOff -2025-08-20 11:32:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:32:51 - __main__ - INFO: robot.torqueOff -2025-08-20 11:32:59 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:19 - __main__ - INFO: robot.torqueOff -2025-08-20 11:33:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:35 - __main__ - INFO: 当前关节角: [-2.667841292463839, -1.2816153186489525, 1.6453282386280752, -0.8689422123594551, 0.16725421589299896, -0.05024071853986592, -0.21713232263770874] -2025-08-20 11:33:35 - __main__ - INFO: 获取位姿成功: -[[ 0.27955884 -0.96007438 -0.01019952 0.3549007 ] - [ 0.9578522 0.27814922 0.07177865 -0.2729717 ] - [-0.06607585 -0.02983599 0.99736844 -0.2202249 ] - [ 0. 0. 0. 1. ]] -2025-08-20 11:33:35 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:33:35 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/1.jpg -2025-08-20 11:33:38 - __main__ - INFO: robot.torqueOff -2025-08-20 11:33:47 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:57 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:06 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:12 - __main__ - INFO: 当前关节角: [-2.7427168311814327, -1.0574851579120526, 1.807436594464683, -1.0285189303487294, 0.2539545062657235, 0.158883768747222, -0.10335480332040624] -2025-08-20 11:34:12 - __main__ - INFO: 获取位姿成功: -[[ 0.2777794 -0.95904404 -0.05543589 0.31791437] - [ 0.95532897 0.26971945 0.12082208 -0.37176731] - [-0.10092156 -0.0865214 0.99112506 -0.16171829] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:12 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:12 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/2.jpg -2025-08-20 11:34:15 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:31 - __main__ - INFO: 当前关节角: [-2.7590637885751077, -0.8062084733063696, 2.027065432864854, -0.8694348707931883, 0.24372448711285005, 0.532676727084363, -0.09309156057373573] -2025-08-20 11:34:31 - __main__ - INFO: 获取位姿成功: -[[ 0.22208051 -0.97501407 0.0052729 0.25405466] - [ 0.95908004 0.21941892 0.17894361 -0.48699537] - [-0.17562951 -0.03468276 0.9838452 -0.12064719] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:31 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:31 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/3.jpg -2025-08-20 11:34:33 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:42 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:47 - __main__ - INFO: 当前关节角: [-2.782934466095504, -0.5803915032501177, 2.091387259701438, -0.7553535929040271, 0.23251484656573276, 0.7117737302976969, -0.24883047885668474] -2025-08-20 11:34:47 - __main__ - INFO: 获取位姿成功: -[[ 0.20252563 -0.9771179 -0.06499212 0.2028304 ] - [ 0.9356907 0.17350519 0.30721142 -0.55014374] - [-0.28890531 -0.12303071 0.94941938 -0.06964596] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:47 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/4.jpg -2025-08-20 11:34:49 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:06 - __main__ - INFO: 当前关节角: [-2.7773557500742143, -0.4273569855022468, 1.990266980375266, -1.155712136841272, 1.0984726309566777, 0.3962767881278955, 0.5551766940492475] -2025-08-20 11:35:06 - __main__ - INFO: 获取位姿成功: -[[ 0.13419875 -0.99089275 -0.01105719 0.22012738] - [ 0.98836252 0.13464592 -0.07078143 -0.49871061] - [ 0.07162561 -0.00142973 0.99743056 0.06148901] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:06 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/5.jpg -2025-08-20 11:35:08 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:19 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:26 - __main__ - INFO: 当前关节角: [-2.786382125886098, -0.5418995967224179, 1.779420561683955, -1.4977945987674552, 1.2146916097952933, -0.0548075388186517, 0.696672183048642] -2025-08-20 11:35:26 - __main__ - INFO: 获取位姿成功: -[[ 0.10749988 -0.97909741 0.17266164 0.26378689] - [ 0.95873485 0.05611448 -0.27870891 -0.39850777] - [ 0.26319435 0.1954979 0.9447271 0.04603196] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:26 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/6.jpg -2025-08-20 11:35:27 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:41 - __main__ - INFO: 当前关节角: [-2.799370652569662, -0.5832297474059209, 1.7727995740629756, -1.5223250019361065, 1.1548492726480861, -0.054790452398984654, 0.440121490239065] -2025-08-20 11:35:41 - __main__ - INFO: 获取位姿成功: -[[ 0.10460907 -0.9923942 -0.06488994 0.26711558] - [ 0.96599954 0.11690533 -0.23060363 -0.38824267] - [ 0.23643568 -0.03856042 0.97088169 0.03413653] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:41 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:41 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/7.jpg -2025-08-20 11:35:43 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:06 - __main__ - INFO: 当前关节角: [-2.0370809225263526, -1.2750142651842515, 1.1785291518155336, -1.7961139936986559, 0.1593640869889733, -0.7638426957419364, 1.4928680144301243] -2025-08-20 11:36:06 - __main__ - INFO: 获取位姿成功: -[[ 0.15552225 -0.96586249 0.20717743 0.29572925] - [ 0.94505578 0.08442892 -0.31581852 -0.11055109] - [ 0.28754549 0.24491104 0.9259245 0.15520871] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:06 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/8.jpg -2025-08-20 11:36:07 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:15 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:21 - __main__ - INFO: 当前关节角: [-2.1111780799035587, -1.0638859205684343, 1.2061237195778083, -1.6851538351353414, 0.357820952930604, -0.7654307835254344, 1.088731473255389] -2025-08-20 11:36:21 - __main__ - INFO: 获取位姿成功: -[[ 0.3062964 -0.95183114 0.01414199 0.33093188] - [ 0.91746645 0.29121123 -0.27101906 -0.17392187] - [ 0.25384607 0.09598696 0.96247009 0.12609413] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:21 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:21 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/9.jpg -2025-08-20 11:36:23 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:34 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:39 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:50 - __main__ - INFO: 当前关节角: [-1.9882934989037224, -1.5578770950355378, 0.8138128793037408, -1.1872906881225787, 0.08319567584990664, -1.3335561359456893, 0.6900834697759228] -2025-08-20 11:36:50 - __main__ - INFO: 获取位姿成功: -[[ 0.52786704 -0.81179547 -0.2496888 0.39943565] - [ 0.78974482 0.57731597 -0.20738706 0.00682057] - [ 0.31250521 -0.08771764 0.94585734 0.06484517] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:50 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:50 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/10.jpg -2025-08-20 11:36:53 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:07 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:11 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:27 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:34 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:52 - __main__ - INFO: 当前关节角: [-2.064885273552317, -1.5847483376985743, 0.9748163133352132, -0.9252334219525284, 0.4790747300977749, -1.1735978212505176, -0.09822792817475627] -2025-08-20 11:37:53 - __main__ - INFO: 获取位姿成功: -[[ 0.59352438 -0.71833302 -0.36294143 0.44645306] - [ 0.76345885 0.64522592 -0.02853255 -0.0308873 ] - [ 0.25467509 -0.26015608 0.93137501 0.00571151] - [ 0. 0. 0. 1. ]] -2025-08-20 11:37:53 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:37:53 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/11.jpg -2025-08-20 11:37:54 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:11 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:18 - __main__ - INFO: 当前关节角: [-1.0750974596066258, -1.0530882525844003, 1.202661821104158, -1.1384709901516885, 0.618269247915341, -0.4266668839968057, 1.8304966162964318] -2025-08-20 11:38:18 - __main__ - INFO: 获取位姿成功: -[[ 0.02323262 -0.95066269 0.3093553 0.20661784] - [ 0.93936916 -0.0851352 -0.33217101 -0.24746959] - [ 0.34211961 0.29831603 0.89104529 0.40341777] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:18 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:18 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/12.jpg -2025-08-20 11:38:19 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:33 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:39 - __main__ - INFO: 当前关节角: [-1.1932538485863766, -0.3593985990131943, 1.199421096840642, -1.0661631606118365, 1.5343851664844277, 0.013353036969794129, 1.7179777965612681] -2025-08-20 11:38:39 - __main__ - INFO: 获取位姿成功: -[[-0.26676796 -0.92549148 0.2688873 0.1070502 ] - [ 0.89695267 -0.34048413 -0.28203983 -0.4629952 ] - [ 0.35257732 0.16594 0.92095231 0.31669506] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:39 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:39 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/13.jpg -2025-08-20 11:38:40 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:52 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:56 - __main__ - INFO: 当前关节角: [-0.9979826506671123, -1.6711951795129043, 1.0606907600906974, -1.1554264139346175, -0.17462320899717979, -0.7334753817659156, 2.070575051301442] -2025-08-20 11:38:56 - __main__ - INFO: 获取位姿成功: -[[ 0.17630072 -0.97337824 0.14646792 0.18120904] - [ 0.94639296 0.12670266 -0.29713093 0.00320103] - [ 0.27066291 0.19100061 0.94353609 0.40016574] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:56 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:56 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/14.jpg -2025-08-20 11:38:57 - __main__ - INFO: robot.torqueOff -2025-08-20 11:39:50 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:39:54 - __main__ - INFO: 当前关节角: [-2.5679218087420455, -1.2360353956960413, 2.163585926004528, -1.2738875107317638, 0.24506102482902764, 0.37729567436888484, -0.28499768306412954] -2025-08-20 11:39:54 - __main__ - INFO: 获取位姿成功: -[[ 0.21985256 -0.69956035 -0.67991188 0.31423333] - [ 0.96383251 0.26338894 0.04065907 -0.37379439] - [ 0.1506378 -0.66426018 0.73216574 -0.06570926] - [ 0. 0. 0. 1. ]] -2025-08-20 11:39:54 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:39:54 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/15.jpg -2025-08-20 11:39:56 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:27 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:30 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:42 - __main__ - INFO: 当前关节角: [-2.9687435845013743, 1.616818598168077, 1.8944805117218226, -1.4336379406543198, 2.99140777094417, -1.0294045764348045, 0.3738404206139939] -2025-08-20 11:40:42 - __main__ - INFO: 获取位姿成功: -[[ 0.64204072 -0.76380034 -0.06627791 0.20144855] - [ 0.75751403 0.64531872 -0.09867241 -0.05683629] - [ 0.1181364 0.01314526 0.99291037 0.36172528] - [ 0. 0. 0. 1. ]] -2025-08-20 11:40:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:40:42 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/16.jpg -2025-08-20 11:40:45 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:53 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:57 - __main__ - INFO: 当前关节角: [-3.0478622507696174, 0.8171124567905542, 1.6310088697015561, -0.908173581160523, 2.282334644199403, 0.2767392468917254, 0.400527509642841] -2025-08-20 11:40:57 - __main__ - INFO: 获取位姿成功: -[[ 0.20332387 -0.9654331 -0.16308996 0.17291884] - [ 0.97549797 0.18544594 0.11837869 -0.40903036] - [-0.08404234 -0.18316314 0.97948361 0.35856547] - [ 0. 0. 0. 1. ]] -2025-08-20 11:40:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:40:57 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/17.jpg -2025-08-20 11:40:59 - __main__ - INFO: robot.torqueOff -2025-08-20 11:41:40 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:41:41 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 13:59:58 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082006 -2025-08-20 13:59:58 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 13:59:59 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:00:28 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082007 -2025-08-20 14:00:28 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:01:18 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:01:19 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:01:25 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082008 -2025-08-20 14:01:25 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:01:47 - __main__ - INFO: robot.torqueOff -2025-08-20 14:01:57 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:01:58 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:02:35 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082009 -2025-08-20 14:02:35 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:02:43 - __main__ - INFO: robot.torqueOff -2025-08-20 14:04:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:04:37 - __main__ - INFO: robot.torqueOff -2025-08-20 14:04:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:04:58 - __main__ - INFO: 当前关节角: [-2.860337845678283, -1.397555219299673, 2.0252352874694064, -1.0969272592223474, -0.16422327489317293, 0.6307841010759129, -0.2368320152682723] -2025-08-20 14:04:58 - __main__ - INFO: 获取位姿成功: -[[-0.16395738 -0.98632494 -0.01676548 0.2810995 ] - [ 0.98423078 -0.16470583 0.06451166 -0.29995445] - [-0.06639083 -0.00592393 0.99777611 -0.23273999] - [ 0. 0. 0. 1. ]] -2025-08-20 14:04:58 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:04:58 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:05:00 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:10 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:17 - __main__ - INFO: 当前关节角: [-2.9108500484417474, -1.217145409508588, 2.146251753252313, -1.1118560437836578, -0.01833942377595952, 0.8426756391035247, -0.15500135450065497] -2025-08-20 14:05:17 - __main__ - INFO: 获取位姿成功: -[[-0.19375254 -0.98100008 0.00993916 0.24418529] - [ 0.97878718 -0.19260787 0.06984168 -0.38038904] - [-0.06660033 0.02326033 0.99750857 -0.20525812] - [ 0. 0. 0. 1. ]] -2025-08-20 14:05:17 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:05:17 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:05:19 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:30 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:38 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:44 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:48 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:54 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:00 - __main__ - INFO: 当前关节角: [-2.8767113819469956, -1.1714050640599138, 2.1948816021157915, -1.2464932337778085, -0.33234889818919106, 0.9236481819056417, -0.2588829890941284] -2025-08-20 14:06:00 - __main__ - INFO: 获取位姿成功: -[[-0.24048553 -0.96995889 -0.03669408 0.2430299 ] - [ 0.89330918 -0.2359526 0.38252462 -0.39933358] - [-0.37969122 0.05921248 0.92321637 -0.16032958] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:00 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:00 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:06:02 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:10 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:15 - __main__ - INFO: 当前关节角: [-2.8960247316439762, -1.1171215087777182, 2.457270154978275, -1.0737191550868177, -0.21691684390079657, 1.085321783286277, -0.2536925144974955] -2025-08-20 14:06:15 - __main__ - INFO: 获取位姿成功: -[[-0.13760853 -0.99039869 -0.01320328 0.19258248] - [ 0.97988083 -0.13806846 0.14412032 -0.4556436 ] - [-0.14455954 0.00689455 0.98947208 -0.17809969] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:15 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:15 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:06:17 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:34 - __main__ - INFO: 当前关节角: [-2.895932654826882, -1.136302913345048, 2.3703762185159905, -1.4080842507967197, -0.5981243591278972, 0.9507244616046825, -0.28384814671875236] -2025-08-20 14:06:34 - __main__ - INFO: 获取位姿成功: -[[-0.1055292 -0.99278924 0.05686049 0.2089658 ] - [ 0.78002265 -0.04717608 0.62397041 -0.42963626] - [-0.61678866 0.11019957 0.77937655 -0.11836521] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:34 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:06:35 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:57 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:02 - __main__ - INFO: 当前关节角: [-2.7922010010282636, -1.198485140741103, 2.602807531474462, -1.6992320956954479, 0.9828621185073163, 0.9554080390845264, 1.519222867521001] -2025-08-20 14:07:03 - __main__ - INFO: 获取位姿成功: -[[-0.16681717 -0.9424688 0.28969742 0.15720106] - [ 0.98494471 -0.14577393 0.09291867 -0.418235 ] - [-0.04534262 0.30083637 0.95259725 -0.03442695] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:03 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:03 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:07:03 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:13 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:24 - __main__ - INFO: 当前关节角: [-2.798477412519291, -1.0798303978543966, 2.450834270237022, -1.9171181192895805, 0.7499163144677593, 0.992160927788336, 1.3116390057405583] -2025-08-20 14:07:24 - __main__ - INFO: 获取位姿成功: -[[-0.12546073 -0.97101801 0.20342968 0.15722323] - [ 0.87744671 -0.01291482 0.47950023 -0.38189769] - [-0.4629761 0.23865715 0.85363686 0.02103926] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:24 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:24 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:07:26 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:34 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:39 - __main__ - INFO: 当前关节角: [-2.2133918900884213, -1.1263130533130503, 1.8354573734730966, -2.0067867004566855, 0.4697626313792364, -0.028983313982990273, 2.044217350473954] -2025-08-20 14:07:39 - __main__ - INFO: 获取位姿成功: -[[ 0.05006683 -0.81857593 0.57221216 0.21641723] - [ 0.99722798 0.00939751 -0.07381085 -0.25666936] - [ 0.05504241 0.57432145 0.81677733 0.15489376] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:39 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:39 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:07:40 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:52 - __main__ - INFO: 当前关节角: [-2.285479494663676, -1.323132470703256, 1.1370831931765097, -1.9620145854558102, -0.329922626596471, -0.16446912948727094, 1.8630386517978523] -2025-08-20 14:07:52 - __main__ - INFO: 获取位姿成功: -[[ 0.2541324 -0.79104318 0.55647768 0.2759644 ] - [ 0.87524293 0.43292317 0.21570197 -0.08896943] - [-0.41154166 0.4322363 0.80237475 0.07335788] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:52 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:52 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:07:53 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:06 - __main__ - INFO: 当前关节角: [-2.3440849648760964, -1.6339980438977515, 0.8394557982418241, -1.6024213911075191, -0.6461723204771592, -0.6819873545903555, 1.6445735884261141] -2025-08-20 14:08:06 - __main__ - INFO: 获取位姿成功: -[[ 0.32520519 -0.8561661 0.4015236 0.30455147] - [ 0.91842517 0.3870982 0.0815487 0.0377295 ] - [-0.22524829 0.34224932 0.91221084 0.00634541] - [ 0. 0. 0. 1. ]] -2025-08-20 14:08:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:08:06 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:08:08 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:16 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:21 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:30 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:36 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:43 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:48 - __main__ - INFO: 当前关节角: [-2.497259021717915, -1.6540622468145454, 0.8332420369562429, -1.6059222086481888, -0.741180407790215, -0.5510446282264343, 1.4580886071978583] -2025-08-20 14:08:48 - __main__ - INFO: 获取位姿成功: -[[ 0.27527833 -0.89018499 0.3630324 0.29155814] - [ 0.8740154 0.38901255 0.29114655 0.04205002] - [-0.40039844 0.23714957 0.88512212 -0.04047238] - [ 0. 0. 0. 1. ]] -2025-08-20 14:08:48 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:08:48 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:08:50 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:15 - __main__ - INFO: 当前关节角: [-2.67787197005393, -1.695893599141615, 0.9758396000241617, -1.0902246364851813, 0.3696713342152354, -1.0488109521944171, -0.12474225451585882] -2025-08-20 14:09:15 - __main__ - INFO: 获取位姿成功: -[[ 0.45678441 -0.88918966 0.02626305 0.33237336] - [ 0.88584264 0.45196591 -0.10492676 0.02391353] - [ 0.08142979 0.07119384 0.9941331 -0.18395896] - [ 0. 0. 0. 1. ]] -2025-08-20 14:09:15 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:09:15 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:09:15 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:34 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:41 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:47 - __main__ - INFO: 当前关节角: [-2.7174061481813196, -1.645996507486164, 0.9696543161046921, -0.7109640238545865, -0.07768720399835938, -1.030985070254006, -0.14346802122540092] -2025-08-20 14:09:47 - __main__ - INFO: 获取位姿成功: -[[ 0.388996 -0.91389276 0.11611258 0.31099434] - [ 0.77084337 0.39191325 0.50219966 -0.02327599] - [-0.5044627 -0.10584904 0.85692086 -0.31035607] - [ 0. 0. 0. 1. ]] -2025-08-20 14:09:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:09:47 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:09:48 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:03 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:07 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:23 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:28 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:40 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:54 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:01 - __main__ - INFO: 当前关节角: [-2.59334165497892, -1.7232641449571438, 0.8401060314347089, -1.2428718620539325, -0.3679408596011788, -1.0488982827838265, 0.777891529690394] -2025-08-20 14:11:01 - __main__ - INFO: 获取位姿成功: -[[ 0.38350728 -0.90548657 0.18170369 0.31897592] - [ 0.91383861 0.40050188 0.06706149 0.06206318] - [-0.13349594 0.14032928 0.98106398 -0.12864962] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:01 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:01 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:11:02 - __main__ - INFO: robot.torqueOff -2025-08-20 14:11:15 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:20 - __main__ - INFO: 当前关节角: [-2.524884914582912, -1.8413208631555036, 0.8301389532956004, -1.9373436939476743, -1.181938841784646, -0.40802465089452467, 1.9857229419893694] -2025-08-20 14:11:20 - __main__ - INFO: 获取位姿成功: -[[ 0.46733478 -0.77023683 0.43397401 0.21932794] - [ 0.86020935 0.50946101 -0.02212141 0.04891959] - [-0.20405411 0.3836466 0.90065376 0.04292094] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:20 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:20 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:11:21 - __main__ - INFO: robot.torqueOff -2025-08-20 14:11:40 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:44 - __main__ - INFO: 当前关节角: [-2.5734616056963158, -1.111399456680333, 2.3367102762986933, -1.7749239855749113, 0.9300223656869857, 0.7028081062001845, 1.7020646443780287] -2025-08-20 14:11:44 - __main__ - INFO: 获取位姿成功: -[[-0.21538374 -0.90042002 0.37795983 0.19757147] - [ 0.9724784 -0.1625549 0.16691814 -0.3817943 ] - [-0.08885721 0.40350922 0.9106507 0.04632134] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:44 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:44 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:11:45 - __main__ - INFO: robot.torqueOff -2025-08-20 14:12:51 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:12:57 - __main__ - INFO: 当前关节角: [-2.562403844435128, -1.1884221888027517, 2.1572573060089626, -1.0425307437212419, -0.6156199036214122, 0.9407915563049082, -0.19512121712440908] -2025-08-20 14:12:57 - __main__ - INFO: 获取位姿成功: -[[-0.26075281 -0.96339061 0.06234184 0.30846709] - [ 0.86038398 -0.20261143 0.4676409 -0.39571944] - [-0.43788968 0.1755766 0.88171735 -0.12749709] - [ 0. 0. 0. 1. ]] -2025-08-20 14:12:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:12:57 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:12:58 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:14 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:20 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:31 - __main__ - INFO: 当前关节角: [-2.5375022862614864, -1.3847527447413726, 2.1184644886460156, -1.615819991863092, -0.2114444433796575, 0.9092699597558249, 0.7430675079178862] -2025-08-20 14:13:31 - __main__ - INFO: 获取位姿成功: -[[-0.10398076 -0.96201607 0.25241449 0.29135046] - [ 0.87394009 0.03277464 0.48492735 -0.31623915] - [-0.4747807 0.27101825 0.83733649 -0.02503839] - [ 0. 0. 0. 1. ]] -2025-08-20 14:13:31 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:13:31 - __main__ - INFO: ===采集第18次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:13:32 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:49 - __main__ - INFO: 当前关节角: [-2.472082182338527, -1.7953982625637142, 1.247466210453293, -1.7028449242094903, -0.6526480735309685, -0.47461327607360254, 1.5201929964598744] -2025-08-20 14:13:49 - __main__ - INFO: 获取位姿成功: -[[ 0.38556585 -0.80444241 0.45189753 0.31566391] - [ 0.92142331 0.36125553 -0.14308573 -0.01852427] - [-0.04814625 0.47155789 0.88051979 0.03345264] - [ 0. 0. 0. 1. ]] -2025-08-20 14:13:49 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:13:49 - __main__ - INFO: ===采集第19次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:13:51 - __main__ - INFO: robot.torqueOff -2025-08-20 14:14:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:14:06 - __main__ - INFO: 当前关节角: [-2.6700397451276654, -1.7032094344957205, 1.2031801091673915, -1.7198525564969576, -0.7150951404318626, -0.1940077521094401, 1.2712049428440382] -2025-08-20 14:14:06 - __main__ - INFO: 获取位姿成功: -[[ 0.22670363 -0.85123977 0.4732825 0.30212498] - [ 0.86749479 0.39739454 0.29921626 -0.02912893] - [-0.44278467 0.34273669 0.82853684 -0.04460204] - [ 0. 0. 0. 1. ]] -2025-08-20 14:14:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:14:06 - __main__ - INFO: ===采集第20次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:14:08 - __main__ - INFO: robot.torqueOff -2025-08-20 14:14:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:14:54 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:04 - __main__ - INFO: 当前关节角: [-2.7266717338685424, -1.4964087002833506, 2.1396905681001686, -1.2463555931749353, 0.2724942208500023, 0.5135987902805724, 0.49249611274623717] -2025-08-20 14:16:04 - __main__ - INFO: 获取位姿成功: -[[-0.01268576 -0.97706624 0.21255736 0.31018606] - [ 0.94294893 -0.08241786 -0.32257497 -0.29397731] - [ 0.33269564 0.19633863 0.9223691 -0.15981144] - [ 0. 0. 0. 1. ]] -2025-08-20 14:16:04 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:16:04 - __main__ - INFO: ===采集第21次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:16:05 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:16 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:22 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:35 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:40 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:51 - __main__ - INFO: 当前关节角: [-2.6900802169060327, -1.6929186636284754, 1.3311004377413205, -1.136432959983625, -0.567748501942043, -0.5687110369166197, 0.3733525084079461] -2025-08-20 14:16:51 - __main__ - INFO: 获取位姿成功: -[[ 0.34430947 -0.92138619 0.18027335 0.35856051] - [ 0.83282029 0.38838393 0.39442146 -0.04957 ] - [-0.43342976 0.01433226 0.90107338 -0.1862423 ] - [ 0. 0. 0. 1. ]] -2025-08-20 14:16:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:16:51 - __main__ - INFO: ===采集第22次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/22.jpg -2025-08-20 14:16:52 - __main__ - INFO: robot.torqueOff -2025-08-20 14:17:12 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:17:13 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:19:02 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:19:02 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:19:08 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:23:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:27:28 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:27:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:27:42 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:27:42 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:27:49 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:28:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:28:57 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:28:57 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:28:57 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:31:18 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:31:18 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:31:18 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:57:14 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:57:14 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:57:14 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 15:51:11 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 15:51:11 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 15:51:11 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 16:38:35 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 16:38:35 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 16:38:35 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 16:56:06 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 16:56:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 16:56:06 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_21.jpg -2025-08-20 16:56:06 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 16:56:06 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 16:56:06 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:01:33 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:01:33 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:01:33 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:02:57 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:02:57 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:02:58 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:02:58 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:02:58 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:12 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:14 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:14 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:14 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:24 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:24 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:24 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:37 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:37 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:37 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:29:39 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082010 -2025-08-20 17:29:39 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 17:30:05 - __main__ - INFO: robot.torqueOff -2025-08-20 17:30:58 - __main__ - INFO: 当前关节角: [-0.2127401635377416, 1.5663756903288177, 0.12808739578845102, -0.2158128713411982, -0.1482474725044877, 0.08527642206713766, 0.3227548735461464] -2025-08-20 17:30:58 - __main__ - INFO: 获取位姿成功: -[[ 0.98643686 0.16322471 0.01732075 -0.08115292] - [ 0.03501732 -0.10617399 -0.99373078 -0.22501375] - [-0.1603624 0.9808592 -0.11044963 -0.44324419] - [ 0. 0. 0. 1. ]] -2025-08-20 17:30:58 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 17:30:58 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082010/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082010/1.jpg -2025-08-20 17:31:06 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 17:31:06 - __main__ - INFO: 相机已关闭,窗口已销毁 diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-22.log b/python/hand_eye_calibration/libs/web-log.2025-08-22.log deleted file mode 100644 index b0dd5a49..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-22.log +++ /dev/null @@ -1,704 +0,0 @@ -2025-08-21 09:52:37 - __main__ - INFO: 读 eye_hand_data/data2025082010/1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-21 09:54:47 - __main__ - INFO: 旋转矩阵是: - [[-0.8747942 0.22946188 0.42671109] - [-0.45426317 -0.08221912 -0.88706538] - [-0.16846387 -0.96983878 0.17616089]] -2025-08-21 09:54:47 - __main__ - INFO: 平移向量是: - [[-0.12651951] - [-0.21061809] - [ 0.0697177 ]] -2025-08-21 09:54:47 - __main__ - INFO: 四元数是: - [ 0.08840819 -0.63569139 0.73026951 -0.234066 ] -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-21 09:55:22 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-21 09:55:22 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-21 09:55:22 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-21 11:27:09 - libs.auxiliary - INFO: create folder eye_hand_data/data20250821 -2025-08-21 11:27:09 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 11:27:20 - __main__ - INFO: robot.torqueOff -2025-08-21 11:28:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:28:51 - __main__ - INFO: 当前关节角: [0.8253898778736996, 0.2562934472690343, -0.0472638845356522, 0.982365663091435, -0.811866925952772, 1.0474525818308873, 0.016616543126199347] -2025-08-21 11:28:51 - __main__ - INFO: 获取位姿成功: -[[-0.25318109 -0.89031678 0.37846449 0.20513955] - [ 0.6294954 -0.44867523 -0.63437061 -0.47519781] - [ 0.73459844 0.07763101 0.6740464 -0.14564497] - [ 0. 0. 0. 1. ]] -2025-08-21 11:28:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:28:51 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/1.jpg -2025-08-21 11:28:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:04 - __main__ - INFO: 当前关节角: [0.8917611258247912, 0.3193556252779419, 0.0663351766206834, 0.6812782681741733, -1.1216997200029486, 1.03807878215244, 0.016623187844958753] -2025-08-21 11:29:04 - __main__ - INFO: 获取位姿成功: -[[-0.25224294 -0.90609294 0.33966025 0.22289984] - [ 0.8456558 -0.37703157 -0.37777436 -0.51750052] - [ 0.47036131 0.19194474 0.8613463 -0.11653364] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:04 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:04 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/2.jpg -2025-08-21 11:29:05 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:14 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:18 - __main__ - INFO: 当前关节角: [1.1896438678089452, 0.30651423165262204, 0.10917083072596027, 0.6814301474601026, -1.6521096487448172, 1.0335860030255448, 0.016608949161902885] -2025-08-21 11:29:18 - __main__ - INFO: 获取位姿成功: -[[-0.42170444 -0.84445498 0.33024408 0.2558707 ] - [ 0.9003429 -0.43313682 0.04213264 -0.51967065] - [ 0.10746175 0.31510043 0.94295477 -0.04397596] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:18 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:18 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/3.jpg -2025-08-21 11:29:19 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:34 - __main__ - INFO: 当前关节角: [1.4559585002127002, 0.30681324399679527, 0.17970546960258804, 0.6812127702321163, -2.1080019043365628, 1.0236910675472528, 0.016632680300329335] -2025-08-21 11:29:34 - __main__ - INFO: 获取位姿成功: -[[-0.44997072 -0.85803562 0.24759084 0.26886029] - [ 0.85847564 -0.33920789 0.38465255 -0.52136803] - [-0.24606082 0.38563309 0.8892363 0.03026231] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:34 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/4.jpg -2025-08-21 11:29:36 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:51 - __main__ - INFO: 当前关节角: [1.6850703015280803, 0.3357206183368209, 0.14558294028196603, 0.7301084078459711, -2.380654649191254, 1.0414419590902364, 0.016624137090495813] -2025-08-21 11:29:51 - __main__ - INFO: 获取位姿成功: -[[-0.48372144 -0.85725737 0.17641818 0.27941969] - [ 0.74091476 -0.29378779 0.60393216 -0.50585554] - [-0.46589579 0.42284577 0.77726609 0.08600871] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:51 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/5.jpg -2025-08-21 11:29:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:03 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:07 - __main__ - INFO: 当前关节角: [1.9511694551949232, 0.7207327096764498, -0.06620038375442117, 0.8133790740933053, -1.3808665335126573, 0.21355366696300027, 1.1411364716197472] -2025-08-21 11:30:07 - __main__ - INFO: 获取位姿成功: -[[-0.21216612 -0.68156647 0.70032327 0.38204138] - [ 0.97416126 -0.20429083 0.09630729 -0.3389997 ] - [ 0.07742981 0.70266095 0.70729924 0.18673545] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:07 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:07 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/6.jpg -2025-08-21 11:30:08 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:21 - __main__ - INFO: 当前关节角: [1.8940381633015537, 0.4051379952163314, -0.12349589512570175, 0.6297399309851491, -1.2283436591092607, 0.9395015316200465, 1.0908577832583988] -2025-08-21 11:30:21 - __main__ - INFO: 获取位姿成功: -[[-0.4310179 -0.70629928 0.5615736 0.28826997] - [ 0.89989504 -0.38227375 0.20989447 -0.50135244] - [ 0.06642653 0.59582557 0.80036205 0.12584165] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:21 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:21 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/7.jpg -2025-08-21 11:30:22 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:35 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:42 - __main__ - INFO: 当前关节角: [1.8361265915767224, 1.1135570917860655, -0.08976350572081057, 0.5308864500014717, -1.5194516356954322, 0.07328175546087345, 0.9682465849732351] -2025-08-21 11:30:42 - __main__ - INFO: 获取位姿成功: -[[-0.13468827 -0.72882711 0.67131968 0.45481058] - [ 0.98906271 -0.05778144 0.13570654 -0.23383011] - [-0.06011679 0.68225534 0.7286382 0.15317249] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:42 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/8.jpg -2025-08-21 11:30:43 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:04 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:08 - __main__ - INFO: 当前关节角: [1.773997521930743, 0.605477215057948, 0.028329283807957347, 1.2173817716473154, -1.7268484961050745, 0.15453242720534835, 0.8873870023900281] -2025-08-21 11:31:08 - __main__ - INFO: 获取位姿成功: -[[-0.35110132 -0.76965787 0.53324913 0.36358769] - [ 0.90927708 -0.14433419 0.39036245 -0.28723159] - [-0.22347945 0.62192798 0.75050818 0.11913745] - [ 0. 0. 0. 1. ]] -2025-08-21 11:31:08 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:31:08 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/9.jpg -2025-08-21 11:31:09 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:30 - __main__ - INFO: 当前关节角: [1.4005130683931457, 1.4388303137420266, 0.15982067409229817, 0.8202088957324373, -1.891621384164204, -1.0446542059876405, 0.5873542192644378] -2025-08-21 11:31:30 - __main__ - INFO: 获取位姿成功: -[[ 0.36091887 -0.80430791 0.47204487 0.44921615] - [ 0.93025175 0.34636313 -0.12109612 -0.02012862] - [-0.06610037 0.48282644 0.87321782 -0.00595984] - [ 0. 0. 0. 1. ]] -2025-08-21 11:31:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:31:30 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/10.jpg -2025-08-21 11:31:32 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:51 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:56 - __main__ - INFO: robot.torqueOff -2025-08-21 11:32:05 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:32:09 - __main__ - INFO: 当前关节角: [1.4349839708258678, 0.8371567255510698, -0.01699624134102253, 1.6177536050220789, -2.016514568720455, -0.8374870629979659, 0.5931132919377683] -2025-08-21 11:32:09 - __main__ - INFO: 获取位姿成功: -[[-0.0401021 -0.92276134 0.3832797 0.33858263] - [ 0.95373667 0.07903515 0.29006864 -0.11724388] - [-0.2979567 0.37718027 0.87690185 -0.01763812] - [ 0. 0. 0. 1. ]] -2025-08-21 11:32:09 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:32:09 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/11.jpg -2025-08-21 11:32:12 - __main__ - INFO: robot.torqueOff -2025-08-21 11:32:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:32:52 - __main__ - INFO: 当前关节角: [0.7093417632317545, 0.9039997485340793, 0.3698402999208317, 1.4349972602633867, -1.868800572207794, -0.677916040481914, -0.3356152520822075] -2025-08-21 11:32:52 - __main__ - INFO: 获取位姿成功: -[[ 6.72744280e-03 -9.95813278e-01 9.11628002e-02 3.05739589e-01] - [ 9.97824272e-01 7.05770400e-04 -6.59259053e-02 -1.35775630e-01] - [ 6.55855519e-02 9.14079675e-02 9.93651407e-01 -1.75063848e-01] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]] -2025-08-21 11:32:52 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:32:52 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/12.jpg -2025-08-21 11:32:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:34:07 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:34:12 - __main__ - INFO: 当前关节角: [0.5287221701769795, 0.9609924505790383, 0.5908911081355157, 1.1136415746388637, -2.4692230547809086, -0.6455401229494787, -0.3356162013277445] -2025-08-21 11:34:12 - __main__ - INFO: 获取位姿成功: -[[ 0.12520332 -0.99186645 -0.02291465 0.31366201] - [ 0.90598349 0.10488766 0.41011278 -0.19783819] - [-0.40437364 -0.07210778 0.91174691 -0.25384818] - [ 0. 0. 0. 1. ]] -2025-08-21 11:34:12 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:34:12 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/13.jpg -2025-08-21 11:34:13 - __main__ - INFO: robot.torqueOff -2025-08-21 11:34:31 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:34:37 - __main__ - INFO: 当前关节角: [0.39919666739988574, 1.3179505393164566, 0.9448201543641821, 1.2761780402126846, -2.03749479358051, -0.385342428786525, -0.3356180998188186] -2025-08-21 11:34:37 - __main__ - INFO: 获取位姿成功: -[[ 0.03301101 -0.99908595 0.02715761 0.313764 ] - [ 0.83829597 0.01288215 -0.54506323 -0.0913168 ] - [ 0.54421516 0.0407592 0.83795498 -0.18631875] - [ 0. 0. 0. 1. ]] -2025-08-21 11:34:37 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:34:37 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/14.jpg -2025-08-21 11:34:39 - __main__ - INFO: robot.torqueOff -2025-08-21 11:35:06 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 11:35:07 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/1.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_1.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/2.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_2.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/3.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_3.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/4.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_4.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/5.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_5.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/6.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_6.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/7.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_7.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/8.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_8.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/9.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_9.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/10.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_10.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/11.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_11.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/12.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_12.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/13.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_13.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/14.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_14.jpg -2025-08-21 11:35:46 - __main__ - INFO: 旋转矩阵是: - [[-0.99732744 0.02734315 0.0677519 ] - [-0.06713675 0.0228221 -0.99748274] - [-0.02882056 -0.99936555 -0.02092538]] -2025-08-21 11:35:46 - __main__ - INFO: 平移向量是: - [[-0.00078482] - [-0.17419722] - [ 0.06796275]] -2025-08-21 11:35:46 - __main__ - INFO: 四元数是: - [-0.01392688 0.71433097 -0.69885263 0.03379822] -2025-08-21 11:38:53 - __main__ - INFO: 读 eye_hand_data/data20250821/1.jpg -2025-08-21 11:38:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_1.jpg -2025-08-21 11:38:53 - __main__ - INFO: 读 eye_hand_data/data20250821/2.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_2.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/3.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_3.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/4.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_4.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/5.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_5.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/6.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_6.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/7.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_7.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/8.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_8.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/9.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_9.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/10.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_10.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/11.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_11.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/12.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_12.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/13.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_13.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/14.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_14.jpg -2025-08-21 11:38:54 - __main__ - INFO: 旋转矩阵是: - [[-0.99732744 0.02734315 0.0677519 ] - [-0.06713675 0.0228221 -0.99748274] - [-0.02882056 -0.99936555 -0.02092538]] -2025-08-21 11:38:54 - __main__ - INFO: 平移向量是: - [[-0.00078482] - [-0.17419722] - [ 0.06796275]] -2025-08-21 11:38:54 - __main__ - INFO: 四元数是: - [-0.01392688 0.71433097 -0.69885263 0.03379822] -2025-08-21 16:14:42 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082101 -2025-08-21 16:14:42 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 16:15:03 - __main__ - INFO: robot.torqueOff -2025-08-21 16:15:13 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:15:27 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:07 - __main__ - INFO: 当前关节角: [0.1881774860208302, 1.5359324367098321, 2.101302129336008, 1.237947176207676, -3.239618392465156, 0.660369236729398, -0.22447188913024077] -2025-08-21 16:16:07 - __main__ - INFO: 获取位姿成功: -[[-0.13936557 -0.98748272 -0.0738588 0.25639562] - [ 0.98789482 -0.13351676 -0.07897536 -0.27191259] - [ 0.06812542 -0.08397117 0.9941367 -0.23921664] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:07 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:07 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:16:11 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:20 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:25 - __main__ - INFO: 当前关节角: [0.1847488111409769, 1.3553365747934838, 2.1088087630430623, 1.2244802297734347, -3.265897305913068, 0.6804733079587482, -0.22435892891133088] -2025-08-21 16:16:25 - __main__ - INFO: 获取位姿成功: -[[-0.12214152 -0.99148995 -0.04504583 0.24935823] - [ 0.98590508 -0.12643169 0.10957282 -0.3301866 ] - [-0.11433557 -0.03102752 0.99295754 -0.22048319] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:25 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:25 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:16:28 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:40 - __main__ - INFO: 当前关节角: [0.18216591403464222, 1.3093807506078976, 2.108801169078766, 1.237752580872579, -3.386807456195824, 0.674951546669682, -0.22420894811647574] -2025-08-21 16:16:40 - __main__ - INFO: 获取位姿成功: -[[-0.12765968 -0.99174931 0.01167535 0.24725332] - [ 0.95778442 -0.12021331 0.26114702 -0.34440277] - [-0.25758884 0.04452042 0.96522843 -0.21331776] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:40 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:40 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:16:43 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:52 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:57 - __main__ - INFO: 当前关节角: [0.15805412814783334, 1.218028207858052, 2.1077446587960202, 1.3528049369461503, -3.398763203735069, 0.6851996014877597, -0.2241823692414381] -2025-08-21 16:16:57 - __main__ - INFO: 获取位姿成功: -[[-0.12061637 -0.99148511 -0.04908122 0.24079104] - [ 0.90170295 -0.13010493 0.41231601 -0.36562399] - [-0.41519089 0.00547538 0.90971784 -0.17673377] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:57 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:16:59 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:14 - __main__ - INFO: 当前关节角: [0.15782630921893942, 1.148865228782473, 2.0802051472748952, 1.4294517678358942, -3.4739330085691504, 0.6850638593759604, -0.22417762301375282] -2025-08-21 16:17:14 - __main__ - INFO: 获取位姿成功: -[[-0.13323657 -0.98863605 -0.06961879 0.24168424] - [ 0.81161017 -0.14915447 0.56483792 -0.37307124] - [-0.56880309 0.01875375 0.8222599 -0.14946229] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:14 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:14 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:17:21 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:43 - __main__ - INFO: 当前关节角: [0.3590416826912605, 1.1394164387065981, 2.0769226562077487, 1.5773176436344847, -2.5660726784358565, 0.5330820549286868, 0.8458689010901876] -2025-08-21 16:17:43 - __main__ - INFO: 获取位姿成功: -[[-0.1100018 -0.97171944 0.20895198 0.26213488] - [ 0.9937792 -0.11120581 0.00601407 -0.35469134] - [ 0.01739269 0.20831369 0.97790741 -0.04493756] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:43 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:43 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:17:46 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:53 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:59 - __main__ - INFO: 当前关节角: [0.3520818144135517, 1.1556029736045101, 2.017053740185504, 1.6291274650471073, -2.566324228503177, 0.5650403044248166, 0.8458594086348171] -2025-08-21 16:17:59 - __main__ - INFO: 获取位姿成功: -[[-0.20049553 -0.96061353 0.19241411 0.26384736] - [ 0.97904311 -0.18929837 0.07510466 -0.33478381] - [-0.03572288 0.20343986 0.97843554 -0.04338287] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:59 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:59 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:18:01 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:09 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:13 - __main__ - INFO: 当前关节角: [0.3172653866053403, 1.313845052368681, 1.8904177408232146, 1.7188083864061938, -2.6905567381656357, 0.28883548277045484, 0.8458527639160577] -2025-08-21 16:18:13 - __main__ - INFO: 获取位姿成功: -[[-0.09067794 -0.96156996 0.25915385 0.27763283] - [ 0.99082305 -0.1133011 -0.0737058 -0.27031831] - [ 0.1002357 0.25009212 0.96301959 -0.05935151] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:13 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:13 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:18:16 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:25 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:30 - __main__ - INFO: 当前关节角: [0.3113658255925252, 1.3320734144168047, 1.7972094230484208, 1.807990953858325, -2.9523187889736606, 0.29634021798643495, 0.8458480176883724] -2025-08-21 16:18:30 - __main__ - INFO: 获取位姿成功: -[[-0.06182316 -0.96333913 0.26106631 0.27572117] - [ 0.985666 -0.01779069 0.16776779 -0.23950089] - [-0.15697273 0.26769612 0.9506305 -0.05533822] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:30 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:18:33 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:44 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:49 - __main__ - INFO: 当前关节角: [0.3174068241903619, 1.4675260063272884, 1.5487007384287987, 1.7904982571014212, -3.2589716104746933, 0.07981446324690623, 0.8458337790053165] -2025-08-21 16:18:49 - __main__ - INFO: 获取位姿成功: -[[ 0.00204587 -0.95045805 0.31084613 0.291817 ] - [ 0.96975598 0.0777536 0.2313606 -0.15674434] - [-0.24406795 0.30097156 0.92187144 -0.07498582] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:49 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:49 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:18:52 - __main__ - INFO: robot.torqueOff -2025-08-21 16:19:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:19:14 - __main__ - INFO: robot.torqueOff -2025-08-21 16:19:25 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:19:30 - __main__ - INFO: 当前关节角: [0.27753946087946524, 1.6105355419582903, 1.2276915274253017, 1.6875801067280616, -3.5108406242955006, -0.6567573574608925, 0.8458072001302789] -2025-08-21 16:19:30 - __main__ - INFO: 获取位姿成功: -[[ 0.38872691 -0.8780319 0.27919772 0.29523427] - [ 0.91848265 0.39319638 -0.0422638 -0.05153552] - [-0.07267057 0.27286734 0.95930308 -0.10555432] - [ 0. 0. 0. 1. ]] -2025-08-21 16:19:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:19:30 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:19:33 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:06 - __main__ - INFO: 当前关节角: [0.19953615811726558, 1.5134979676870048, 1.3755934745543004, 1.2340486247869789, -3.235004109909517, -0.39607934505618747, -0.18381760126912305] -2025-08-21 16:20:06 - __main__ - INFO: 获取位姿成功: -[[ 0.2004248 -0.97752505 -0.065381 0.29826073] - [ 0.95269085 0.17889858 0.24571414 -0.11593768] - [-0.22849516 -0.11153509 0.96713489 -0.24686201] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:06 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:20:08 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:19 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:24 - __main__ - INFO: 当前关节角: [0.14909894575122867, 1.5289374463472523, 1.327669864370393, 1.130913097185633, -3.1925177781618777, -0.44474526525007424, -0.2899508462764979] -2025-08-21 16:20:24 - __main__ - INFO: 获取位姿成功: -[[ 0.1795737 -0.98355917 -0.01909571 0.27480921] - [ 0.95378635 0.16931837 0.24823956 -0.10309542] - [-0.24092504 -0.06279052 0.96851044 -0.28676362] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:24 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:24 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:20:26 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:43 - __main__ - INFO: 当前关节角: [0.16214537641255308, 1.3656235486785808, 1.5120835918367883, 1.2035123451053618, -2.9271913103622, -0.014777854520918107, -0.2900476693212778] -2025-08-21 16:20:43 - __main__ - INFO: 获取位姿成功: -[[ 0.03397924 -0.99615678 -0.08072841 0.28406157] - [ 0.99940914 0.03344943 0.00790666 -0.19681757] - [-0.00517596 -0.08094937 0.99670478 -0.25137906] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:43 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:43 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:20:45 - __main__ - INFO: robot.torqueOff -2025-08-21 16:21:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:21:26 - __main__ - INFO: 当前关节角: [0.23122007565318572, 1.628535135831983, 1.828089329614453, 1.4320631423083405, -3.0376977295588006, 0.19928270955887112, 0.14386290736881704] -2025-08-21 16:21:26 - __main__ - INFO: 获取位姿成功: -[[ 0.02777164 -0.99933259 0.02373016 0.29887982] - [ 0.98010716 0.02255505 -0.19718324 -0.18783112] - [ 0.1965164 0.0287342 0.98007941 -0.17737878] - [ 0. 0. 0. 1. ]] -2025-08-21 16:21:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:21:26 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:21:29 - __main__ - INFO: robot.torqueOff -2025-08-21 16:21:42 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:21:47 - __main__ - INFO: 当前关节角: [0.22977437470024648, 1.339187060471517, 2.1365172402697836, 1.3177511977536744, -3.033028390762013, 0.8488428873577902, 0.1439046741724476] -2025-08-21 16:21:47 - __main__ - INFO: 获取位姿成功: -[[-0.24782493 -0.96680534 0.06221126 0.25321104] - [ 0.96857382 -0.24585225 0.03770167 -0.33940743] - [-0.02115539 0.06959961 0.99735066 -0.17940936] - [ 0. 0. 0. 1. ]] -2025-08-21 16:21:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:21:47 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:21:50 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:05 - __main__ - INFO: 当前关节角: [0.2123139522916026, 1.6156225487913838, 1.9870955510359554, 1.1415721753212567, -3.261262139955614, 0.40399890057186194, -0.2904045856432116] -2025-08-21 16:22:05 - __main__ - INFO: 获取位姿成功: -[[-0.02238853 -0.99787522 -0.06118662 0.27706052] - [ 0.9941035 -0.01572528 -0.10728906 -0.21679508] - [ 0.10609892 -0.06322787 0.99234331 -0.26052986] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:05 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:05 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:22:08 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:20 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:25 - __main__ - INFO: 当前关节角: [0.7920960399069291, 1.588399136034099, 1.9284805883681642, 1.3829188023637766, -3.1986537013134204, 0.2975713894479991, 1.133828230229938] -2025-08-21 16:22:25 - __main__ - INFO: 获取位姿成功: -[[ 0.02514396 -0.85857888 0.51206454 0.37379129] - [ 0.99831944 -0.00518728 -0.05771811 -0.22146041] - [ 0.05221177 0.51265524 0.85700556 -0.00260762] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:25 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:25 - __main__ - INFO: ===采集第18次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:22:28 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:42 - __main__ - INFO: 当前关节角: [0.5278507627739604, 1.75270689378007, 1.4620754384535017, 1.2688669510862645, -3.519189238793925, -0.41788541353348263, 0.5962609901386524] -2025-08-21 16:22:42 - __main__ - INFO: 获取位姿成功: -[[ 0.30642283 -0.90783743 0.28624507 0.37152839] - [ 0.94130348 0.33372329 0.05075938 -0.05876817] - [-0.14160791 0.25388965 0.95681098 -0.11450045] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:42 - __main__ - INFO: ===采集第19次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:22:45 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:51 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 16:22:52 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_19.jpg -2025-08-21 16:23:13 - __main__ - INFO: 旋转矩阵是: - [[-0.99574619 0.06505242 0.06525112] - [-0.06118047 0.06271804 -0.9961543 ] - [-0.06889468 -0.99590895 -0.05847131]] -2025-08-21 16:23:13 - __main__ - INFO: 平移向量是: - [[-0.00932961] - [-0.17733044] - [ 0.07299168]] -2025-08-21 16:23:13 - __main__ - INFO: 四元数是: - [ 0.0013306 0.72748463 -0.68457228 0.04609919] -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_19.jpg -2025-08-21 16:25:47 - __main__ - INFO: 旋转矩阵是: - [[-0.99574619 0.06505242 0.06525112] - [-0.06118047 0.06271804 -0.9961543 ] - [-0.06889468 -0.99590895 -0.05847131]] -2025-08-21 16:25:47 - __main__ - INFO: 平移向量是: - [[-0.00932961] - [-0.17733044] - [ 0.07299168]] -2025-08-21 16:25:47 - __main__ - INFO: 四元数是: - [ 0.0013306 0.72748463 -0.68457228 0.04609919] -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:26:09 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-08-21 16:26:09 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-08-21 16:26:09 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-08-21 17:18:15 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082102 -2025-08-21 17:18:15 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:18:34 - __main__ - INFO: 当前关节角: [0.0020332839403781207, 1.3408007778845155, 1.0441700907637408e-05, 0.3222679105856357, 2.752812057468044e-05, 0.001749459524797795, -0.09380919019975154] -2025-08-21 17:18:34 - __main__ - INFO: 获取位姿成功: -[[ 9.99992854e-01 -3.77482620e-03 -2.04576300e-04 3.09996779e-02] - [-1.98775400e-04 1.53703370e-03 -9.99998799e-01 -2.05056032e-01] - [ 3.77513610e-03 9.99991694e-01 1.53627240e-03 -4.49243316e-01] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]] -2025-08-21 17:18:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 17:18:34 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082102/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082102/1.jpg -2025-08-21 17:18:36 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 17:18:36 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 17:19:10 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082103 -2025-08-21 17:19:10 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:19:15 - __main__ - INFO: robot.torqueOff -2025-08-21 17:19:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 17:19:50 - __main__ - INFO: 当前关节角: [0.8979217293602972, 1.0614919233239744, 0.02469082566441424, 0.3463407774054252, -1.1223005924279064, 0.6689039033530859, -0.09368958526208224] -2025-08-21 17:19:50 - __main__ - INFO: 获取位姿成功: -[[-0.17316325 -0.89563008 0.40970873 0.35893735] - [ 0.79070696 -0.37443718 -0.48433387 -0.30959237] - [ 0.58719417 0.24009071 0.7730197 -0.22790869] - [ 0. 0. 0. 1. ]] -2025-08-21 17:19:50 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 17:19:50 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082103/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082103/1.jpg -2025-08-21 17:19:53 - __main__ - INFO: robot.torqueOff -2025-08-21 17:21:50 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 17:21:51 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 17:21:57 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082104 -2025-08-21 17:21:57 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:22:07 - __main__ - INFO: robot.torqueOff -2025-08-21 17:22:16 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 18:00:33 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082105 -2025-08-21 18:00:33 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 18:00:45 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 18:00:45 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 18:01:14 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082106 -2025-08-21 18:01:14 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 18:01:32 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 18:01:32 - __main__ - INFO: 相机已关闭,窗口已销毁 diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-28.log b/python/hand_eye_calibration/libs/web-log.2025-08-28.log deleted file mode 100644 index 30302d29..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-28.log +++ /dev/null @@ -1,46 +0,0 @@ -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-23 16:08:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-23 16:08:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-23 16:08:46 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-08-23 16:08:46 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-08-23 16:08:46 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/hand_eye_calibration/libs/web-log.2025-09-05.log b/python/hand_eye_calibration/libs/web-log.2025-09-05.log deleted file mode 100644 index 858d0681..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-09-05.log +++ /dev/null @@ -1,167 +0,0 @@ -2025-09-05 16:02:35 - libs.auxiliary - INFO: create folder eye_hand_data/data20250905 -2025-09-05 16:04:01 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090501 -2025-09-05 16:04:01 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:28 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090502 -2025-09-05 16:05:28 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:42 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090503 -2025-09-05 16:05:42 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:48 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-09-05 16:09:41 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090504 -2025-09-05 16:09:41 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:12:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-09-05 16:12:53 - __main__ - INFO: 当前关节角: [-0.020066101407867926, 1.46894512840519, 1.4589372327079881, 0.15968113499835065, 0.0808671765475035, -0.13818357132059936, -0.2431388026164853] -2025-09-05 16:12:53 - __main__ - INFO: 获取位姿成功: -[[-0.10992689 0.05250327 -0.99255201 -0.00608509] - [ 0.0426073 -0.99743702 -0.0574805 -0.22011888] - [-0.99302603 -0.04860861 0.10740812 -0.73570586] - [ 0. 0. 0. 1. ]] -2025-09-05 16:12:53 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-09-05 16:12:53 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025090504/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025090504/1.jpg -2025-09-05 16:12:56 - __main__ - INFO: robot.torqueOff -2025-09-05 16:25:21 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-09-05 16:25:26 - __main__ - INFO: 当前关节角: [-0.019045662455530632, 0.14962957400644405, 1.3928232302974393, -0.07693350304193537, -1.3815034772680232, 0.03932344561816248, -0.20795691527650662] -2025-09-05 16:25:26 - __main__ - INFO: 获取位姿成功: -[[-0.03644065 0.99920824 0.01596754 -0.01550389] - [-0.99665653 -0.03750756 0.07258755 -0.94854757] - [ 0.07312898 -0.01326902 0.99723422 -0.00291912] - [ 0. 0. 0. 1. ]] -2025-09-05 16:25:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-09-05 16:25:26 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025090504/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025090504/2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:21:04 - __main__ - INFO: 旋转矩阵是: - [[ 0.05477568 0.03458859 0.99789942] - [-0.99767126 0.04257346 0.0532875 ] - [-0.04064089 -0.99849443 0.03684003]] -2025-09-05 17:21:04 - __main__ - INFO: 平移向量是: - [[-0.14908435] - [-0.19737896] - [-0.05964516]] -2025-09-05 17:21:04 - __main__ - INFO: 四元数是: - [-0.49380213 0.48758531 -0.48463669 0.53249159] -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:26:28 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-05 17:26:28 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-05 17:26:28 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:45:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:45:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:45:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:45:13 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-05 17:45:13 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-05 17:45:13 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/vision_servo/__pycache__/follow_target.cpython-310.pyc b/python/vision_servo/__pycache__/follow_target.cpython-310.pyc deleted file mode 100644 index 0ce0e221..00000000 Binary files a/python/vision_servo/__pycache__/follow_target.cpython-310.pyc and /dev/null differ diff --git a/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc b/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc deleted file mode 100644 index 9dcaa672..00000000 Binary files a/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc and /dev/null differ diff --git a/python/vision_servo/red_point.png b/python/vision_servo/red_point.png deleted file mode 100644 index 371035f6..00000000 Binary files a/python/vision_servo/red_point.png and /dev/null differ diff --git a/python/vision_servo/robot_warpper_test.py b/python/vision_servo/robot_warpper_test.py deleted file mode 100644 index 3464b06e..00000000 --- a/python/vision_servo/robot_warpper_test.py +++ /dev/null @@ -1,66 +0,0 @@ -import sys -import os -from pathlib import Path -os.environ["GLOG_minloglevel"] = "1" # 屏蔽 INFO -# from python.vision_servo.follow_target import moveJ -import time - -# 把.so所在目录加入 Python 路径 -sys.path.append("/home/lgv/cmvr/cmvr-es/cmake-build-debug/example") - -# 导入模块 -from robot_wrapper import Robot - -REPO_ROOT = Path(__file__).resolve().parents[2] -ROBOT_CONFIG = str(REPO_ROOT / "cmvr-es/config/cmvr_es.pb.txt") - -# R_WRIST_R_S -# 初始化机器人(传入配置文件路径和机器人名称) -robot = Robot(ROBOT_CONFIG, "hc01") - -# robot.torqueOn() -# -# -# x,y,z,rx,ry,rz = robot.fk(base_link="PELVIS_S", ee_link="R_FINGER_TIP") -# # robot->move(base_link="PELVIS_S", target_link="R_FINGER_TIP") -# -# -# print(x, y, z, rx, ry, rz, sep=',') -# -# -# while True: -# for j in JOINT_POSITIONS: -# robot.moveJ('right', j) - -# time.sleep(10) -# js = robot.getJointQ('right') -# print(js) -# 控制左臂关节 -robot.calibrateZeroQ("R_WRIST_R") -robot.calibrateZeroQ("R_WRIST_Y") -time.sleep(1) -print("--------------------------") -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# # robot.moveJ("right", [-0.344938, 0.935147, 2.27031,1.68959, -2.32841,0.460145, 0.300996]) -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# # -# time.sleep(10) - -# robot.torqueOff("R_WRIST_R") -# time.sleep(10) -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# time.sleep(20) -# # robot.moveJ("right", [0.00203898, 1.34062, 0.0,0.322261, 0.0,-0.000210733, -0.0942364]) -# robot.torqueOn() -# # time.sleep(500) -# robot.torqueOff("WAIST_P") -# time.sleep(30) -# // {"R_SHOULDER_P", 0.00203898}, -# // {"R_SHOULDER_R", 1.34062}, -# // {"R_SHOULDER_Y", 0.0}, -# // {"R_ELBOW_R", 0.522261}, -# // {"R_WRIST_P", 0.0}, -# // {"R_WRIST_Y", -0.000210733}, -# // {"R_WRIST_R", -0.0942364} -# 控制右臂关节 -# robot.moveJ("right", [0.1, 0.4, -0.3, 0.2, 0.0, -0.1, 0.2]) diff --git a/python/vision_servo/test.py b/python/vision_servo/test.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python/vision_servo/to.py b/python/vision_servo/to.py deleted file mode 100644 index 4e50f279..00000000 --- a/python/vision_servo/to.py +++ /dev/null @@ -1,26 +0,0 @@ -import math -import numpy as np - -def rotation_matrix_to_euler_zyx(R): - if abs(R[2,0]) != 1: - theta = -math.asin(R[2,0]) - cos_theta = math.cos(theta) - phi = math.atan2(R[2,1]/cos_theta, R[2,2]/cos_theta) - psi = math.atan2(R[1,0]/cos_theta, R[0,0]/cos_theta) - else: - phi = 0 - if R[2,0] == -1: - theta = math.pi/2 - psi = phi + math.atan2(R[0,1], R[0,2]) - else: - theta = -math.pi/2 - psi = -phi + math.atan2(-R[0,1], -R[0,2]) - return phi, theta, psi # roll, pitch, yaw - - -R = np.array([[-1, 0, 0], - [0, 0, -1], - [0, -1, 0]]) - -roll, pitch, yaw = rotation_matrix_to_euler_zyx(R) -print("roll:", roll, "pitch:", pitch, "yaw:", yaw) \ No newline at end of file diff --git a/script/test.py b/script/test.py deleted file mode 100644 index f35f2cfb..00000000 --- a/script/test.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -text_dgceshi.py — 写死 5 组表情(已按 XML 限位约束),每 5 秒切换,循环发送到 ESP32 -依赖:pip install pyserial -用法: - python text_dgceshi.py /dev/ttyUSB0 [baudrate] - -帧格式(与你现有固件一致): -[0] 0xAA -[1] count = 指令条数(每条是5字节:addr, ch, ang, durL, durH) -[2..] 指令序列,共 count*5 字节 -[end] XOR 校验(对前面所有字节异或) -""" - -import sys -import time -import serial - -FRAME_HEADER = 0xAA - -def calc_checksum(data: bytearray) -> int: - """XOR 校验""" - cs = 0 - for b in data: - cs ^= b - return cs & 0xFF - -def pack_pose(raw_list): - """ - raw_list: [addr, ch, ang, durL, durH, addr, ch, ang, durL, durH, ...] - 返回带帧头/数量/校验的完整数据包 bytes - """ - assert len(raw_list) % 5 == 0, "原始列表长度必须是 5 的倍数" - count = len(raw_list) // 5 - pkt = bytearray([FRAME_HEADER, count & 0xFF]) - pkt.extend(int(x) & 0xFF for x in raw_list) - pkt.append(calc_checksum(pkt)) - return bytes(pkt) - -def print_packet(pkt): - print("发送数据包:", ' '.join(f"0x{b:02X}" for b in pkt)) - -def wakeup_esp32(port, baud=115200): - """通过 RTS/DTR 尝试唤醒 ESP32(可选)""" - try: - ser = serial.Serial(port, baud, timeout=1) - ser.setDTR(False) - ser.setRTS(False) - time.sleep(0.02) - ser.setDTR(True) - ser.setRTS(True) - ser.write(b"\r\n") - time.sleep(0.2) - except Exception as e: - print(f"[WARN] 唤醒失败:{e}") - finally: - try: - ser.close() - except: - pass - -def open_serial(port, baud): - try: - ser = serial.Serial(port, baud, timeout=1) - print(f"已打开串口: {port} @ {baud}bps") - return ser - except Exception as e: - print(f"打开串口失败: {e}") - sys.exit(1) - -# ======================= -# 五组“写死”的表情数据(严格遵守你的 XML 安全限位) -# 64:0~3 眉(offset 90/90/90/90,限位 45~120/…/50~120) -# 64:4~9 眼(offset 90..,限位 [90~170, 10~90, 10~90, 90~170, 10~170, 10~170]) -# 65:0~9 嘴(offset 90..,限位 [60~130, 60~130, 50~120, 50~130, 50~100, 50~130, 50~130, 90~120, 91~120, 60~89]) -# duration 全部为 0(立即执行);如需时长,可把毫秒拆成 durL/durH 小端写入 -# ======================= - -POSES_RAW = [ - # # Pose 1 — 中性位置(全部 offset) - [ - # 板 64 — 眼眉 0~3 - 64,0,90,0,0, 64,1,90,0,0, 64,2,90,0,0, 64,3,90,0,0, - # 板 64 — 眼睛 4~9(选在各自安全范围内的中值/视觉舒适值) - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,150,0,0, 64,9,150,0,0, - # 板 65 — 嘴巴 0~9 - 65,0,90,0,0, 65,1,90,0,0, 65,2,85,0,0, 65,3,90,0,0, 65,4,90,0,0, - 65,5,90,0,0, 65,6,90,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - - # Pose 5 — 大笑(接近上限但不越界) - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,100,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ], - - - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,130,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,90,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,90,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ] -] - -POSES_RAW1 = [[ - # 板 64 — 眼眉 0~3 - 64,0,90,0,0, 64,1,90,0,0, 64,2,90,0,0, 64,3,90,0,0, - # 板 64 — 眼睛 4~9(选在各自安全范围内的中值/视觉舒适值) - 64,4,90,0,0, 64,5,90,0,0, 64,6,90,0,0, 64,7,90,0,0, 64,8,150,0,0, 64,9,150,0,0, - # 板 65 — 嘴巴 0~9 - 65,0,90,0,0, 65,1,90,0,0, 65,2,85,0,0, 65,3,90,0,0, 65,4,90,0,0, - 65,5,90,0,0, 65,6,90,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - - # Pose 5 — 大笑(接近上限但不越界) - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,100,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ], - - -] - -def main(): - if len(sys.argv) < 2: - print(f"用法: {sys.argv[0]} /dev/ttyUSB0 [baudrate]") - sys.exit(1) - port = sys.argv[1] - baud = int(sys.argv[2]) if len(sys.argv) > 2 else 115200 - - # 可选:尝试唤醒 ESP32 - wakeup_esp32(port, baud) - - ser = open_serial(port, baud) - - try: - pose_idx = 0 - hold_seconds = 5 - print(f"开始循环播放 5 组表情,每组间隔 {hold_seconds} 秒...") - while True: - pose = POSES_RAW[pose_idx] - pkt = pack_pose(pose) - print(f"\n→ 发送 Pose {pose_idx+1}/{len(POSES_RAW)}") - print_packet(pkt) - ser.write(pkt) - ser.flush() - time.sleep(hold_seconds) - pose_idx = (pose_idx + 1) % len(POSES_RAW) - except KeyboardInterrupt: - print("\n用户中断,退出") - finally: - ser.close() - print("串口已关闭") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc deleted file mode 100644 index 55da4544..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc b/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc deleted file mode 100644 index d44724f3..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc deleted file mode 100644 index d2ca3891..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc deleted file mode 100644 index 59bbcfd2..00000000 Binary files a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc b/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc deleted file mode 100644 index 117859e4..00000000 Binary files a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc and /dev/null differ diff --git a/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc b/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc deleted file mode 100644 index c64f7e7a..00000000 Binary files a/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc and /dev/null differ