49、OAK测试官方的IMU模块和SpatialLocationCalculator节点

2023-05-16

基本思想:不太懂IMU是干嘛的,不像图像那么容易可视化,参考官方demo的,记录一下,后续这篇需要补充,参考的IMU的介绍,原理不懂,先占个坑,继续学习官方的知乎

IMU Sensors: Everything You Need To Know! – Embedded Inventor

cmakelists.txt 

cmake_minimum_required(VERSION 3.16)
project(depthai)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
#message(STATUS ${OpenCV_INCLUDE_DIRS})
#添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/include/utility)
#链接Opencv库
find_package(depthai CONFIG REQUIRED)
add_executable(depthai main.cpp include/utility/utility.cpp)
target_link_libraries(depthai ${OpenCV_LIBS}  depthai::opencv)

main.cpp 参考官方demo,一步步学,一步步创新

#include <chrono>

#include "utility.hpp"

#include "depthai/depthai.hpp"
using namespace std::chrono;

int main(int argc, char** argv) {
    dai::Pipeline pipeline;
    //定义imu
    auto imu=pipeline.create<dai::node::IMU>();

    // enable ACCELEROMETER_RAW at 500 hz rate
    imu->enableIMUSensor(dai::IMUSensor::ACCELEROMETER_RAW, 500);
    // enable GYROSCOPE_RAW at 400 hz rate
    imu->enableIMUSensor(dai::IMUSensor::GYROSCOPE_RAW, 400);
    // if lower or equal to batchReportThreshold then the sending is always blocking on device
    // useful to reduce device's CPU load  and number of lost packets, if CPU load is high on device side due to multiple nodes
    imu->setMaxBatchReports(10);

    //定义输出
    auto xlinkoutpreviewOut=pipeline.create<dai::node::XLinkOut>();
    xlinkoutpreviewOut->setStreamName("imu");



    imu->out.link(xlinkoutpreviewOut->input);
    //结构推送相机
    dai::Device device(pipeline);
    //取帧显示
    auto  outqueue=device.getOutputQueue("imu",8, false);//maxsize 代表缓冲数据

    bool firstTs = false;
    auto baseTs = std::chrono::time_point<std::chrono::steady_clock, std::chrono::steady_clock::duration>();
    while(1){
        auto imuData = outqueue->get<dai::IMUData>();
        auto imuPackets = imuData->packets;
        for(auto& imuPacket : imuPackets) {
            auto& acceleroValues = imuPacket.acceleroMeter;
            auto& gyroValues = imuPacket.gyroscope;

            auto acceleroTs1 = acceleroValues.timestamp.get();
            auto gyroTs1 = gyroValues.timestamp.get();
            if(!firstTs) {
                baseTs = std::min(acceleroTs1, gyroTs1);
                firstTs = true;
            }

            auto acceleroTs = acceleroTs1 - baseTs;
            auto gyroTs = gyroTs1 - baseTs;

            printf("Accelerometer timestamp: %ld ms\n", static_cast<long>(duration_cast<milliseconds>(acceleroTs).count()));
            printf("Accelerometer [m/s^2]: x: %.3f y: %.3f z: %.3f \n", acceleroValues.x, acceleroValues.y, acceleroValues.z);
            printf("Gyroscope timestamp: %ld ms\n", static_cast<long>(duration_cast<milliseconds>(gyroTs).count()));
            printf("Gyroscope [rad/s]: x: %.3f y: %.3f z: %.3f \n", gyroValues.x, gyroValues.y, gyroValues.z);
        }

        cv::waitKey(1);

    }


    return 0;
}

这个代码不太懂输出的信息,如何使用

/home/ubuntu/untitled9/cmake-build-debug/depthai
Accelerometer timestamp: 0 ms
Accelerometer [m/s^2]: x: 0.345 y: -0.259 z: -10.132 
Gyroscope timestamp: 1 ms
Gyroscope [rad/s]: x: -0.001 y: -0.010 z: 0.009 
Accelerometer timestamp: 3 ms
Accelerometer [m/s^2]: x: 0.335 y: -0.268 z: -10.123 
Gyroscope timestamp: 3 ms
Gyroscope [rad/s]: x: -0.003 y: 0.004 z: 0.004 
Accelerometer timestamp: 5 ms
Accelerometer [m/s^2]: x: 0.335 y: -0.287 z: -10.151 

二、SpatialLocationCalculator节点

 cmakelists.txt

cmake_minimum_required(VERSION 3.16)
project(depthai)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
#message(STATUS ${OpenCV_INCLUDE_DIRS})
#添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/include/utility)
#链接Opencv库
find_package(depthai CONFIG REQUIRED)
add_executable(depthai main.cpp include/utility/utility.cpp)
target_link_libraries(depthai ${OpenCV_LIBS}  depthai::opencv)

main.cpp

#include <chrono>

#include "utility.hpp"

#include "depthai/depthai.hpp"
using namespace std::chrono;

int main(int argc, char** argv) {
    dai::Pipeline pipeline;
    //定义
    auto cam=pipeline.create<dai::node::ColorCamera>();
    cam->setBoardSocket(dai::CameraBoardSocket::RGB);

    auto spa=pipeline.create<dai::node::SpatialLocationCalculator>();
    auto left=pipeline.create<dai::node::MonoCamera>();
    left->setBoardSocket(dai::CameraBoardSocket::LEFT);
    left->setResolution(dai::MonoCameraProperties::SensorResolution::THE_800_P);
     auto right=pipeline.create<dai::node::MonoCamera>();
    right->setBoardSocket(dai::CameraBoardSocket::RIGHT);
    right->setResolution(dai::MonoCameraProperties::SensorResolution::THE_800_P);

    auto stero=pipeline.create<dai::node::StereoDepth>();
    stero->setLeftRightCheck(true);

    auto conf=pipeline.create<dai::node::XLinkIn>();
    conf->setStreamName("config");

    left->out.link(stero->left);
    right->out.link(stero->right);


    //定义输出
    auto xlinkoutpreviewOut=pipeline.create<dai::node::XLinkOut>();
    xlinkoutpreviewOut->setStreamName("out");

    auto xlinkoutpdepthOut=pipeline.create<dai::node::XLinkOut>();
    xlinkoutpdepthOut->setStreamName("depthout");


    stero->depth.link(spa->inputDepth);
    conf->out.link(spa->inputConfig);

    spa->out.link(xlinkoutpreviewOut->input);
    spa->passthroughDepth.link(xlinkoutpdepthOut->input);
    //结构推送相机
    dai::Device device(pipeline);
    //取帧显示
    auto  outqueue=device.getOutputQueue("out",8, false);//maxsize 代表缓冲数据
    auto  depthout=device.getOutputQueue("depthout",8, false);//maxsize 代表缓冲数据
    auto outconfig=device.getInputQueue("config");
    dai::SpatialLocationCalculatorConfig cf;
    dai::SpatialLocationCalculatorConfigThresholds score;
    score.lowerThreshold=100;
    score.upperThreshold=1000;
    std::vector<dai::SpatialLocationCalculatorConfigData> ROIs;
    ROIs.push_back({dai::Rect(200,300,40,40),score});
    cf.setROIs(ROIs);
    outconfig->send(cf);

    while(1){



        auto Depthframe=depthout->get<dai::ImgFrame>();
        auto Depthimage=Depthframe->getCvFrame();
        cv::Mat depthFrameColor;
        cv::normalize(Depthimage, depthFrameColor, 255, 0, cv::NORM_INF, CV_8UC1);
        cv::equalizeHist(depthFrameColor, depthFrameColor);
        cv::applyColorMap(depthFrameColor, depthFrameColor, cv::COLORMAP_COOL);


        auto spatialData = outqueue->get<dai::SpatialLocationCalculatorData>()->getSpatialLocations();
        for(auto depthData : spatialData) {
            auto roi = depthData.config.roi;
            roi = roi.denormalize(Depthimage.cols, Depthimage.rows);
            auto xmin = (int)roi.topLeft().x;
            auto ymin = (int)roi.topLeft().y;
            auto xmax = (int)roi.bottomRight().x;
            auto ymax = (int)roi.bottomRight().y;

            auto depthMin = depthData.depthMin;
            auto depthMax = depthData.depthMax;

            cv::rectangle(depthFrameColor, cv::Rect(cv::Point(xmin, ymin), cv::Point(xmax, ymax)), cv::Scalar(255,255,255), cv::FONT_HERSHEY_SIMPLEX);
            std::stringstream depthX;
            depthX << "X: " << (int)depthData.spatialCoordinates.x << " mm";
            cv::putText(depthFrameColor, depthX.str(), cv::Point(xmin + 10, ymin + 20), cv::FONT_HERSHEY_TRIPLEX, 0.5, cv::Scalar(255,255,255));
            std::stringstream depthY;
            depthY << "Y: " << (int)depthData.spatialCoordinates.y << " mm";
            cv::putText(depthFrameColor, depthY.str(), cv::Point(xmin + 10, ymin + 35), cv::FONT_HERSHEY_TRIPLEX, 0.5, cv::Scalar(255,255,255));
            std::stringstream depthZ;
            depthZ << "Z: " << (int)depthData.spatialCoordinates.z << " mm";
            cv::putText(depthFrameColor, depthZ.str(), cv::Point(xmin + 10, ymin + 50), cv::FONT_HERSHEY_TRIPLEX, 0.5, cv::Scalar(255,255,255));
        }
        //auto Depthframe=outqueue->get<dai::ImgFrame>();
       // auto Depthimage=Depthframe->getCvFrame();

        cv::imshow("depthFrameColor",depthFrameColor);
        cv::imwrite("depthFrameColor.jpg",depthFrameColor);
        cv::waitKey(1);

    }


    return 0;
}

 测试结果

参考

Nodes — DepthAI documentation | Luxonis

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

49、OAK测试官方的IMU模块和SpatialLocationCalculator节点 的相关文章

  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • 关于pixhawk硬件IMU和compass那点事儿

    文章目录 前言一 IMU和compass是什么 xff1f 二 导航坐标系与机体坐标系三 安装IMU xff0c compasss四 hwdef中设置IMU xff0c compass朝向总结 前言 继上一篇讲解了pixhawk的硬件组成
  • Kalibr 之 Camera-IMU 标定 (总结)

    Overview 欢迎访问 持续更新 xff1a https cgabc xyz posts db22c2e6 ethz asl kalibr is a toolbox that solves the following calibrati
  • ROS2中IMU话题的发布及可视化

    环境 xff1a Ubuntu 20 04 xff0c ROS2 Foxy 传感器 xff1a 维特智能BWT901CL 代码是从维特智能的示例代码修改的 xff0c 实现基本的加速度 角速度和角度读取 xff0c 发布IMU消息 这个传感
  • Ubuntu18下xsens IMU的驱动安装及使用imu_utils标定

    最近在做xsens IMU的标定工作 xff0c 网上资源很多很杂 xff0c 打算按自己的操作过程 细节及遇到的问题记录一下 xff0c 里面有参考的博文都附了链接 主体可参考此博文 xff1a VIO 中 IMU 的标定流程 1 3 i
  • ORB-SLAM3测试:数据集(单目/双目/imu)& ROS (D435 T265)

    ORB SLAM3环境配置 安装各种依赖库 orb slam3非常友好 xff0c 不用自己下载各种依赖库 xff0c 因为他们全部在thirdParty文件夹中 xff0c 编译orb slam3的同时会自动编译各种依赖库 Eigen3
  • 传统定位方法简介--------里程计、IMU惯性传感器以及光电编码器等

    移动机器人最初是通过自身携带的内部传感器基于航迹推算的方法进行定位 xff0c 后来进一步发展到通过各种外部传感器对环境特征进行观测从而计算出移动机器人相对于整个环境的位姿 目前为止 xff0c 形成了基于多传感器信息融合的定位方法 现有移
  • 在ROS下Intel RealSense D435i 驱动的安装,避免踩坑,避免缺少imu话题等各种问题(适用于D400系列、SR300和T265跟踪模块等)

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net AnChenliang 1002 article details 109454465 目录 背景 方法1 使用apt安装 不建议使用此方法 了解一下
  • Camera-IMU联合标定原理

    Camera IMU联合标定原理 一 相机投影模型二 IMU 模型三 Camera IMU标定模型 一 相机 IMU旋转 二 相机 IMU平移 三 视觉惯性代价函数 四 camera imu联合标定 一 粗略估计camera与imu之间时间
  • loam中imu消除重力加速度的数学推导

    最近在看loam的源码发现里面有一段关于imu消除重力加速度的源码 xff0c 刚开始看不明白后来终于搞清楚了 xff0c 欢迎大家批评指正 要理解这个问题首先得明白欧拉角到旋转矩阵的变换 先上图 此图描述的是先绕X xff0c 再绕Y x
  • 51、部署PaddleSeg的pp_liteseg到MNN框架、OpenVINO框架和OAK框架、NPU(RK3399 PRO)框架

    基本思想 xff1a 需要一个快的实例分割模型 xff0c 由于需要配置oak使用 xff0c 所以就记录和实现一下微软社区提供的思路 xff0c 去部署PaddleSeg的轻量级 实际是语义 分割模型 所有的实验模型 xff0c 花了两天
  • TI CC265x的IIC通讯读取IMU BMI08x数据

    SmartLink CC265x是TI公司出的无线MCU平台器件 最近玩了个小项目用TI的CC265x平板IIC接口通讯 xff0c 获取博世BMI08x陀螺仪 加速度计传感器的数据 本篇博客亦是对博客 树莓派IIC通讯获取BMI08x I
  • 星网宇达(惯导+IMU)设备实现自动采点

    一 创建和打开gps Road txt文件 xff0c 准备往里写数据 FILE span class token operator span p span class token operator 61 span span class t
  • 优化IMU数据避免突变的建议

    影响IMU数据变化的主要因素是应力 温度和电气干扰 xff1b xff11 温度的的骤升 xff0c 比如芯片的位置附件有相关器件几秒钟工作一次 xff0c 此时温度骤升 xff0c 可能会引起数据也发生突变 xff0c 周围有变化的热源和
  • Ardupilot IMU恒温控制代码学习

    目录 文章目录 目录 摘要 第一章原理图学习 第二章恒温代码学习 1 目标温度怎么设置 摘要 本节主要学习ardupilot的IMU恒温控制代码 采用的飞控是pixhawk v5 欢迎一起交流学习 第一章原理图学习
  • IMU-Allan方差分析

    使用Allan方差来确定MEMS陀螺仪的噪声参数 陀螺仪测量模型为 使用长时间静止的陀螺仪数据对陀螺仪噪声参数进行分析 上式中 三个噪声参数N 角度随机游走 K 速率随机游走 和B 偏差不稳定性 背景 Allan方差最初由David W A
  • 无人机姿态融合——EKF

    联系方式 860122112 qq com 一 实验目的 使用惯性测量单元IMU和磁场传感器 磁力计 的信息 通过EKF对四旋翼无人机进行姿态融合 二 实验环境 ROS机器人操作系统 三 实验步骤 1 安装hector quadrotor
  • PID算法(没办法完全理解的东西)

    快速 P 准确 I 稳定 D P Proportion 比例 就是输入偏差乘以一个常数 I Integral 积分 就是对输入偏差进行积分运算 D Derivative 微分 对输入偏差进行微分运算 输入偏差 读出的被控制对象的值 设定值
  • 四元素与旋转矩阵

    如何描述三维空间中刚体的旋转 是个有趣的问题 具体地说 就是刚体上的任意一个点P x y z 围绕过原点的轴 i j k 旋转 求旋转后的点P x y z 旋转矩阵 旋转矩阵乘以点P的齐次坐标 得到旋转后的点P 因此旋转矩阵可以描述旋转 x
  • 如何使用 deno 的 Oak 提供图像?

    Deno 似乎针对文本文件 但我还需要为网站提供图像文件 您可以使用send 功能send 旨在将静态内容作为 中间件功能 在最直接的用法中 根是 提供给该功能的请求得到满足 本地文件系统中相对于根目录的文件 请求的路径 const app

随机推荐