algoLib/sourceCode/rodAndBarDetection_Export.h
jerryzeng 6674c32adc rodAndBarDetection
version 1.6.0 : 矩森棒材抓取算法改进:添加了料筐信息提取和对边缘工件的判断
2026-08-30 09:43:29 +08:00

146 lines
4.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "SG_algo_Export.h"
#include <vector>
#define _OUTPUT_DEBUG_DATA 1
typedef struct
{
SVzNL3DPoint center; //螺杆端部中心点
SVzNL3DPoint axialDir; //轴向向量
}SSX_rodPoseInfo; //
typedef struct
{
SVzNL3DPoint center; //螺杆端部中心点
SVzNL3DPoint xDir;
SVzNL3DPoint yDir;
SVzNL3DPoint normalDir; //法向向量
SVzNL3DPoint holeLT;
SVzNL3DPoint holeRB;
}SSX_platePoseInfo; //
typedef struct
{
double diameter;
double len;
}SSX_rodParam; //棒材信息
typedef struct
{
int id; //序号从1开始
int workpieceType; //0:中央; 1-上边; 2-下边; 3-左边; 4-右边; 5-左上角; 6-右上角; 7-左下角; 8-右下角;
SVzNL3DPoint center; //螺杆端部中心点
SVzNL3DPoint axialDir; //轴向向量
SVzNL3DPoint normalDir; //法向量
SVzNL3DPoint startPt;
SVzNL3DPoint endPt;
}SSX_rodPositionInfo;
typedef enum
{
KeWD_WELD_CATEGORY_UNKNOWN = 0,
KeWD_WELD_CATEGPRY_I, //焊接类型1:每根钢筋都有支点
KeWD_WELD_CATEGPRY_II, //焊接类型2:交叉钢筋上面的钢筋有支点
}EWD_weldingCategory;
typedef enum
{
KeWD_WELD_UNKNOWN = 0,
KeWD_WELD_POINT, //焊点
KeWD_WELD_SEAM, //焊缝
KeWD_WELD_SEAM_GAP, //焊缝,有缝隙
}EWD_weldType;
typedef struct
{
EWD_weldType weldType;
SVzNL3DPoint startPt;
SVzNL3DPoint endPt;
SVzNL3DPoint center;
SVzNL3DPoint axialDir;
SVzNL3DPoint normalDir; //法向量
std::vector< SVzNL3DPoint> centerPts;
std::vector< SVzNL3DPoint> edgePts_0;
std::vector< SVzNL3DPoint> edgePts_1;
}SSX_weldSeamInfo;
//读版本号
SG_APISHARED_EXPORT const char* wd_rodAndBarDetectionVersion(void);
//计算一个平面调平参数。
//数据输入中可以有一个地平面和参考调平平面,以最高的平面进行调平
//旋转矩阵为调平参数,即将平面法向调整为垂直向量的参数
SG_APISHARED_EXPORT SSG_planeCalibPara sx_rodPosition_getBaseCalibPara(
std::vector< std::vector<SVzNL3DPosition>>& scanLines);
#if 1
//相机姿态调平,并去除地面
SG_APISHARED_EXPORT void sx_rodPosition_lineDataR(
std::vector< SVzNL3DPosition>& a_line,
const double* camPoseR,
double groundH);
#endif
//六角头螺杆端部中心点和轴向测量
SG_APISHARED_EXPORT void sx_hexHeadScrewMeasure(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
bool isHorizonScan, //true:激光线平行槽道;false:激光线垂直槽道
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
double rodDiameter,
std::vector<SSX_rodPoseInfo>& screwInfo,
int* errCode);
//PCA方法计算螺杆端部中心点位姿
//相对于sx_hexHeadScrewMeasure(),算法上(1)去除了水平段(2)使用PCA方法计算轴向
SG_APISHARED_EXPORT void sx_hexHeadScrewMeasure_PCA(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
//bool isHorizonScan, //true:激光线平行槽道;false:激光线垂直槽道
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
double rodDiameter,
std::vector<SSX_rodPoseInfo>& screwInfo,
int* errCode);
//计算定位盘中心点位姿
SG_APISHARED_EXPORT SSX_platePoseInfo sx_getLocationPlatePose(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_cornerParam cornerPara,
int* errCode);
//新的计算定位盘中心点位姿(去除了定位盘,只有定位板)
SG_APISHARED_EXPORT SSX_platePoseInfo sx_getLocationPlatePose_new(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_cornerParam cornerPara,
int* errCode);
//棒材抓取定位
SG_APISHARED_EXPORT void sx_rodPositioning(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_planeCalibPara poseCalibPara,
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
const SSX_rodParam rodParam,
const double distToSideRatio, //边距系数,边距门限=边距系数*工件直径;当工件距边的距离大于边距门限时,判断为边上的工件
const double groundRemoveOffset, //料筐地面去除的Z偏置,实际地面去除高度为 groundCalibPara.planeHeight - groundRemoveOffset
const double clusterNDist, //料筐聚类尺度, 当两点距离小于此尺度时, 被聚为一类。此参数和点云密度相关,用于滤除料筐周围的干扰。
std::vector<SSX_rodPositionInfo>& rodInfo,
SWD_BinInfo& binInfo, //输出Bin信息,用于debug,确认料筐信息检测正确
int* errCode);
//筑裕钢结构钢筋焊缝定位
SG_APISHARED_EXPORT void sx_rebarWeldSeamPositioning(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_planeCalibPara poseCalibPara,
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
const SSX_rodParam rodParam,
const SVzNLRangeD weldSeamRange, //焊缝距钢筋交叉点的范围(最小值和最大值)
EWD_weldingCategory weldCategory,
std::vector<SSX_weldSeamInfo>& weldSeamInfo,
int* errCode);