1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đo biên dạng chi tiết lớn bằng phương pháp ánh sáng cấu trúc

92 47 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Đo biên dạng chi tiết lớn bằng phương pháp ánh sáng cấu trúc Đo biên dạng chi tiết lớn bằng phương pháp ánh sáng cấu trúc Đo biên dạng chi tiết lớn bằng phương pháp ánh sáng cấu trúc luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ***************************** DƢƠNG HỒNG HÙNG ĐO BIÊN DẠNG CHI TIẾT LỚN BẰNG PHƢƠNG PHÁP ÁNH SÁNG CẤU TRÚC CHUYÊN NGÀNH: CƠ ĐIỆN TỬ LUẬN VĂN THẠC SĨ KHOA HỌC CHUYÊN NGÀNH: CƠ ĐIỆN TỬ NGƢỜI HƢỚNG DẪN KHOA HỌC PGS.TS NGUYỄN VĂN VINH LỜI CAM ĐOAN Tôi tên Dƣơng Hồng Hùng học viên cao học lớp 15BCDT.KH khóa 2015B Chuyên ngành: Cơ điện tử Đề tài: Đo biên dạng chi tiết lớn phƣơng pháp ánh sáng cấu trúc Giáo viên hƣớng dẫn: PGS.TS Nguyễn Văn Vinh Tôi xin cam đoan nghiên cứu, thực nghiệm luận văn tác giả thực LỜI CẢM ƠN Sau sáu tháng nghiên cứu, làm việc khẩn trƣơng, đƣợc động viên, giúp đỡ hƣớng dẫn tận tình thầy giáo hƣớng dẫn PGS.TS Nguyễn Văn Vinh, luận văn “Đo biên dạng chi tiết lớn phương pháp ánh sáng cấu trúc” Tôi xin bày tỏ lòng biết ơn sâu sắc : Thầy PGS.TS Nguyễn Văn Vinh tận tình dẫn giúp đỡ tơi hồn thành luận văn Các thầy giáo, giáo thuộc mơn Cơ Khí Chính Xác & Quang Học trƣờng Đại học Bách Khoa Hà Nội giúp đỡ tơi suốt q trình học tập nhƣ trình nghiên cứu thực luận văn Tơi xin gửi lời cảm ơn tới tồn thể đồng nghiệp, bạn bè, gia đình ngƣời thân quan tâm, động viên giúp đỡ suốt trình học tập Học viên Dƣơng Hồng Hùng MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN DANH MỤC HÌNH ẢNH .7 DANH MỤC BẢNG BIỂU DANH MỤC TỪ VIẾT TẮT PHẦN MỞ ĐẦU .1 Tính cấp thiết đề tài Ý nghĩa khoa học ý nghĩa thực tiễn đề tài Mục đích nghiên cứu đề tài .2 Phƣơng pháp nghiên cứu đề tài .2 Nội dung nghiên cứu đề tài .2 CHƢƠNG TỔNG QUAN VỀ PHƢƠNG PHÁP ĐO BẰNG PHƢƠNG PHÁP ÁNH SÁNG CẤU TRÚC 1.1 Phƣơng pháp đo biên dạng 3D sử dụng ánh sáng cấu trúc 1.1.1 Mục đích đo biên dạng 3D vật thể 1.1.2 Định nghĩa phƣơng pháp quét ánh sáng cấu trúc 1.1.3 Phƣơng pháp ánh sáng cấu trúc mã hóa Gray .8 1.2 Áp dụng đo ánh sáng cấu trúc vào đo quét vật thể lớn 13 1.2.1 Khái niệm vật thể lớn 13 1.2.2 Những khó khăn đo quét vật thể lớn 13 1.2.3 Phƣơng án xử lý để quét đƣợc toàn vật thể lớn 14 CHƢƠNG THUẬT TOÁN GHÉP ĐÁM MÂY ĐIỂM 17 2.1 Thuật toán xử lý ghép nối đám mây điểm 17 2.1.1 Giới thiệu thuật toán Iterative Closest Point (ICP) 17 2.1.2 Thuật toán ICP 18 2.1.3 Định nghĩa điểm tƣơng đồng 21 2.2 Những vấn đề gặp phải sử dụng ICP phƣơng án xử lý .22 2.2.1 Vấn đề gặp phải sử dụng ICP 22 2.2.2 Phƣơng pháp xử lý khắc phục nhƣợc điểm thuật toán ICP 23 2.3 Các thuật toán nâng cao chất lƣợng tốc độ ghép đám mây điểm 24 2.3.1 Các bƣớc thuật tốn ghép thơ sử dụng thuật tốn đồng đám mây điểm SAC-IA 24 2.3.2 Xác định đặc tính đám mây điểm với thuật tốn biểu đồ điểm đặc trƣng có tối ƣu FPFH 24 2.3.3 Thuật toán đồng đám mây điểm SAC – IA [1] .30 2.3 Một số thuật toán tiền xử lý giúp tăng tốc độ ghép vật 33 2.3.1 Lọc nhiễu đám mây điểm trƣớc ghép .33 2.3.2 Thuật toán giảm mật độ đám mây điểm – Voxel Grid 34 2.4 Xây dựng chƣơng trình ghép đám mây điểm sử dụng thuật tốn ICP 35 2.4.1 Các thƣ viện đƣợc sử dụng chƣơng trình 35 2.4.2 Xây dựng sơ đồ khối chƣơng trình ghép 37 2.4.3 Xây dựng sơ đồ khối nhập liệu đám mây điểm 40 2.4.4 Sơ đồ khối lọc giảm mật độ đám mây điểm .41 2.4.5 Sơ đồ ghép thô sử dụng SAC-IA FPFH .42 2.4.6 Xây dựng cấu trúc mã nguồn cho chƣơng trình ghép .44 2.4.7 Khối lọc đám mây điểm 45 2.4.8 Khối hiển thị đám mây điểm 49 2.4.9 Khối ghép nối đám mây điểm 50 2.4.10 Khối nhập xuất đám mây điểm 51 CHƢƠNG KẾT QUẢ QUÁ TRÌNH THỰC NGHIỆM 54 3.1 Kết thực nghiệm số chi tiết .54 3.2 Kết luận 61 KẾT LUẬN 63 TÀI LIỆU THAM KHẢO 64 PHỤ LỤC 65 Lớp CloudAlignment .65 Lớp CloudFilters 72 Lớp CloudUtils 73 Lớp CloudVisualizer 80 DANH MỤC HÌNH ẢNH CHƢƠNG Hình 1.1: Máy quét Blue White Lighting Hình 1.2: Máy đo Einscan-Pro 3D .6 Hình 1.3: Hình ảnh thiết bị quét sử dụng ánh sáng cấu trúc để quét vật Hình 1.4: Sơ đồ bố trí hệ quét ánh sáng cấu trúc Hình 1.5: Sơ đồ biểu diễn thuật tốn mã hóa xám với n = bit Hình 1.6: Bộ vân chiếu tạo từ thuật tốn mã hóa Gray Hình 1.7: Mã hóa điểm ảnh thu từ máy chiếu chiếu xuống vật thể 10 Hình 1.8: Sơ đồ tìm tọa độ thực điểm đối tượng phương pháp tam giác lượng –đường giao đường 11 Hình 1.9: Hai đường thẳng chéo không gian 12 Hình 1.10:Phạm vi qt máy đo khơng qt hết vật thể .13 Hình 1.11: Khơi phục lại vật thể từ kết quét vị trí khác 14 Hình 1.12: Tìm điểm tương đồng hai đám mây điểm 14 Hình 1.13: Ví dụ hai đám mây điểm chụp vật thể hai vị trí khác 15 Hình 1.14: Sau áp dụng thuật tốn ghép nối ICP ta thu đám mây điểm đồng hoàn chỉnh 16 Hình 1.15: Sơ đồ ghép nối cặp điểm 16 CHƢƠNG Hình 2.1: Sơ đồ ghép hai đám mây điểm (sơ đồ cho lần lặp) 19 Hình 2.2: Lưu đồ thuật tốn chương trình ICP .20 Hình 2.3: Các điểm tương đồng hai đám mây điểm 21 Hình 2.4: Quá trình tìm điểm thấp mặt phẳng bị sai vấn đề 22 Hình 2.5: Hình ảnh vector pháp tuyến bề mặt đám mây điểm 26 Hình 2.6: Biểu đồ vùng tính tốn đặc tính FPH Điểm truy vấn (đỏ) k – điểm lân cận màu xám nối với thành lưới 28 Hình 2.7: Biểu đồ tính tốn đặc tính Fast Point Feature Histogram .29 Hình 2.8: Sơ đồ thuật tốn đồng đám mây điểm SAC-IA 32 Hình 2.9: Quá trình giảm mật độ đám mây điểm sử dụng phương pháp voxel grid 34 Hình 2.10: Các thư viện sử dụng luận văn .37 Hình 2.11: Sơ đồ chƣơng trình ghép vật 38 Hình 2.12: Lưu đồ chương trình nạp liệu đám mây điểm 40 Hình 2.13: Sơ đồ khối chương trình lọc tiền xử lý đám mây điểm 41 Hình 2.14: Sơ đồ khối ghép thô đám mây điểm 42 Hình 2.15: Lưu đồ giải thuật SAC-IA 43 Hình 2.16: Sơ đồ lớp sử dụng chương trình ghép 44 Hình 2.17: Sơ đồ hàm dùng khối lọc CloudAlignment .45 Hình 2.18: Đám mây điểm trước áp dụng lọc .46 Hình 2.19: Đám mây điểm sau dùng lọc .47 Hình 2.20: Đám mây điểm trước thực giảm mật độ điểm 48 Hình 2.21: Đám mây điểm sau thực giảm mật độ đám mây điểm .48 Hình 2.22: Các hàm sử dụng khối hiển thị .49 Hình 2.23: Các hàm sử dụng khối ghép nối 50 Hình 2.24: Các hàm sử dụng khối nhập xuất liệu .52 CHƢƠNG Hình 3.1: Hình ảnh chi tiết khí chọn làm thực nghiệm .54 Hình 3.2: Kết quét hai chi tiết cần ghép 55 Hình 3.3: Vị trí hai đám mây điểm trước thực chương trình ghép nối .55 Hình 3.4: Hình ảnh hai đám mây điểm sau thực ghép nối 56 Hình 3.5: Hình ảnh thực tế chi tiết dạng tròn xoay chọn làm thực nghiệm 57 Hình 3.6: Kết quét chi tiết hai vị trí khác chưa ghép nối 57 Hình 3.7: Vị trí hai đám mây điểm trước thực ghép nối 58 Hình 3.8: Kết sau thực chạy chương trình ghép nối 58 Hình 3.9: Hai đám mây điểm chọn ngẫu nhiên để kiểm tra chương trình .59 Hình 3.10: Vị trí hai đám mây điểm trước thực ghép nối 60 Hình 3.11: Hai đám mây điểm sau sử dụng với chương trình ghép nối .60 DANH MỤC BẢNG BIỂU Bảng 3.1: Bảng số liệu so sánh kết ghép vật với chi tiết 56 Bảng 3.2: Bảng số liệu so sánh kết ghép vật với chi tiết dạng trục bậc 59 Bảng 3.3: Bảng số liệu so sánh kết ghép vật với mẫu tượng thỏ 61 DANH MỤC TỪ VIẾT TẮT Ý nghĩa Từ viết tắt SAC-IA Sample Consesus Initial Alignment - Đồng đám mây điểm PCL Point cloud library ICP Iterative Closet Point FPFH Fast Point Feature Histogram – Biểu đồ điểm đặc trƣng có tối ƣu PFH Point Feature Histogram – Biểu đồ điểm đặc trƣng VTK Visualization Toolkit pcl::console::print_highlight ("Estimating done!\n"); return true; } bool CloudAlignment::estimateFeaturesCloud(PointCloudPtr objectCloud, PointCloudNT::Ptr objectNormalVector, FeatureCloudT::Ptr objectFeatures) { if (objectCloud->empty()) { icp_loge("Pointcloud input is empty\n"); return false; } else if (objectNormalVector->empty()) { icp_loge("Normal Vector of point cloud was empty\n"); return false; } else { pcl::console::print_highlight ("Estimating features \n"); } // Using fast point feature histogram FeatureEstimationT featureEstimation; pcl::search::KdTree::Ptr treeSearch (new pcl::search::KdTree); featureEstimation.setSearchMethod(treeSearch); featureEstimation.setRadiusSearch (FEATURE_RADIUS_SEARCH); featureEstimation.setInputCloud (objectCloud); 68 featureEstimation.setInputNormals (objectNormalVector); featureEstimation.compute (*objectFeatures); return true; } bool CloudAlignment::roughAlignCloud(PointCloudPtr sourceCloud, PointCloudPtr targetCloud, PointCloudPtr objectAligned ) { if (sourceCloud->empty()) { pcl::console::print_error("Source point cloud is empty\n"); return false; } else if (targetCloud->empty()) { pcl::console::print_error("Target point cloud is empty\n"); return false; } else { pcl::console::print_highlight("Estimating feature \n"); } // Find the normal vector PointCloudNT::Ptr sourceCloudNormal (new PointCloudNT); PointCloudNT::Ptr targetCloudNormal (new PointCloudNT); findNormalVectorCloud(sourceCloud, sourceCloudNormal); findNormalVectorCloud(targetCloud, targetCloudNormal); 69 CloudVisualizer::showCloudWithNormalVector(sourceCloud, sourceCloudNormal); CloudVisualizer::showCloudWithNormalVector(targetCloud, targetCloudNormal); // Estimate features FeatureCloudT::Ptr sourceCloudFeatures (new FeatureCloudT); FeatureCloudT::Ptr targetCloudFeatures (new FeatureCloudT); estimateFeaturesCloud(sourceCloud, sourceCloudNormal, sourceCloudFeatures); estimateFeaturesCloud(targetCloud, targetCloudNormal, targetCloudFeatures); // Perform alignment pcl::console::print_highlight ("Starting alignment \n"); pcl::SampleConsensusInitialAlignment align_SAC_IA; align_SAC_IA.setNumberOfSamples (icpInfo.numberOfSampleSAC); align_SAC_IA.setMinSampleDistance (icpInfo.minSampleDistSAC); align_SAC_IA.setCorrespondenceRandomness (icpInfo.corresRandomSAC); align_SAC_IA.setMaxCorrespondenceDistance (icpInfo.maxCorresDistSAC); align_SAC_IA.setMaximumIterations (icpInfo.maxIterationSAC); align_SAC_IA.setInputSource (sourceCloud); align_SAC_IA.setInputTarget (targetCloud); align_SAC_IA.setSourceFeatures (sourceCloudFeatures); align_SAC_IA.setTargetFeatures (targetCloudFeatures); { align_SAC_IA.align (*objectAligned); } if (align_SAC_IA.hasConverged ()) 70 { // Print results Eigen::Matrix4d transformation = align_SAC_IA.getFinalTransformation().cast(); print4x4Matrix(transformation); // Show alignment pcl::visualization::PCLVisualizer visu("Rough Alignment"); visu.addPointCloud (targetCloud, ColorHandlerT (targetCloud, 0.0, 255.0, 0.0), "targetCloud"); visu.addPointCloud (objectAligned, ColorHandlerT (objectAligned, 0.0, 0.0, 255.0), "object_aligned"); visu.spin (); } else { pcl::console::print_error ("Alignment failed!\n"); return false; } return true; } void CloudAlignment::print4x4Matrix (const Eigen::Matrix4d & matrix) { printf ("Rotation matrix :\n"); printf (" | %6.3f %6.3f %6.3f | \n", matrix (0, 0), matrix (0, 1), matrix (0, 2)); printf ("R = | %6.3f %6.3f %6.3f | \n", matrix (1, 0), matrix (1, 1), matrix (1, 2)); 71 printf (" | %6.3f %6.3f %6.3f | \n", matrix (2, 0), matrix (2, 1), matrix (2, 2)); printf ("Translation vector :\n"); printf ("t = [%6.3f, %6.3f, %6.3f]\n\n", matrix (0, 3), matrix (1, 3), matrix (2, 3)); } Lớp CloudFilters bool CloudFilters::statisticalFilter(PointCloudPtr objectCloud) { // Create the filtering object pcl::StatisticalOutlierRemoval stasticFilter; stasticFilter.setInputCloud (cloud); stasticFilter.setMeanK (50); stasticFilter.setStddevMulThresh (1.0); stasticFilter.filter (*objectCloud); } bool CloudFilters::downSampleCloud(PointCloudPtr pointCloud, PointCloudPtr cloudWasDownsampled, float leafSize) { if(pointCloud->empty()) { icp_loge("Point cloud input is empty\n"); return false; } PCL_INFO("Point sizes = %d\n", pointCloud->size()); pcl::VoxelGrid gridDownsample; gridDownsample.setInputCloud(pointCloud); gridDownsample.setLeafSize(leafSize, leafSize, leafSize ); 72 gridDownsample.filter(*cloudWasDownsampled); PCL_INFO ("Subsampled to %d points.\n", cloudWasDownsampled->size()); return true; } PointCloudT CloudFilters::removeNANPoints(PointCloudT pointCloud) { PointCloudT outputCloud; std::vector index; pcl::removeNaNFromPointCloud(pointCloud, outputCloud, index); return outputCloud; } Lớp CloudUtils bool CloudUtils::loadPointCloud(std::string fileName, PointCloudPtr pCloud) { CloudFormat fileFormat = checkCloudFormat(fileName); PointCloudT::Ptr temporayCloud (new PointCloudT); if (fileFormat == PLY_FORMAT) { if(pcl::io::loadPLYFile(fileName, *temporayCloud) < 0) { icp_loge ("Couldn't load PLY format point cloud \n"); return false; } } else if (fileFormat == PCD_FORMAT) { if(pcl::io::loadPCDFile(fileName, *temporayCloud) < 0) { 73 icp_loge ("Couldn't load PCD format point cloud \n"); return false; } } else { icp_loge("Unknown file format\n"); return false; } *pCloud = CloudFilters::removeNANPoints(*temporayCloud); #ifdef _DOWNSAMPLE_ double leafSize = static_cast(CloudUtils::parseOneParameter("DOWNSAMPLE_LEAF_ SIZE")); PointCloudPtr sampledCloud (new PointCloudT); *sampledCloud = *pCloud; if(leafSize > 0) { CloudFilters::downSampleCloud(sampledCloud, pCloud, leafSize); } else { pcl::console::print_highlight("Cannot get the downsample leaf size from config file\n"); } #endif return true; } 74 CloudFormat CloudUtils::checkCloudFormat(const std::string &fileName) { int fileFormatPosition = fileName.find_last_of(".") + 1; std::string fileFormat = fileName.substr(fileFormatPosition); if(fileFormat == "ply") { return PLY_FORMAT; } else if (fileFormat == "pcd") { return PCD_FORMAT; } else { icp_loge("Undefinded file extension\n"); return UNKNOW_FORMAT; } } bool CloudUtils::isConfigFileFormatValid(const std::string &fileName) { int fileFormatPosition = fileName.find_last_of(".") + 1; std::string fileFormat = fileName.substr(fileFormatPosition); if(fileFormat == "yaml") { return true; } else { icp_loge("Undefinded file config extension\n"); 75 return false; } } bool CloudUtils::fileIsExisted(const std::string &fileName) { struct stat buffer; return (stat (fileName.c_str(), &buffer) == 0); } bool CloudUtils::checkConfigFileContent() { cv::FileStorage configFileStream; if(CloudUtils::fileIsExisted(FILE_CONFIG_PATH) && CloudUtils::isConfigFileFormatValid(FILE_CONFIG_PATH)) { return true; } else { pcl::console::print_info("File config does not existed so need create new \n"); configFileStream.open(FILE_CONFIG_PATH, cv::FileStorage::WRITE); if (!configFileStream.isOpened()) { pcl::console::print_error("Failed to create config file \n"); return false; } else 76 { // Create init config values configFileStream

Ngày đăng: 11/02/2021, 19:58

Xem thêm:

TỪ KHÓA LIÊN QUAN

Mục lục

    CHƯƠNG 1 TỔNG QUAN VỀ PHƯƠNG PHÁP ĐO BẰNG PHƯƠNG PHÁP ÁNH SÁNG CẤU TRÚC

    CHƯƠNG 2 THUẬT TOÁN GHÉP ĐÁM MÂY ĐIỂM

    CHƯƠNG 3 KẾT QUẢ QUÁ TRÌNH THỰC NGHIỆM

    TÀI LIỆU THAM KHẢO

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w