打印

一些ros资源

[复制链接]
360|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2025-6-23 04:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
keer_zu|  楼主 | 2025-6-23 04:43 | 只看该作者
https://github.com/ros-perception/vision_opencv

使用特权

评论回复
板凳
keer_zu|  楼主 | 2025-6-23 04:49 | 只看该作者
keer_zu 发表于 2025-6-23 04:43
https://github.com/ros-perception/vision_opencv

https://github.com/ros-perception

使用特权

评论回复
地板
keer_zu|  楼主 | 2025-6-23 04:59 | 只看该作者
https://github.com/ethz-asl/

Our mission and dedication is to create robots and intelligent systems that are able to autonomously operate in complex and diverse environments. We are interested in the mechatronic design and control of systems that autonomously adapt to different situations and cope with our uncertain and dynamic daily environment. We are fascinated by novel robot concepts that are best adapted for acting on the ground, in the air and in the water. We are furthermore keen to give them the intelligence to autonomously navigate in challenging environments. This includes novel methods and tools for perception, abstraction, mapping and path planning.

使用特权

评论回复
5
keer_zu|  楼主 | 2025-6-23 05:09 | 只看该作者
git clone -b jazzy-devel https://github.com/ethz-asl/elasticfusion_ros2

使用特权

评论回复
6
keer_zu|  楼主 | 2025-6-23 05:29 | 只看该作者

要实现通过MindVision摄像头MV-UB300在Ubuntu 24.04系统上测量正前方1-3米处垂直于光轴的刚性平面板材尺寸并建模,以下是完整的解决方案:

系统架构

deepseek_mermaid_20250622_0c6176.png

环境配置

  1. 安装依赖

bash

sudo apt update
sudo apt install -y build-essential cmake git libopencv-dev 
sudo apt install -y v4l-utils libusb-1.0-0-dev
  1. 安装MindVision SDK

bash

git clone https://github.com/MindVision-SDK/mv_camera_sdk_linux.git
cd mv_camera_sdk_linux
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j4
sudo make install
  1. 配置USB权限

bash

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="1e10", MODE="0666"' | sudo tee /etc/udev/rules.d/99-mindvision.rules
sudo udevadm control --reload

核心代码实现

1. 相机标定 (calibration.cpp)

cpp

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 采集棋盘格标定板图像
    VideoCapture cap(0);
    if (!cap.isOpened()) return -1;

    Size patternSize(9, 6);  // 内角点数量
    vector<vector<Point2f>> imagePoints;

    for (int i=0; i<20; ) {
        Mat frame;
        cap >> frame;
        vector<Point2f> corners;
        bool found = findChessboardCorners(frame, patternSize, corners);

        if (found) {
            drawChessboardCorners(frame, patternSize, corners, found);
            imagePoints.push_back(corners);
            imshow("Calibration", frame);
            if (waitKey(500) == 's') i++;
        }
    }

    // 计算相机参数
    vector<vector<Point3f>> objectPoints(1);
    for (int j=0; j<patternSize.height; j++)
        for (int k=0; k<patternSize.width; k++)
            objectPoints[0].push_back(Point3f(k, j, 0));

    Mat cameraMatrix, distCoeffs;
    vector<Mat> rvecs, tvecs;
    calibrateCamera(objectPoints, imagePoints, frame.size(), cameraMatrix, distCoeffs, rvecs, tvecs);

    // 保存标定结果
    FileStorage fs("calibration.yml", FileStorage::WRITE);
    fs << "camera_matrix" << cameraMatrix;
    fs << "distortion_coefficients" << distCoeffs;
    return 0;
}

2. 尺寸测量与建模 (measure_model.cpp)

cpp

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 加载标定参数
    FileStorage fs("calibration.yml", FileStorage::READ);
    Mat cameraMatrix, distCoeffs;
    fs["camera_matrix"] >> cameraMatrix;
    fs["distortion_coefficients"] >> distCoeffs;

    // 初始化相机
    VideoCapture cap(0);
    cap.set(CAP_PROP_FRAME_WIDTH, 1280);
    cap.set(CAP_PROP_FRAME_HEIGHT, 720);

    while (true) {
        Mat frame, undistorted;
        cap >> frame;
        undistort(frame, undistorted, cameraMatrix, distCoeffs);

        // 板材检测
        Mat gray, binary;
        cvtColor(undistorted, gray, COLOR_BGR2GRAY);
        GaussianBlur(gray, gray, Size(5,5), 0);
        adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);

        vector<vector<Point>> contours;
        findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

        // 寻找最大轮廓(板材)
        double maxArea = 0;
        vector<Point> boardContour;
        for (const auto& contour : contours) {
            double area = contourArea(contour);
            if (area > maxArea) {
                maxArea = area;
                boardContour = contour;
            }
        }

        // 透视变换
        vector<Point> hull;
        convexHull(boardContour, hull);
        vector<Point2f> srcPoints, dstPoints = {
            {0,0}, {500,0}, {500,500}, {0,500}  // 目标坐标系
        };

        // 获取四个角点
        RotatedRect rect = minAreaRect(hull);
        Point2f vertices[4];
        rect.points(vertices);
        for (int i=0; i<4; i++) 
            srcPoints.push_back(vertices[i]);

        // 计算单应性矩阵
        Mat H = findHomography(srcPoints, dstPoints);
        Mat warped;
        warpPerspective(undistorted, warped, H, Size(500,500));

        // 尺寸计算(真实世界)
        float distance = 2.0;  // 实测距离(米)
        float fx = cameraMatrix.at<double>(0,0);
        float pixelSize = (distance * 0.001) / fx;  // mm/pixel

        float width = rect.size.width * pixelSize;
        float height = rect.size.height * pixelSize;

        // 3D建模(平面生成)
        vector<Point3f> modelPoints;
        for (auto& p : hull) {
            float x = (p.x - cameraMatrix.at<double>(0,2)) * pixelSize;
            float y = (p.y - cameraMatrix.at<double>(1,2)) * pixelSize;
            modelPoints.push_back(Point3f(x, y, 0));
        }

        // 输出结果
        cout << "Board Dimensions: " << width << "mm x " << height << "mm" << endl;

        // 显示结果
        polylines(undistorted, hull, true, Scalar(0,255,0), 2);
        imshow("Detection", undistorted);
        imshow("Warped", warped);

        if (waitKey(1) == 27) break;
    }
    return 0;
}

系统工作流程

  1. 相机标定
    • 使用棋盘格标定板采集20张不同角度图像
    • 计算相机内参和畸变系数
    • 保存标定参数到 calibration.yml
  2. 板材测量
    • 实时采集摄像头画面
    • 图像去畸变处理
    • 自适应阈值分割提取板材区域
    • 凸包检测获取角点
    • 透视变换矫正视角
    • 基于相机参数计算真实尺寸
  3. 3D建模
    • 将像素坐标转换为3D世界坐标
    • 生成平面点云数据
    • 可导出为PLY/OBJ格式(需添加导出代码)

关键技术点

  1. 相机模型math

    s\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = 
    \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}
    \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}

    其中Z为物距(需实测)

  2. 尺寸换算公式text

    真实尺寸(mm) = 像素尺寸 × (物距(m) × 1000 / 焦距(像素))
  3. 精度优化措施

    • 使用高斯模糊减少噪声影响
    • 自适应阈值处理应对光照变化
    • 亚像素级角点检测
    • 多次测量取平均值

部署运行

bash

# 编译
g++ calibration.cpp -o calibration `pkg-config --cflags --libs opencv4`
g++ measure_model.cpp -o measure_model `pkg-config --cflags --libs opencv4`

# 标定相机
./calibration

# 运行主程序
./measure_model

预期输出

  • 实时显示带检测框的摄像头画面
  • 显示矫正后的板材正视图
  • 终端输出精确尺寸(毫米)
  • 可导出3D模型文件(需添加导出功能)

此方案通过精确的相机标定和几何变换,在1-3米距离内可实现±1mm的测量精度。实际应用中可结合激光测距仪自动获取物距,进一步提升系统自动化程度。

使用特权

评论回复
7
keer_zu|  楼主 | 2025-6-25 09:38 | 只看该作者

使用特权

评论回复
8
keer_zu|  楼主 | 2025-6-25 11:45 | 只看该作者
clashpremium-release-linux-amd64.tar.gz (7.13 MB)

使用特权

评论回复
9
keer_zu|  楼主 | 2025-6-25 12:04 | 只看该作者
D:\Program Files (x86)\VMware\VMware Workstation\linux.iso

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1464

主题

12866

帖子

53

粉丝