0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

VisionPro項目組成簡介

新機器視覺 ? 來源:新機器視覺 ? 2020-09-24 13:17 ? 次閱讀

一、腳本簡介

1.1VisionPro項目組成簡介

在介紹腳本之前先簡單介紹一下VisionPro開發(fā)環(huán)境(QuickBuild)的項目結(jié)構(gòu),Job是QuickBuild工程的基本組成單位,一個QucikBuild工程至少含有一個Job,工程中所有的Job是并行結(jié)構(gòu),各個Job之間不會相互影響。每個Job中默認(rèn)包含一個toolGroup,用戶可以在默認(rèn)的toolGroup中添加項目所需的工具和工具塊。工具塊(toolBlock)與工具組(toolGroup)都是工具的**“容器”**,通過使用工具塊與工具組可以將完成某一功能的工具進(jìn)行封裝,實現(xiàn)項目模塊化,同時亦可將某一特定功能的工具塊或工具組導(dǎo)出實現(xiàn)重復(fù)使用,類似于編程語言中“函數(shù)”功能。工具塊中亦可以包含工具塊與工具組,兩者之間的包含關(guān)系沒有明確層次關(guān)系。

1.2VisionPro腳本簡介


VisionPro工具封裝了視覺算法與用戶交互界面,toolGroup與toolBlock提供了組合工具的容器,但是并非所有的功能都能通過既定交互界面實現(xiàn)。為了讓用戶實現(xiàn)客制化功能更加“隨心所欲”,實現(xiàn)VisionPro本身無法實現(xiàn)的邏輯功能,VisionPro預(yù)留了腳本功能。腳本的類型、作用與支持語言如下圖所示:

二、腳本類與方法

VisionPro通過”多態(tài)”技術(shù)實現(xiàn)腳本功能,VisionPro 的每一Job、toolGroup、toolBlock對象都含有一個接口對象,用戶通過重寫接口方法實現(xiàn)自定義拓展功能。以toolGroup為例, ICogToolGroupScript接口中定義了子類中必須實現(xiàn)的函數(shù),當(dāng)toolGruoup執(zhí)行到某一節(jié)點(工具準(zhǔn)備運行、工具運行完成等)時會調(diào)用相應(yīng)的接口函數(shù)實現(xiàn)用戶指定的功能。


如果你對接口、多態(tài)理解不夠深入,你只需要明白腳本就是**“填空題”**,VisionPro在適當(dāng)?shù)奈恢媒o你留下空白,在這個空白區(qū)域你可以在滿足條件的情況下“自由發(fā)揮”,實現(xiàn)你想要實現(xiàn)的功能。


2.1 toolGroup腳本類


以ToolGroup腳本為例展開,toolGroup 腳本是繼承于CogToolGroupBaseScript,實現(xiàn)了ICogToolGroupScript接口,該接口有四個方法,詳細(xì)介紹如下:

public class CogToolGroupBaseScript : ICogToolGroupScript{ // public virtual bool GroupRun(ref string message,ref Cognex.VisionPro.CogToolResultConstants result) { return true; } public virtual void ModifyCurrentRunRecord(ICogRecord currentRecord) {} public virtual void ModifyLastRunRecord(ICogRecord lastRecord) {} public virtual void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) { toolGroup = host; } protected Cognex.VisionPro.ToolGroup.CogToolGroup toolGroup=null;}

Initialize()顧名思義,該方法用于對toolGroup工具進(jìn)行初始化,當(dāng)退出腳本編輯工具時腳本會進(jìn)行編譯并進(jìn)行初始化,此時該方法會被調(diào)用。此外,在對該group通過*.vpp文件進(jìn)行加載時也會被立即調(diào)用。所以,所有的“一次性”的初始化工作都應(yīng)該寫在該方法中。

GroupRun()方法運行該Group中的工具,如果該方法返回值為true,所有的屬于當(dāng)前Group的視覺工具都將運行,如果返回值為false,用戶可以自定義工具的執(zhí)行順序,返回值為false為常見情況。

ModifyCurrentRunRecord()方法用于修改CurrentRecord,在toolGroup的CurrentRecord被創(chuàng)建后調(diào)用。

ModifyLastRunRecord()方法用于修改LastRunRecord,在toolGroup的LastRunRecord被創(chuàng)建后調(diào)用,例如:在最終生成圖像中添加標(biāo)簽、該表顏色、用不同幾何圖像標(biāo)記目標(biāo)區(qū)域。

成員變量toolGroup為CogToolGroup類型,該類的runTool方法用于運行指定視覺工具;Tools 屬性為當(dāng)前Group的工具集合,一般用于獲取當(dāng)前工具組中某一工具的引用;DefineScriptTerminal、GetScriptTerminalData、SetScriptTerminalData 方法用于定義、獲取、設(shè)置輸入輸出終端。

//對于當(dāng)前Group存在的視覺工具的程序集與命名空間會自動添加,如果用戶想要使用當(dāng)前Group不存在的工具或者添加自定義程序集可以手動添加//詳細(xì)的操作步驟會在后續(xù)實例中進(jìn)行介紹using System;using Cognex.VisionPro;using Cognex.VisionPro3D;using Cognex.VisionPro.ToolGroup; public class UserScript : CogToolGroupBaseScript{ //默認(rèn)情況下遍歷group中所有的工具并運行,用戶可以根據(jù)實際情況自定義運行邏輯與順序 public override bool GroupRun(ref string message, ref CogToolResultConstants result) for (Int32 toolIdx = 0; toolIdx < toolGroup.Tools.Count; toolIdx++) toolGroup.RunTool(toolGroup.Tools[toolIdx], ref message, ref result); return false;//默認(rèn)情況下為false表示用戶可以控制工具的運行順序,返回值為true則運行當(dāng)前Group中所有工具。 } public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) { //在此處添加用戶代碼實現(xiàn)自定義修改CurrentRunRecord的功能 } public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) { //在此處添加用戶代碼用于所有工具運行完成后根據(jù)用戶需求創(chuàng)建Record或者在既有Record中添加標(biāo)記等 } public override void Initialize(CogToolGroup host) { //調(diào)用父類初始化函數(shù),初始化toolGroup對象 base.Initialize(host); }}

2.2 toolBlcok腳本類


與toolGroup腳本類似,toolBlock的腳本父類CogToolBlockAdvancedScriptBase,該類實現(xiàn)的接口與toolGroup相同,都是ICogToolGroupScript,不同之處在于toolBlock與兩個腳本基類,CogToolBlockSimpleScript 與 CogToolBlockAdvancedScript 分別用于“簡單腳”與“復(fù)雜”腳本,兩者之間的區(qū)別在于復(fù)雜腳本能夠?qū)崿F(xiàn):①動態(tài)定義toolBlock的輸入輸出終端,② 能夠訪問當(dāng)前工具塊所包含工具的所有屬性與方法,為保證與toolGroup腳本使用的統(tǒng)一性,推薦直接使用復(fù)雜腳本。
存在即合理,簡單腳本具有使用的便利性,在訪問工具塊的輸入輸出終端時,兩者的具體訪問方式如下:

//使用簡單腳本為輸出賦值Outputs.Degrees = Inputs.Radians * 180 / Math.PI;//使用復(fù)雜腳本為輸出賦值this.mToolBlock.Outputs["Degrees"].Value = ((double) this.mToolBlock.Inputs["Radians"].Value) * 180 / Math.PI;

既然與toolGroup實現(xiàn)了相同的接口,toolBlock腳本基類的方法與toolGroup必然相同,功能基本無異,不再贅述。


2.3Job腳本類


Job腳本用于控制與圖像獲取相關(guān)的設(shè)備屬性與參數(shù),基類為CogJobBaseScript,實現(xiàn)ICogJobScript接口。

public class CogJobBaseScript : ICogJobScript { public virtual void Initialize(CogJob jobParam) { job = jobParam; } public virtual void AcqFifoConstruction(ICogAcqFifo fifo) {} public virtual void PreAcquisition() {} public virtual void PostAcquisition(ICogImage image) {} public virtual bool PostAcquisitionRef(ref ICogImage image) { PostAcquisition(image); return true; } public virtual bool PostAcquisitionRefInfo(ref ICogImage image, ICogAcqInfo info) { return PostAcquisitionRef(ref image); } protected CogJob job = null; }}

Initialize()初始化方法,獲取當(dāng)前job引用以及用戶需要的初始化數(shù)據(jù)。

PreAcquisition()在FIFO的StartAcquire()方法調(diào)用之前被調(diào)用,即在進(jìn)行圖像采集之前調(diào)用,如在圖像采集之前設(shè)置曝光、增益、對比度等圖像參數(shù)。

PostAcquisition()在圖像采集完成之后被調(diào)用。

PostAcquisitionRef()該方法與 PostAcquisition 類似,不同之處在于 image 是以引用的方式傳遞,如果這個方法返回 Ture , VisionPro 將處理這個 image,如果這個方法返回 False ,這個 image 將不會被立即進(jìn)行處理 ,而是采集下一幅圖像,這可以使你能夠在處理所取的多個 image 之前將它們聯(lián)合在一起.(如果 PostAcquisition 和 PostAcquisitionRef 都被重寫,PostAcquisition 將被忽略)。例如你需要同一個相機采集多張不同曝光的圖像進(jìn)行合成,并不是每次采集后都立即進(jìn)行處理,而是采集到固定數(shù)量或者滿足某一條件時進(jìn)行處理。

PostAcquisitionRefInfo()與PostAcquisiitonRef相似,多了一個參數(shù),用戶可以通過ICogAcqInfo獲取圖像的時間戳,重寫該方法后 PostAcquisition 、PostAcquisitionRef、 PostAcquisitionRef會被忽略。

三、腳本使用案例

3.1 job本實用實例-----自動調(diào)節(jié)曝光時間


setp1.新建Job,雙擊進(jìn)入job中。


step2配置->作業(yè)屬性->編輯腳本->C#腳本,進(jìn)入Job腳本編輯環(huán)境

using System;using Cognex.VisionPro;using Cognex.VisionPro.QuickBuild;using Cognex.VisionPro.ImageProcessing; public class UserScript : CogJobBaseScript{ double exposure = 10;#region "When an Acq Fifo Has Been Constructed and Assigned To The Job" // This function is called when a new fifo is assigned to the job. This usually // occurs when the "Initialize Acquisition" button is pressed on the image source // control. This function is where you would perform custom setup associated // with the fifo. public override void AcqFifoConstruction(Cognex.VisionPro.ICogAcqFifo fifo) { }#endregion #region "When an Acquisition is About To Be Started" // Called before an acquisition is started for manual and semi-automatic trigger // models. If "Number of Software Acquisitions Pre-queued" is set to 1 in the // job configuration, then no acquisitions should be in progress when this // function is called. public override void PreAcquisition() { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif ICogAcqExposure IExposure = job.AcqFifo.OwnedExposureParams; IExposure.Exposure = exposure; }#endregion #region "When an Acquisition Has Just Completed" // Called immediately after an acquisition has completed. // Return true if the image should be inspected. // Return false to skip the inspection and acquire another image. public override bool PostAcquisitionRefInfo(ref Cognex.VisionPro.ICogImage image, Cognex.VisionPro.ICogAcqInfo info) { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif CogHistogram curImageHist = new CogHistogram(); CogHistogramResult curHistResult = curImageHist.Execute(image,null); if(curHistResult.Mean>150) exposure *= 0.75; if(curHistResult.Mean < 50) exposure *= 1.5; if(exposure<0.1) exposure = 0.1; return true; }#endregion //Perform any initialization required by your script here. public override void Initialize(CogJob jobParam) { //DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE base.Initialize(jobParam); }#endregion }

3.2 toolBlock腳本使用實例-----顯示Blob區(qū)域的中心坐標(biāo)于當(dāng)前Blob區(qū)域
toolBlock腳本的應(yīng)用最為廣泛,用于控制工具的運行邏輯,修改生成的record,拓展數(shù)據(jù)邏輯等。本例以最簡單的方式介紹toolBloc腳本使用方法,本例的具體應(yīng)用為在各個獨立的Blob區(qū)域顯示其中心坐標(biāo)值。


在進(jìn)行腳本編輯之前,根據(jù)用戶需要添加程序集以及命名空間,添加引用程序集的具體過程如下圖所示:


在編寫C#toolBlock腳本時,其常規(guī)流程為:

step1.根據(jù)需求添加程序集以及命名空間
step2.聲明對應(yīng)toolBlock的相關(guān)變量以及用戶自定義變量
step3.在Initialize()函數(shù)中獲取toolBlock中工具的引用
step4.在GroupRun()方法中通過工具變量控制工具的執(zhí)行順序以及獲取所需用戶數(shù)據(jù)
step5.修改Record得到用戶所需效果

//==========================step1===================================#region namespace importsusing System;using System.Collections;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Windows.Forms;using Cognex.VisionPro;using Cognex.VisionPro.ToolBlock;using Cognex.VisionPro3D;using Cognex.VisionPro.Blob;using Cognex.VisionPro.ResultsAnalysis;#endregion public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase{//==========================step2=================================== #region Private Member Variables private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock; private CogBlobTool mBlob; private List mLabels; #endregion ///

/// Called when the parent tool is run. /// Add code here to customize or replace the normal run behavior. /// /// Sets the Message in the tool's RunStatus. /// Sets the Result in the tool's RunStatus /// True if the tool should run normally, /// False if GroupRun customizes run behavior public override bool GroupRun(ref string message, ref CogToolResultConstants result) { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif //==========================step4=================================== mLabels.Clear(); // Run each tool using the RunTool function //foreach(ICogTool tool in mToolBlock.Tools) //mToolBlock.RunTool(tool, ref message, ref result); mToolBlock.RunTool(mBlob, ref message, ref result); CogBlobResultCollection blobs = mBlob.Results.GetBlobs(); foreach(CogBlobResult blob in blobs) { CogGraphicLabel tempLabel = new CogGraphicLabel(); tempLabel.Alignment = CogGraphicLabelAlignmentConstants.BaselineCenter; tempLabel.SetXYText(blob.CenterOfMassX, blob.CenterOfMassY, Convert.ToString(blob.CenterOfMassX)+","+Convert.ToString(blob.CenterOfMassY)); tempLabel.Color = CogColorConstants.Red; mLabels.Add(tempLabel); } return false; } #region When the Current Run Record is Created /// /// Called when the current record may have changed and is being reconstructed /// /// /// The new currentRecord is available to be initialized or customized. public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) { } #endregion #region When the Last Run Record is Created /// /// Called when the last run record may have changed and is being reconstructed /// /// /// The new last run record is available to be initialized or customized. public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) { //==========================step5=================================== foreach(CogGraphicLabel label in mLabels) { mToolBlock.AddGraphicToRunRecord(label, lastRecord, "CogBlobTool1.InputImage"," "); } } #endregion #region When the Script is Initialized /// /// Perform any initialization required by your script here /// /// The host tool public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) { // DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE base.Initialize(host); // Store a local copy of the script host //==========================step3=================================== this.mToolBlock = ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host)); mBlob = this.mToolBlock.Tools["CogBlobTool1"] as CogBlobTool; mLabels = new List(); } #endregion}

效果圖為:

四、腳本進(jìn)階

4.1腳本是“插件”程序集


無論你是通過Job腳本、ToolGroup腳本還是ToolBlock腳本拓展QuickBuild程序功能時,實際上是完善了繼承于某一接口的腳本類(繼承于CogToolGroupBaseScript、CogJobBaseScript或者CogToolBlockAdvancedScriptBase類),在退出腳本編輯環(huán)境時QuickBuild對你完善的子類進(jìn)行編譯,如果出現(xiàn)語法錯誤會報錯提示,在語法錯誤改正前當(dāng)前腳本的所有內(nèi)容都不會被調(diào)用,因為沒有通過編譯。如果出現(xiàn)邏輯錯誤不會提示,需要在VS環(huán)境下進(jìn)行調(diào)試,調(diào)試方法后續(xù)會詳細(xì)介紹。QuickBuild程序運行時通過接口實現(xiàn)對腳本子類成員函數(shù)的調(diào)用,從而將腳本函數(shù)的拓展功能進(jìn)行實現(xiàn)。


關(guān)于腳本,你還需要明白以下幾點:

用戶在腳本中編寫的代碼會成為VisionPro程序的一部分,其中的bug也不可避免影響到VisionPro 的運行。

用戶實現(xiàn)的腳本類會被編譯為程序集加載到內(nèi)存當(dāng)中,而且每次對腳本進(jìn)行編輯之后會重新編譯,但是舊版本的程序集會一致在內(nèi)存中直到你重新啟動QuickBuild,因此頻繁修改腳本會增加一點點的內(nèi)存消耗。

腳本程序集被加載到內(nèi)存之后,VisionPro會創(chuàng)建一個該腳本類的接口對象。腳本重新編輯之后接口對象會釋放Dispose之前對象,運行GC進(jìn)行垃圾回收,創(chuàng)建新腳本類的接口實例。

在進(jìn)行腳本編輯時,如果腳本內(nèi)容比較多,最好經(jīng)常進(jìn)行保存,保存時需要退出腳本編輯環(huán)境對整個QuickBuild工程進(jìn)保存。補充一點,在QuickBuild環(huán)境下進(jìn)行工具編輯時亦需要進(jìn)行隨手保存,工具Block誤刪除之后好像是無法恢復(fù)的只有退出QuickBuild時選擇不保存,前提是你誤刪除之前剛好保存過,慘痛的經(jīng)歷已不止一次。

4.2腳本實現(xiàn)事件與委托

事件響應(yīng)函數(shù)中要增加異常處理機制(Try …Catch),否則容易導(dǎo)致VisionPro運行出現(xiàn)異常;

不要在事件處理函數(shù)中產(chǎn)生當(dāng)前的事件,否則會造成無限循環(huán);

重寫實現(xiàn)Dispose(),取消事件注冊。腳本每次修改退出后都會進(jìn)行編譯,運行時重新注冊事件,如果沒有在Dispose總?cè)∠詴斐啥啻巫裕?/p>

當(dāng)前事件的響應(yīng)函數(shù)可能不止你在腳本中實現(xiàn),在VisionPro內(nèi)部機制中可能也有實現(xiàn),這些事件的響應(yīng)函數(shù)執(zhí)行順序是不確定的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1949

    瀏覽量

    34850
  • VisionPro
    +關(guān)注

    關(guān)注

    6

    文章

    19

    瀏覽量

    15651
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    391

    瀏覽量

    14902

原文標(biāo)題:VisionPro之腳本(一文讀懂VisionPro腳本原理與使用方法)

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ElfBoard開源項目|智能消防車項目

    智慧城市的建設(shè)推動了城市各個領(lǐng)域的智能化發(fā)展,消防領(lǐng)域也不例外。智慧消防作為智慧城市的重要組成部分,其建設(shè)和發(fā)展與智慧城市的建設(shè)緊密相連。 在此背景下,ElfBoard團隊完成了一個創(chuàng)新性的開源
    的頭像 發(fā)表于 01-04 16:43 ?263次閱讀
    ElfBoard開源<b class='flag-5'>項目</b>|智能消防車<b class='flag-5'>項目</b>

    STM32項目分享:機智云智慧農(nóng)業(yè)系統(tǒng)

    01—項目簡介1.功能詳解基于STM32的機智云智慧農(nóng)業(yè)系統(tǒng)。功能如下:溫濕度采集:使用DHT11溫濕度傳感器采集環(huán)境溫濕度土壤濕度
    的頭像 發(fā)表于 12-19 18:40 ?323次閱讀
    STM32<b class='flag-5'>項目</b>分享:機智云智慧農(nóng)業(yè)系統(tǒng)

    STM32項目分享:智能臺燈系統(tǒng)

    01—項目簡介1.功能詳解基于STM32智能臺燈系統(tǒng)。功能如下:亮度控制:按鍵控制照明燈的亮度(5擋亮度)計時功能:按鍵啟動計時,累
    的頭像 發(fā)表于 11-29 01:02 ?775次閱讀
    STM32<b class='flag-5'>項目</b>分享:智能臺燈系統(tǒng)

    【畢設(shè)項目參考】物聯(lián)網(wǎng)10+項目推薦,附項目文檔/源碼/視頻

    項目進(jìn)行深入創(chuàng)新,在畢業(yè)設(shè)計中取得優(yōu)異的成績,為未來的職業(yè)生涯打下堅實的基礎(chǔ)。畢設(shè)項目推薦1智能小車項目功能介紹:本項目由三部分組成:應(yīng)用
    的頭像 發(fā)表于 11-26 15:26 ?680次閱讀
    【畢設(shè)<b class='flag-5'>項目</b>參考】物聯(lián)網(wǎng)10+<b class='flag-5'>項目</b>推薦,附<b class='flag-5'>項目</b>文檔/源碼/視頻

    閃電定位儀應(yīng)用簡介

    閃電定位儀應(yīng)用簡介
    發(fā)表于 11-13 16:34 ?0次下載

    超聲波簡介

    電子發(fā)燒友網(wǎng)站提供《超聲波簡介.pdf》資料免費下載
    發(fā)表于 10-25 09:14 ?0次下載
    超聲波<b class='flag-5'>簡介</b>

    STM32項目分享:智能門禁鎖系統(tǒng)

    01—項目簡介1.功能詳解基于STM32智能門禁鎖系統(tǒng)。功能如下:按鍵解鎖:系統(tǒng)通過4×4矩陣鍵盤模塊輸入密碼進(jìn)入主菜單門禁刷卡:通
    的頭像 發(fā)表于 09-12 08:04 ?1977次閱讀
    STM32<b class='flag-5'>項目</b>分享:智能門禁鎖系統(tǒng)

    STM32項目分享:智能大棚/智慧農(nóng)業(yè)系統(tǒng)

    01—項目簡介1.功能詳解基于STM32的智慧農(nóng)業(yè)系統(tǒng)。功能如下:溫濕度采集:使用DHT11溫濕度傳感器采集環(huán)境溫濕度土壤濕度采集:
    的頭像 發(fā)表于 08-30 12:15 ?1199次閱讀
    STM32<b class='flag-5'>項目</b>分享:智能大棚/智慧農(nóng)業(yè)系統(tǒng)

    STM32項目分享:智慧農(nóng)業(yè)(機智云)系統(tǒng)

    目錄一、前言二、項目簡介1、功能詳解2、主要器件三、原理圖設(shè)計四、PCB硬件設(shè)計1、PCB圖2、PCB板打樣焊接圖五、程序設(shè)計六、實驗效果七、資料內(nèi)容項目分享一、前
    的頭像 發(fā)表于 07-27 08:10 ?620次閱讀
    STM32<b class='flag-5'>項目</b>分享:智慧農(nóng)業(yè)(機智云)系統(tǒng)

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用項目簡介

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用項目簡介
    的頭像 發(fā)表于 06-10 08:06 ?371次閱讀
    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用<b class='flag-5'>項目</b><b class='flag-5'>簡介</b>

    Vision Pro沒起飛,下個故事是AI:蘋果變成了一家賣夢的公司

    現(xiàn)實太骨感的蘋果,正變成一家賣夢的公司。上一季度財報發(fā)布時,正值Visionpro正式發(fā)售前夜,一切熱鬧都被蘋果轉(zhuǎn)化為推銷給投資者們的“下一個iPhone”的美夢。而一個季度過去,到今天第一個包含
    的頭像 發(fā)表于 05-13 17:10 ?312次閱讀
    Vision Pro沒起飛,下個故事是AI:蘋果變成了一家賣夢的公司

    CAN和CANFD協(xié)議簡介(下)

    CAN和CANFD協(xié)議簡介(下)
    的頭像 發(fā)表于 02-19 12:08 ?1199次閱讀
    CAN和CANFD協(xié)議<b class='flag-5'>簡介</b>(下)

    蘋果VisionPro頭顯無法通過“查找”確定位置

    蘋果最新發(fā)布的VisionPro頭顯已正式開售,但根據(jù)蘋果日前發(fā)布的支持文件,這款頭顯目前存在一些功能上的限制。最值得注意的是,用戶無法在iCloud網(wǎng)站或“查找”應(yīng)用中確定VisionPro頭顯的位置。這意味著,如果頭顯丟失或被盜,用戶將難以追蹤其位置。
    的頭像 發(fā)表于 02-04 14:21 ?1178次閱讀

    蘋果VisionPro頭顯開售后遭遇多項重大缺陷:不能定位、遠(yuǎn)程發(fā)聲

    蘋果官方發(fā)布的技術(shù)支持文檔顯示,這項被稱為“視覺專業(yè)版(”VisionPro“)”的設(shè)備并沒有最基本的定位和遠(yuǎn)程音頻傳輸能力。對此,MacRumors猜測可能因為該頭戴式顯示器缺少外部電池組和全球定位系統(tǒng)(GPS)而導(dǎo)致這些功能無法實現(xiàn)。
    的頭像 發(fā)表于 02-03 10:06 ?805次閱讀

    CAN和CANFD協(xié)議簡介(上)

    CAN和CANFD協(xié)議簡介(上)
    的頭像 發(fā)表于 01-26 08:06 ?1514次閱讀
    CAN和CANFD協(xié)議<b class='flag-5'>簡介</b>(上)