《點云庫pcl學習教程》第4章-輸入、輸出io_第1頁
已閱讀1頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章 輸入、輸出(IO),,PCL中所有的處理都是基于點云展開的,利用不同的設備獲取點云、存儲點云等都是點云處理前后必須做的流程,PCL中有自己設計的內部PCD文件格式,為此,設計讀寫該格式以及與其他3D文件格式之間進行轉化的接口類都是很必要的,目前PCL內部支持對常用的3D格式文件的打開和存儲操作,以及與PCD內部格式之間的互相轉化。本章首先對PCL中支持的點云獲取設備(如kinect)以及OpenNI開源框架作一個基本介紹,其次

2、對PCL中的I/O模塊及相關類進行簡單說明,最后通過應用實例來展示如何對PCL中I/O模塊進行靈活運用。,本章各小節(jié)目錄,4.1 I/O涉及的設備及相關概念簡介4.2 PCL中I/O模塊及類介紹4.3 應用實例解析,4.1 I/O涉及的設備及相關概念簡介,,4.1.1 OpenNI開源框架OpenNI(開放式自然交互)來源于由業(yè)界領導的一個非營利性組織,創(chuàng)建于2010年11月,專注于提高和改善自然交互設備與應用軟件的互操作能力。

3、其官方網站于12月8號正式公開,主要成員之一是PrimeSense公司(Kinect的核心芯片正是由這家公司提供),其他成員還包括開發(fā)ROS的機器人公司Willow Garage,以及游戲公司Side-Kick等。OpenNI是一個多語言、跨平臺的框架,它定義了一套用于編寫通用自然交互應用的API。OpenNI的主要目的就是形成標準的API,便于下面兩個接口之間進行通信:(1)視覺和音頻傳感器(用來感知周圍環(huán)境信息)。,(2)視覺和

4、音頻感知中間件(用來對應用場景中所記錄的音頻和視覺數據進行分析與理解,例如能夠接收一份可見的圖像數據并返回從中檢測到的手掌位置信息)。OpenNI提供了一組基于傳感器設備實現的API和另外一組由中間件組件實現的API,打破了傳感器和中間件之間的依賴關系。這樣,使用OpenNI API開發(fā)應用程序時就不需要在各種中間件模塊的上層操作上浪費時間,可以做到一次編寫、隨處部署。OpenNI的這種分層設計機制允許中間件開發(fā)者可以直接基于最原始的

5、數據格式編寫算法,而不管這些數據是由何種傳感器設備產生,同時也讓傳感器生產商制造的設備能用于任何OpenNI兼容的應用程序。OpenNI的這套標準化API使得自然交互應用開發(fā)人員,可以利用由傳感器輸入并計算過的數據類型,很方便地跟蹤處理現實生活中的場景(例如,可以是表示人體全身的數據,也可以是表示手的位置數據,或者僅僅是深度圖里面的一組像素等)。這樣可以保證編寫應用程序的時候,不用考慮傳感器或中間件供應商相關的細節(jié)。圖4-1展示了O

6、penNI框架的應用概念,分為三層:(1)應用層:基于OpenNI實現的自然交互應用軟件。(2)中間件接口層:代表OpenNI本身,提供了傳感器和中間件之間的交互接口。(3)硬件設備層:列出了捕捉視覺和音頻數據的多種硬件設備。,4.1.2 OpenNI兼容設備OpenNI目前已成為PCL集成進來的第一個設備相關的第三方庫,用來抓取OpenNI兼容設備中的點云數據。上節(jié)描述的OpenNI應用框架說明,只要底層的設備傳感器設備與O

7、penNI兼容,都可以作為點云數據輸入源,圖4-2則展示了目前流行的OpenNI兼容設備。其中,Primesense Reference Design、Microsoft Kinect和Asus XtionPro這3種攝像頭設備均進行了OpenNI兼容性測試。選擇其中任何一個設備進行點云數據采集,都可以經OpenNI處理后轉化為標準數據供上層應用使用。如今,OpenNI已成為微軟xbox360配件kinect在PC上的開源驅動中必須安

8、裝的一個API。,4.2 PCL中I/O模塊及類介紹,PCL中I/O庫提供了點云文件輸入輸出相關的操作類,并封裝了OpenNI兼容的設備源數據獲取接口,可直接從眾多感知設備獲取點云圖像等數據。I/O模塊利用21個類與28個函數實現了對點云的獲取、讀入、存儲等相關操作,其依賴于pcl_common和pcl_octree模塊以及OpenNI外部開發(fā)包。,4.2.1 I/O模塊中類以及全局函數說明I/O模塊中目前共有21個類,隨著RGDB

9、設備的流行必將引入更多的設備相關的I/O擴展,以后有可能增加以下幾類。1. class pcl::FileReader類FileReader定義了PCD文件的讀取接口,主要用做其他讀取類的父類。從它繼承的子類必須實現自己的讀取函數,即該類中的純虛函數其繼承關系如圖4-3所示。但為了保持向后兼容,提供了FILE_V6版本文件讀取的實現函數。,類FileReader關鍵成員函數:virtual intreadHeader(const

10、std::string& file_name, sensor_msgs::PointCloud2& cloud, Eigen::Vector4f& origin, Eigen::Quaternionf& orientation, int& file_version, int& data_type, unsigned int& data_idx, const int offset=0

11、)=0純虛函數,定義讀取點云文件頭的接口函數,其參數意義:file_name讀取文件的文件名。cloud存儲讀取后的點云數據,但只填充文件頭(關于PCD文件格式詳見本章后面實例分析)。origin點云獲取原點,該參數只有在文件版本大于FILE_V7才存在,否則為NULL。orientation點云獲取方向,該參數只有在文件版本大于FILE_V7才存在,否則為NULL。file_version文件版本(FILE_V7或者FIL

12、E_V6)。,data_type數據類型(二進制置為1,ASCII碼置為0)。data_idx數據偏移文件頭末尾的偏移量。offset文件頭偏移文件開始的偏移量。virtual int read(const std::string&file_name, sensor_msgs::PointCloud2& cloud, Eigen::Vector4f& origin, Eigen::Quaternionf&a

13、mp; orientation, int& file_version, const int offset=0)=0為純虛函數,定義讀取文件數據的接口函數,讀取文件中的點云數據存儲到cloud對象中,其他參數同上函數。int read(const std::string &file_name, sensor_msgs::PointCloud2& cloud, const int offset = 0)功能同上

14、函數(僅適用于FILE_V6版本文件獲取,因為sensor_msgs::PointCloud2不包含傳感器原點和方向數據,若讀取高版本數據會產生警告信息)。,templateint read(const std::string& file_name, pcl::PointCloud& cloud, const int offset=0)功能同上函數,只是帶有模板參數的成員函數。2. class pcl::FileW

15、riter類FileWriter與FileReader對應,是寫入PCD文件的類接口定義,可以作為其他寫入類的父類。從它繼承的子類必須實現自己的寫入函數,即該類中的純虛函數,其繼承關系如圖4-4所示。,類FileWriter關鍵成員函數:virtual int write(const std::string& file_name, const sensor_msgs::PointCloud2& cloud, cons

16、t Eigen::Vector4f& origin=Eigen::Vector4f::Zero(), const Eigen::Quaternionf& orientation=Eigen::Quaternionf::Identity(), const bool binary=false)=0;點云寫入到對應文件的純虛函數接口定義,其參數意義:file_name寫入文件的文件名。cloud需要寫入的點云對象。or

17、igin寫入文件頭的點云獲取原點,默認為(0, 0, 0, 0)。orientation寫入文件頭的點云獲取方向。binary設置寫入時的類型(true為二進制,false為ASCII碼,默認為ASCII碼)。,templateintwrite(const std::string& file_name, const pcl::PointCloud& cloud, const bool binary=false)功

18、能同上函數,只是添加了模板參數的模板成員函數。3. class pcl::Grabber類Grabber為PCL1.X對應的設備驅動接口的基類定義,繼承關系如圖4-5所示。,類Grabber關鍵成員函數:templateboost::signals2::connectionregisterCallback(const boost::function& callback)提供回調函數指針,當獲取每幀圖像或點云數據時都會啟

19、動回調函數:templatebool providesCallback() const判斷是否提供回調函數:virtual void start()=0啟動設備,開始傳輸數據流:virtual void stop()=0停止設備上的數據流傳輸:virtual std::string getName() const = 0,返回明確的子類名字:virtual bool isRunning() const = 0判斷是否

20、在傳輸數據流:virtual float getFramesPerSecond() const = 0獲取FPS幀率,即每秒多少幀數據。4. class openni_wrapper::OpenNIDevice類OpenNIDevice定義OpenNI設備的基類,繼承該基類可以實現不同的OpenNI設備子類,用于獲取包括紅外數據、RGB數據、深度圖像數據等。繼承關系如圖4-6所示,目前包括如下設備Primesense PSDK,

21、Microsoft Kinect,Asus Xtion Pro/Live。,類OpenNIDevice關鍵成員函數:bool findCompatibleImageMode(const XnMapOutputMode& output_mode, XnMapOutputMode& mode)const throw()查詢是否有與output_mode對應的圖像模式匹配的輸出模式,如果有則返回true并且存儲兼容模式在m

22、ode中,否返回值為false。例如設備支持30Hz的VGA模式,而請求輸出為30Hz的QVGA模式則通過下采樣是可以兼容的,但是設備支持25Hz的VGA而請求為30Hz的SXGA就不兼容。bool findCompatibleDepthMode(const XnMapOutputMode& output_mode, XnMapOutputMode& mode)const throw()功能和參數同上,只是針對深度圖

23、像的模式,并非上述彩色圖像的模式。bool isImageModeSupported(const XnMapOutputMode& output_mode) const throw(),只判斷是否支持該output_mode所給定的圖像模式,支持返回true,否則返回false。bool isDepthModeSupported(const XnMapOutputMode& output_mode) const th

24、row()只判斷是否支持該output_mode所給定的深度圖像模式,支持返回true,否則返回false。const XnMapOutputMode& getDefaultImageMode() const throw()const XnMapOutputMode& getDefaultDepthMode() const throw()const XnMapOutputMode& getDefaultI

25、RMode() const throw()以上三個函數分別是獲取默認的RGB、深度、紅外圖像的輸出模式。void setImageOutputMode(const XnMapOutputMode& output_mode),void setDepthOutputMode(const XnMapOutputMode& output_mode)void setIROutputMode(const XnMapOutput

26、Mode& output_mode)以上三個函數分別是設置RGB、深度、紅外圖像的輸出模式。XnMapOutputMode getImageOutputMode() constXnMapOutputMode getDepthOutputMode() constXnMapOutputMode getIROutputMode() const以上三個函數分別是獲取當前的RGB、深度、紅外圖像的輸出模式。void setDe

27、pthRegistration(bool on_off)設置深度圖像是否與RGB圖像對齊。bool isDepthRegistrationSupported() const throw()判斷設備是否支持深度圖像與RGB圖像對齊void setSynchronization(bool on_off),設置設備是否同步輸出RGB和深度圖像。bool isSynchronized() const throw()判斷設備是否同步輸

28、出RGB和深度圖像,如果是返回true,否則返回false。bool isSynchronizationSupported() const throw()判斷設備是否支持同步輸出RGB和深度圖像。bool isDepthCropped() const返回深度圖像是否被裁剪過,是為true,否則為false。void setDepthCropping(unsigned x, unsigned y, unsigned width,

29、 unsigned height)打開深度圖像的裁剪,x、y分別為兩個方向上的起始裁剪位置,width和height分別為保留的x與y方向上的尺寸。float getImageFocalLength(int output_x_resolution=0) const throw(),獲取RGB圖像的焦距長度(像素)。float getDepthFocalLength(int output_x_resolution=0) const

30、throw()獲取深度圖像的焦距長度(像素)。float getBaseline() const throw()獲取基線長度。virtual void startImageStream()virtual void stopImageStream()上面一對函數為啟動和停止RGB數據流的采集。virtual void startDepthStream()virtual void stopDepthStream()上面一對

31、函數為啟動和停止深度數據流的采集。virtual void startIRStream()virtual void stopIRStream(),上面一對函數為啟動和停止紅外數據流的采集。bool hasImageStream() const throw()bool hasDepthStream() const throw()bool hasIRStream() const throw()以上三個函數分別判斷設備是否支持RG

32、B、深度、紅外圖像數據采集,如果是返回true,否則返回false。virtual bool isImageStreamRunning() const throw()virtual bool isDepthStreamRunning() const throw()virtual bool isIRStreamRunning() const throw()以上三個函數分別判斷設備是否正在進行RGB、深度、紅外圖像數據采集。Cal

33、lbackHandle registerImageCallback(const ImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregisterImageCallback(const CallbackHandle& callbackHandle) throw(),上面一對函數分別為RGB圖像數據流的回調函數注冊與注銷。Callback

34、Handle registerDepthCallback(const DepthImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregisterDepthCallback(const CallbackHandle& callbackHandle) throw()上面一對函數分別為深度圖像數據流的回調函數注冊與注銷。CallbackH

35、andle registerIRCallback(const IRImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregisterIRCallback(const CallbackHandle& callbackHandle)throw()上面一對函數分別為紅外圖像數據流的回調函數注冊與注銷。,const char* getSeria

36、lNumber() const throw()獲取設備對應的序列號,注意該返回值有可能為空字符串。const char* getConnectionString() const throw()獲取設備連接字符串,一般格式為vendorID/productID@BusID/DeviceID。const char* getVendorName() const throw()const char* getProductName()

37、const throw()unsigned short getVendorID() const throw()unsigned short getProductID() const throw()以上4個函數分別獲取廠商和產品的名字字符串及ID編號。unsigned char getBus() const throw()獲取設備所在的USB總線。,unsigned char getAddress() const throw()

38、獲取設備所在USB地址。void setRGBFocalLength(float focal_length)void setDepthFocalLength(float focal_length)以上兩個函數分別設定RGB與深度圖像獲取時的焦距大小。5. class openni_wrapper::DeviceKinect6. class openni_wrapper::DevicePrimesense7. class o

39、penni_wrapper::DeviceXtionPro以上3個類分別封裝了Kinect、Primesense、XtionPro相關設備操作和數據獲取操作實現,其詳細接口參考其父類OpenNIDevice的關鍵函數說明。8. Class openni_wrapper::DeviceONI,封裝了利用ONI文件回放虛擬類kinect設備的操作和數據獲取操作實現,其詳細接口參考其父類OpenNIDevice的關鍵函數說明。9. Cl

40、ass openni_wrapper::OpenNIDriver類OpenNIDriver采用單例模式實現對底層驅動的封裝,里面包含一xn::Context對象,提供給所有設備使用。該類提供了枚舉和訪問所有設備的方法實現。類OpenNIDevice關鍵成員函數:unsigned updateDeviceList()枚舉所有系統(tǒng)可以獲取的設備列表,返回獲取設備的數目。unsigned getNumberDevices() con

41、st throw()獲取系統(tǒng)可用設備的數目。,boost::shared_ptr createVirtualDevice(const std::string& path, bool repeat, bool stream) const從ONI文件創(chuàng)建一虛擬設備,其中path為ONI文件的路徑,repeat設置是否虛擬設備支持無限循環(huán)從ONI文件獲取數據,stream設置虛擬設備是支持數據流形式的數據獲取還是引發(fā)式的數據獲取。

42、boost::shared_ptr getDeviceByIndex(unsigned index) const返回一設備,index為給定的設備索引。boost::shared_ptr getDeviceBySerialNumber(const std::string& serial_number) const返回一設備,serial_number為給定的設備的序列號。boost::shared_ptr getDev

43、iceByAddress(unsigned char bus, unsigned char address) const,返回一設備,bus為USB設備總線號,address為USB設備地址。const char* getSerialNumber(unsigned index) const throw()獲取索引為index的設備序列號,但該設備未被創(chuàng)建。const char* getConnectionString(unsign

44、ed index) const throw()獲取索引為index的設備連接字符串,但該設備未被創(chuàng)建。void stopAll()停止所有設備。static OpenNIDriver& getInstance()為靜態(tài)成員函數,獲取唯一的設備實例。static void getDeviceType(const std::string&connection_string, unsigned short&

45、vendorId, unsigned short& productId);為靜態(tài)成員函數,獲取設備連接字符串存儲在connection_string,設備廠商及產品ID,存儲在,為靜態(tài)成員函數,獲取設備連接字符串存儲在connection_string,設備廠商及產品ID,存儲在vendorId、productId中。10. Class openni_wrapper::OpenNIException類OpenNIExcep

46、tion封裝一般的異常處理實現,其關鍵成員函數如下:virtual const char* what() const throw()返回異常消息字符串。const std::string &getFunctionName() const throw()返回發(fā)生異常的函數名。const std::string &getFileName() const throw()返回發(fā)生異常的文件名。unsigned ge

47、tLineNumber() const throw()返回發(fā)生異常的行號。,11. Class openni_wrapper::Image類Image是簡單的圖像數據封裝基類,其繼承關系如圖4-7所示。virtual bool isResizingSupported(unsigned input_width, unsigned input_height, unsigned output_width, unsigned ou

48、tput_height) const = 0純虛函數,具體實現見子類,判斷圖像是否支持尺寸變換,input_width、input_height為設定的寬度和高度,output_width、output_height變換后的寬度和高度。,virtual void fillRGB(unsigned width, unsigned height, unsigned char *rgb_buffer, unsigned rgb_line_s

49、tep=0) const = 0用RGB數據填充用戶給定的rgb_buffer,返回圖像的寬度和高度為width、height,隔rgb_line_step行輸出到輸出緩存中。virtual Encoding getEncoding() const = 0返回原始編碼的方式。void fillRaw(unsigned char *rgb_buffer) const throw()用原始數據填充用戶給定的rgb_buffer。

50、virtual void fillGrayscale(unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step=0)const = 0用灰度數據填充給定的gray_buffer,其他參數參考函數,fillRGB。unsigned getWidth() const throw()unsigned getHeight() c

51、onst throw()以上兩個函數分別獲取圖像寬度和高度。unsigned getFrameID() const throw()獲取幀的ID號。Unsigned longgetTimeStamp() const throw()獲取圖像的時間戳。const xn::ImageMetaData &getMetaData() const throw()獲取圖像原始OpenNI格式數據。12. Class openni

52、_wrapper::ImageBayerGRBG13. Class openni_wrapper::ImageRGB24,14. Class openni_wrapper::ImageYUV422以上3個類分別實現了對原始數據BayerGRBG、RGB24、YUV422到圖像轉化接口,詳細參考其父類關鍵函數說明。15. Class pcl::OpenNIGrabber類OpenNIGrabber實現對OpenNI設備(例如Pri

53、mesense PSDK,Microsoft Kinect,Asus XTion Pro/Live)數據的采集接口,詳細參考其父類Grabber關鍵函數說明。16. class pcl::PCDReader17. class pcl::PLYReader以上兩個類分別是PCD、PLY文件格式讀入接口的實現,詳細參考其父類pcl::FileReader。18. class pcl::PLYWriter19. Class pcl:

54、:PCDWriter以上兩個類分別是PCD、PLY文件格式寫出接口的實現,,詳細參考其父類pcl::FileWriter。20. Class pcl::PCLIOException類PCLIOException是I/O相關的異常處理接口實現,詳細參考其父類PCLException。,4.2.2 I/O模塊其他關鍵成員說明PCL_EXPORTS int pcl::io::saveOBJFile(const std::string

55、& file_name, const pcl::TextureMesh& tex_mesh, unsigned precision=5)該函數實現對TextureMesh保存到OBJ文件,file_name為OBJ文件名,tex_mesh為網格模型數據,precision為保存時的精度(默認為5)。PCL_EXPORTS int pcl::io::saveOBJFile(const std::string&

56、file_name, const pcl::PolygonMesh& mesh, unsigned precision=5)功能同上,存儲對象為PolygonMesh。int pcl::io::loadPCDFile(const std::string& file_name, sensor_msgs::PointCloud2& cloud),打開一版本V6.0的PCD文件,file_name為文件名,clou

57、d存儲讀入的點云數據。templateint pcl::io::loadPCDFile(const std::string& file_name, pcl::PointCloud& cloud)打開任何類型的PCD點云文件,file_name為文件名,cloud存儲讀入的點云數據。int pcl::io::savePCDFile(const std::string& file_name, const se

58、nsor_msgs::PointCloud2& cloud, constEigen::Vector4f& origin=Eigen::Vector4f::Zero(), const Eigen::Quaternionf& orientation=Eigen::Quaternionf::Identity(), const bool binary_mode=false)保存點云到PCD文件,file_name文件名

59、,cloud需要保存的點云數據,origin為獲取點云的原點,orientation為獲取點云的方向,binary_mode設置是否保存為二進,制格式,默認為false。templateint pcl::io::savePCDFile(const std::string& file_name, const pcl::PointCloud& cloud, bool binary_mode=false)保存點云到PCD

60、文件,file_name文件名,cloud需要保存的點云數據,binary_mode設置是否保存為二進制格式,默認為false。templateint pcl::io::savePCDFileASCII(const std::string& file_name, const pcl::PointCloud& cloud)以ASCII方式保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據。

61、templateint pcl::io::savePCDFileBinary(const std::string& file_name, const,pcl::PointCloud& cloud)以二進制方式保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據。void pcl::throwPCLIOException(const char function_name, const char

62、 file_name, unsigned line_number, const char format, …)異常處理函數,function_name發(fā)生異常的函數名,file_name發(fā)生異常的文件名,發(fā)生異常的行號line_number,發(fā)生異常的拋出消息format。templateint pcl::io::loadPLYFile(const std::string& file_name, pcl::PointClo

63、ud& cloud)打開ply文件,file_name文件名,cloud保存打開的點云數據。template,int pcl::io::savePLYFile(const std::string& file_name, const pcl::PointCloud& cloud, bool binary_mode=false)保存點云到PLY文件,file_name文件名,cloud需要保存的點云數據,bin

64、ary_mode設置是否保存為二進制格式,默認為false。templateint pcl::io::savePLYFileASCII(const std::string& file_name, const pcl::PointCloud& cloud)templateint pcl::io::savePLYFileBinary(const std::string& file_name, const pc

65、l::PointCloud& cloud)以上兩個函數分別以為ASCII和二進制方式保存點云到ply文件,file_name文件名,cloud需要保存的點云數據。PCL_EXPORTS int pcl::io::savePLYFile(const std::string&,file_name, const pcl::PolygonMesh& mesh, unsigned precision=5)保存Poly

66、gonMesh對象到PLY文件,file_name為PLY文件名,mesh為需要保存的對象數據,precision為保存精度(默認為5)。CL_EXPORTS void pcl::io::saveRgbPNGFile(const std::string &file_name, const unsigned char rgb_image, int width, int height)保存RGB數據為PNG文件,file_nam

67、e為PNG文件名,rgb_image為RGB數據,width、height為圖像數據的寬度和高度。PCL_EXPORTS void pcl::io::saveMonoPNGFile(const std::string& file_name, const unsigned char mono_image, int width, int height)功能同上,只是保存的數據為灰度圖像格式。PCL_EXPORTS void p

68、cl::io::saveShortPNGFile(const std::string& file_name, const unsigned short short_image, int width, int,height)功能同上,只是保存的數據為16位灰度圖像格式。templatevoid pcl::io::savePNGFile(const std::string& file_name, const pcl::

69、PointCloud& cloud)保存點云中RGB域為png文件,cloud為包含RGB域的點云對象,file_name為png文件名。PCL_EXPORTS int pcl::io::saveVTKFile(const std::string& file_name, const pcl::PolygonMesh& triangles, unsigned precision=5)保存PolygonMesh

70、對象數據為VTK文件,file_name為VTK文件名,triangles為需要保存的數據,precision為保存精度(默認為5)。,4.3 應用實例解析,,4.3.1 PCD(點云數據)文件格式本小節(jié)描述PCD(點云數據)文件格式,及其他在點云庫(PCL)中應用的方法。1. 為什么用一種新的文件格式?PCD文件格式并非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論