顯示具有 科普 標籤的文章。 顯示所有文章
顯示具有 科普 標籤的文章。 顯示所有文章

承認被騙多困難:解析心理防衛背後的機制

tags: 心理學 認知失調 沉沒成本 自我防衛 社會心理學

發布日期:2025年5月19日

你有沒有注意到,當身邊朋友明顯被騙時,即使證據確鑿,他們往往仍舊不願承認?或是當自己發現上當受騙,卻選擇繼續相信「應該不會這麼糟」?這不是個案,而是人類心理的共同模式。本文將探索為何承認被騙對我們來說如此困難,並從心理學角度解析這些令人著迷的心理機制。

1. 認知失調理論:我們的思想如何自我協調

認知失調理論(Cognitive Dissonance Theory)由心理學家 Leon Festinger 於1957年提出,是理解人們為何難以承認被騙的關鍵理論之一。當我們的信念與現實產生衝突時,大腦會感到強烈的心理不適,進而啟動自我調節機制。

認知失調如何運作?

當一個人相信自己是聰明的、理性的,卻發現自己被騙,這種矛盾的認知會讓內心產生強烈的不協調感。為了緩解這種不適,大腦通常會採取以下行為:

  • 否認事實:「我沒有被騙,這不是騙局」
  • 美化騙局:「他其實不是存心騙我的」
  • 合理化事件:「任何人在那種情況下都會做出同樣的決定」

經典實驗:千金難買的無聊實驗

Festinger 和 Carlsmith 在1959年進行了一個經典實驗。研究人員讓參與者完成極度無聊的任務,然後要求他們告訴下一位參與者「這個實驗很有趣」(一個顯然違背事實的說法)。有趣的是,那些僅獲得1美元報酬的參與者比獲得20美元報酬的參與者更傾向於事後真的相信實驗很有趣!

這是因為高報酬者有明確外部理由解釋自己的行為(「我為了錢這麼說」),而低報酬者則必須通過改變自身信念來消除認知失調(「也許實驗確實有些有趣」)。同理,當我們被騙卻沒有明確外部因素可以責怪時,我們更容易改變自己的信念,說服自己「其實沒被騙」。

2. 沉沒成本謬誤:已投入的無法放手

沉沒成本謬誤

我們常聽到「別在爛船上浪費釘子」這句諺語,但為何人們仍會固執地投入更多資源到明知會失敗的事情上?這就是沉沒成本謬誤(Sunk Cost Fallacy)的魔力。

沉沒成本如何影響我們?

當一個人已經投入大量金錢、時間或情感在某事上,即使發現情況不對勁,仍會繼續投入,因為:

  • 承認被騙 = 承認前期投入都是浪費
  • 避免立即損失感:寧願繼續投入,也不願接受已有的損失
  • 厭惡損失心理:人們對於損失的痛苦感遠大於獲得同等價值的喜悅感

真實案例:愛情的沉沒成本

一個生活中常見的例子是不健康的戀愛關係。當一位女子發現男友經常欺騙她、對她不好,甚至有劈腿行為,理性上她應該結束這段關係。然而,因為已經投入了3年時間、大量情感和經濟支持,她可能會告訴自己:「我已經花了這麼多心力想要改變他,循循善誘這麼久,在他身上投入多少金錢跟青春年華,還有這些感情,怎麼說放就放,我不甘心啊!」

投資中的沉沒成本

投資領域也常見此現象。許多投資者明知某股票前景不佳,卻因為「已經虧損太多」而無法割捨。更有趣的是,研究顯示,人們面對同樣的股價和投資環境,僅因為過去的投資歷史不同,就會做出完全不同的決策。

3. 自我防衛機制:內心的保護罩

自我防衛機制

佛洛伊德心理分析學派提出的自我防衛機制(Defense Mechanisms)告訴我們,人類會無意識地啟動心理防禦系統來保護自尊。面對被騙這種傷害自尊的事實,我們常見以下防禦機制:

否認(Denial)

最直接的防禦方式是完全拒絕接受現實。例如,一位媽媽遽聞愛子在車禍中喪生,無法接受這個事實,依然照常做飯、整理愛子房間,等候愛子回來,就當什麼事也沒發生過。同樣地,被騙的人可能直接否認騙局存在。

合理化(Rationalization)

為自己的錯誤判斷找藉口。曹錦輝曾有一場投球表現不佳,隨即責怪投手丘太爛;LeBron James曾抱怨球衣袖子讓自己打不好球。被騙者可能會說:「我不是被騙,而是在幫助別人」,「這只是暫時的市場調整,不是騙局」。

投射(Projection)

將責任推給他人。「那個銷售員太會說了!」「是媒體誤導我做出這個決定!」「如果不是朋友推薦,我才不會上當!」

4. 自我價值保護:我不可能如此愚蠢

自我價值保護

人們傾向維護「自己是聰明、有判斷力」的自我形象。承認被騙等同於承認自己愚蠢、判斷力差,這會嚴重打擊自尊心。因此,許多人寧可繼續被騙,也不願面對「我做了錯誤決定」的事實。

特別是那些平時標榜自己精明、理性的人,往往更難承認自己被騙。這種心理防衛在投資和消費決策中尤其明顯。人們可能繼續向親友推薦一個實際上已經讓自己損失的投資項目,就是為了避免承認自己當初判斷失誤。

5. 群體從眾與認同:我的群體不會錯

群體從眾與認同

社會認同理論(Social Identity Theory)指出,人們會根據自己所屬的群體來定義自己。當一個人因為某個團體、宗教或政治立場而受騙時,承認被騙不僅意味著個人判斷失誤,更意味著對整個群體認同的否定。

群體思維的力量

群體思維(Groupthink)是指為了維護群體一致性而非理性地考慮問題的現象。當整個群體都相信某事,個體很難獨立思考並承認群體可能被騙。這也解釋了為什麼龐氏騙局(如傳銷)能在特定社群中大肆蔓延——因為承認被騙會讓人同時失去社群認同和經濟利益。

從眾效應與不敢第一個站出來

從眾效應(Conformity)使人們傾向跟隨多數人的行為和態度。在一個普遍接受某個可能是騙局的群體中,個體即使察覺不對勁,也不敢成為第一個「叛變者」,因為這意味著可能面臨群體排斥。

如何幫助自己和他人面對被騙的事實?

了解這些心理機制後,我們可以更理性地應對被騙的情況:

  1. 認識到這些心理反應是正常的:了解這些防衛機制是人類普遍的心理反應,可以減輕自責感
  2. 將「被騙」與自我價值分離:被騙不等於你是愚蠢的人,智商和判斷力都很高的人同樣會上當
  3. 著眼於解決方案,而非沉浸在過去:把精力放在「接下來怎麼做」,而非「我怎麼會這麼笨」
  4. 尋求社會支持:找信任的朋友談論你的經歷,減輕孤立感
  5. 幫助他人時保持耐心:當你嘗試幫助被騙的親友時,記住他們的抗拒是正常心理機制的表現

結語:理解是改變的第一步

承認自己被騙,不只是認錯,更是打破自我保護的心理結構。這種深層心理機制解釋了為何詐騙屢禁不止,為何聰明人也會重複落入騙局的陷阱。

理解這些心理機制並非要為騙局辯解,而是幫助我們更好地保護自己和關心的人。當我們能夠以更寬容的態度面對「被騙」這一事實,我們就能打破這些心理枷鎖,從錯誤中真正學習和成長。

正如心理學家所言,「認識自己」是一切改變的開始。通過理解我們的心理防衛機制,我們才能真正超越它們的限制。


本文最初發布於 HackMD @BASHCAT。

為什麼游泳池看起來比較淺?Snell's Law 背後的千年故事

光線穿過水面折射的場景

小時候在游泳池玩水,我總覺得大人們很奇怪。明明看起來水只到腰,跳下去卻發現已經快淹到胸口了。那時候以為是自己眼睛有問題,後來才知道,原來是光在「騙人」。

你有沒有過這種經驗?把筷子插進裝水的玻璃杯裡,筷子看起來像是在水面處「折斷」了。或者在河邊看魚,明明瞄準了,伸手去抓卻總是撲空。這些日常生活中的「小把戲」,背後其實藏著一個流傳了一千多年的物理定律。

而這個定律的發現者,是一位被歷史遺忘了六百多年的阿拉伯學者。


光的「詭計」無處不在

開車在大太陽下的柏油路上行駛,你一定見過遠方路面上好像有一灘水,開近了卻發現什麼都沒有。那是空氣在耍花樣。海市蜃樓也是這個原理,只不過規模更大、更戲劇化。

說實話,這些現象我以前都當作「光學錯覺」就帶過去了,從沒認真想過為什麼。直到有一天讀到這個故事,才發現原來光的行為遠比我想像的更「聰明」。

怎麼說呢?光不只是照直線走,它還會「算計」。


救生員的抉擇:光也會這樣想

物理學家費曼(Richard Feynman)講過一個很有趣的比喻。

想像你是一個救生員,站在沙灘上。突然間,你看到海裡有人溺水了。你要怎麼跑過去救人?

救生員問題示意圖

直覺告訴你:直線最短,直接衝過去就對了。

但等等。你在沙灘上跑得快,在水裡游得慢。如果你用直線衝,會在水裡待比較久的時間。那換一個角度想:何不在沙灘上多跑一段,盡量縮短在水中的距離?

當然,也不能在沙灘上跑太遠,那樣總路程會變長。

最佳路徑,是一個折中的角度。不是直線,而是在沙灘和海水交界處「轉個彎」。

你知道嗎?光也是這麼想的。

1657 年,法國數學家費馬(Pierre de Fermat)提出了一個大膽的猜想:光在兩點之間行進時,永遠選擇花費時間最短的路徑。

這聽起來很玄,但想想救生員的情境就懂了。光在空氣中跑得快,在水裡跑得慢。當它從空氣進入水中時,它不會傻傻地走直線,而是會「算好」角度,讓總時間最短。

結果呢?光在界面處轉了個彎。這個彎,就是「折射」。


被遺忘六百年的真正發現者

這裡有個讓人感慨的故事。

我們今天叫這個定律「Snell's Law」,司乃耳定律,紀念的是 1621 年推導出這個公式的荷蘭數學家 Willebrord Snellius。但他其實不是第一個發現這個定律的人。

早在 984 年,一位在巴格達宮廷工作的波斯學者 Ibn Sahl(伊本·薩赫勒),就已經正確地描述了光的折射規律。他在一本叫《論燃燒鏡與透鏡》的著作裡,不僅發現了折射定律,還用這個定律設計出了消除像差的完美透鏡。

比 Snell 早了整整 637 年。

但他的手稿散落在德黑蘭和大馬士革的圖書館裡,沉睡了將近千年。直到 1993 年,法國學者 Roshdi Rashed 才重新整理、翻譯了這些文獻,讓世人知道真正的發現者是誰。

科學史上這樣的事情不少。誰的名字被記住,有時候不是看誰先發現,而是看誰的作品流傳得更廣。Ibn Sahl 的貢獻被埋沒,某種程度上是歷史的遺憾。

不過,物理定律本身不在乎名字。不管你叫它 Snell's Law 還是 Ibn Sahl's Law,光都會按照同樣的方式折射。


那個改變一切的公式

好,說了這麼多故事,來看看這個定律到底長什麼樣子:

$$n_1 \sin \theta_1 = n_2 \sin \theta_2$$

別被公式嚇到,拆開來其實很簡單。

  • n₁ 和 n₂ 是兩種介質的「折射率」。可以把它想成光在這個材料裡「跑得多慢」的指標。數字越大,光跑得越慢。
  • θ₁ 是入射角,就是光進入界面時和垂直線的夾角。
  • θ₂ 是折射角,光進入另一種介質後和垂直線的夾角。

這個公式說的是:兩邊的「折射率乘以角度的正弦值」永遠相等。

舉個例子。光從空氣(折射率約 1.0)進入水(折射率約 1.33)。如果入射角是 45 度,折射角會是多少?

算一下:1.0 × sin(45°) = 1.33 × sin(θ₂)

解出來,θ₂ 約等於 32 度。

光「彎」向了垂直線。這就是為什麼水中的東西看起來位置會偏移,游泳池看起來會比較淺。


當光無處可去:全反射的秘密

這裡有個有趣的情況。

當光從「慢」的介質(高折射率)進入「快」的介質(低折射率)時,它會彎離垂直線。角度越大,彎得越厲害。

那如果入射角大到某個程度呢?

算一下就會發現,折射角可能超過 90 度。但這不可能啊,90 度就已經是貼著界面了。

這時候,光會做一件很酷的事:完全反射回去,一點都不穿透。這叫「全反射」(Total Internal Reflection)。

能發生全反射的最小入射角,叫做「臨界角」。

介面 臨界角
玻璃 → 空氣 約 42°
水 → 空氣 約 49°
鑽石 → 空氣 約 24°

你注意到鑽石的臨界角了嗎?只有 24 度。這意味著,大部分照進鑽石的光都會被困在裡面,反覆彈跳。


鑽石為什麼這麼閃?

鑽石內部的全反射

鑽石的折射率高達 2.42,是自然界中數一數二的。這麼高的折射率,讓它的臨界角只有 24 度左右。

當光從頂部進入鑽石,大部分光線打到底部的切面時,入射角都會超過臨界角。於是光不會穿出去,而是被反射回來。再打到另一個面,又彈回來。

最終,這些光從鑽石頂部射出,進入你的眼睛。

鑽石切割師傅的工作,就是算好每一個切面的角度,讓盡可能多的光在內部反彈後從頂部出來。這就是鑽石「火彩」的秘密。

順便一提,鑽石的閃爍其實有兩種:

  • Brilliance(亮度):白光的反射
  • Fire(火彩):光被色散成彩虹色

兩者都跟折射有關,但火彩還多了一層「不同顏色的光折射角度不同」的效應。紅光和藍光的折射率略有差異,所以會分開來,就像稜鏡分光一樣。


光纖:把光困在玻璃絲裡

全反射最實用的應用,大概就是光纖了。

光纖是一根很細的玻璃絲,中間是「芯」,外面包著「包層」。芯的折射率比包層高。

當光以適當的角度射入芯裡,每次碰到芯和包層的交界面,都會發生全反射。光就這樣在玻璃絲裡彈來彈去,可以傳播好幾公里都不會「漏」出去。

這就是你家網路這麼快的原因之一。光纖裡跑的是光,而光的頻率遠比電訊號高,能承載的資訊量也大得多。

下次看到路邊在鋪光纖,你可以跟朋友說:「你知道嗎?那裡面的光是用 Snell's Law 困住的。」

雖然可能會換來一個白眼,但至少你知道自己說的是真的。


海市蜃樓:大自然的光學魔術

除了人造的應用,大自然也很會玩折射。

海市蜃樓的原理是這樣的:地面被太陽曬得很燙,靠近地面的空氣溫度高、密度低、折射率也低。而上方的空氣溫度較低、折射率較高。

這樣一來,空氣本身就形成了一個「梯度」,折射率從下往上逐漸增加。

光從遠方的物體射過來,經過這個梯度時會逐漸彎曲。如果彎曲得夠厲害,光可能會像走一條弧線一樣「轉回來」,從下方進入你的眼睛。

你看到的,是遠方物體的「倒影」,好像地上有一面鏡子。這就是為什麼柏油路上看起來有水窪,實際上什麼都沒有。

沙漠裡的海市蜃樓更戲劇化。有時候會看到遠方出現城市或綠洲的影像,那其實是很遠的地方的景象被折射過來了。

光在騙你,但它遵守的規則從來沒變過。


回到游泳池

現在回頭想想,當年在游泳池邊被「騙」的經驗,其實藏著這麼多物理學。

水的折射率大約是 1.33。當你從水面上方往下看,水底的光線在穿過水面時會彎曲。你的大腦不知道光被折射了,它以為光是直線傳過來的,所以會把水底的東西「算」在比實際位置更淺的地方。

游泳池看起來淺,是因為光在說謊,而你的大腦選擇相信它。

但現在你知道真相了。

下次去游泳,跳水之前記得多想一想。那個看起來只到腰的深度,可能比你以為的深很多。

物理定律不會騙人,但它們有時候會讓你的眼睛騙你。


寫在最後

Snell's Law 可能是物理課本上最「無聊」的公式之一。一個簡單的正弦比例關係,看起來沒什麼大不了的。

但當你知道它背後有一個被遺忘六百年的阿拉伯學者,有一個用救生員比喻來解釋的物理學家,有鑽石的璀璨、光纖的實用、海市蜃樓的神秘——這個公式突然變得不一樣了。

物理從來不只是公式。每個定律背後,都有人類觀察自然、試圖理解世界的故事。

Ibn Sahl 在一千年前看到了光的折射,寫下了他的發現。費馬猜測光走最短時間的路徑。惠更斯用波動理論解釋了一切。

而你,現在知道為什麼游泳池看起來比較淺了。

這個知識可能不會讓你游得更快,但下次看到光在水面折射時,你會知道那不是魔術,而是一個流傳千年的物理法則,正在你眼前上演。


參考資料


本文最初發布於 HackMD @BASHCAT。

天線是什麼

天線如何工作

天線是一個關鍵的無線通訊組件,用於發射和接收電磁波。在無線通訊系統中,天線負責將電信號轉換成無線電波,以便傳播到空間中,同時也能從空間中接收來的無線電波並將其轉換回電信號供接收設備處理。

🌟 新手須知: 天線是所有無線通訊的基礎,從收音機到WiFi再到行動電話,都依賴於天線的正確工作。了解天線的基本原理將幫助您更好地使用和維護無線設備。

天線的基本原理

天線工作的基本原理基於電磁波理論。當交流電流通過導體(天線)時,會產生電磁場,這些電磁場以電磁波的形式向外傳播。同樣地,當電磁波經過天線時,會在導體中感應出交流電流。

關鍵物理原理包括:

  1. 電磁感應: 電流變化產生變化的電磁場
  2. 電磁波傳播: 電磁波在空間中以光速傳播
  3. 諧振: 天線長度通常是電磁波波長的特定比例(通常是1/2或1/4波長)

天線波長示意圖

天線的功能和重要性

電磁波的轉換:

天線可以轉換電信號為電磁波,這使得信號能夠透過空氣或其他介質傳播。 同樣地,天線也可以接收來自遠處的電磁波,並將其轉換為電信號供設備進一步處理。

信號傳播的效率:

天線的設計和放置對信號的覆蓋範圍和質量有顯著影響。一個好的天線設計可以增加通訊距離並減少信號丟失。

選擇和使用:

不同類型的天線適用於不同的應用。例如,全向天線適用於廣播信號到多個方向,而定向天線則適用於將信號聚焦到特定方向。

天線的類型

根據不同的應用需求,天線有多種類型:

1. 偶極天線(Dipole Antenna)

  • 最基本的天線類型,由兩個長度相等的導體組成
  • 通常長度為半波長(λ/2)
  • 輻射模式呈"8"字形
  • 常用於AM/FM收音機、簡單的無線設備

2. 單極天線(Monopole Antenna)

  • 由一個垂直導體和一個接地平面組成
  • 通常長度為1/4波長(λ/4)
  • 全向輻射模式(水平方向)
  • 常用於移動通訊、車載天線

3. 八木天線(Yagi-Uda Antenna)

  • 由一個饋電元件和多個導向器、反射器組成
  • 高指向性,增益高
  • 常用於電視接收、遠距離通訊

4. 貼片天線(Patch Antenna)

  • 平面結構,易於集成在電路板上
  • 低剖面,適合嵌入式應用
  • 常用於WiFi裝置、GPS接收機

5. 全向天線(Omnidirectional Antenna)

  • 水平方向上360度均勻輻射
  • 適合點對多點通訊
  • 常用於無線路由器、基地台

6. 定向天線(Directional Antenna)

  • 信號集中在特定方向
  • 通訊距離較遠
  • 用於點對點長距離通訊

天線阻抗匹配原理

阻抗匹配是無線電技術中的一個關鍵概念,直接影響天線的效能。當天線的阻抗與發射器或傳輸線的阻抗相匹配時,能量傳輸達到最大效率。

⚠️ 注意: 不良的阻抗匹配會導致信號反射回發射器,造功率損失,並可能導致設備損壞。

阻抗匹配的重要性:

  • 最大化功率傳輸: 當阻抗匹配時,幾乎所有的功率都會從發射器傳輸到天線
  • 減少駐波比(SWR): 良好的匹配降低反射波,減少信號損失
  • 保護發射設備: 避免過高的反射功率對發射器造成損害

匹配技術:

  1. 匹配網絡: 使用電感和電容的組合來調整阻抗
  2. 巴倫(Balun): 平衡與不平衡線路間的匹配裝置
  3. 1/4波長變壓器: 利用特定長度的傳輸線實現阻抗轉換

大多數專業無線設備設計為50歐姆阻抗,這已成為行業標準。對業餘愛好者來說,使用天線分析儀或駐波比(SWR)計可以幫助評估和改善天線匹配情況。

在使用射頻裝置時應注意的事項

當使用任何射頻裝置,如Meshtastic裝置,正確安裝天線是非常重要的:

避免損壞:

在開啟裝置之前安裝天線是至關重要的。如果在沒有天線的情況下啟動射頻裝置,發射部分可能會因為沒有適當的負載而過熱,這可能導致裝置的發射器損壞。

確保性能:

正確安裝天線不僅可以保護裝置免受損壞,還能確保通訊的效率和可靠性。天線的正確放置和定向也會影響信號的強度和質量。

天線應用實踐建議

新手實用技巧:

  1. 高度很重要: 天線安裝得越高,通常通訊距離越遠
  2. 遠離金屬物體: 周圍的金屬物體會干擾天線性能
  3. 適當的接地: 許多天線類型需要良好的接地以發揮最佳功能
  4. 使用合適的連接器和電纜: 高頻信號需要特定類型的連接器和電纜
  5. 定期檢查: 天線連接可能因風吹雨淋而鬆動,定期檢查可延長設備壽命

💡 專業提示: 在選擇天線時,要考慮通訊距離、頻率、環境條件和安裝位置等因素。正確選擇的天線可以顯著提高通訊系統的性能。

養成在開機前檢查天線是否安裝妥當的習慣,是每位使用無線通訊設備者的基本責任。這不僅能延長設備的使用壽命,還能提高通訊的效率和安全性。

本文最初發布於 HackMD @BASHCAT。

GPS是什麼

GPS是什麼以及如何工作

目錄

簡介

全球定位系統(Global Positioning System,簡稱GPS)是一個由衛星、地面控制站和接收器組成的衛星導航系統,可以在地球上的任何地方提供精確的位置、速度和時間信息。這項技術最初由美國國防部開發用於軍事用途,但在1980年代開放給民用,現已成為日常生活中不可或缺的工具。

GPS系統在各種應用中都扮演著重要角色,包括:

  • 導航與交通指引
  • 測繪與地理資訊系統
  • 農業精準作業
  • 救援與緊急服務
  • 科學研究
  • 無人機和自動駕駛技術

💡 有趣的事實:GPS系統每天使全球經濟受益高達10億美元,已成為現代生活的關鍵基礎設施。

GPS系統的組成部分

GPS系統由以下三個主要部分組成:

1. 太空部分(Space Segment)

太空部分由繞地球運行的GPS衛星組成:

  • 衛星數量:由24顆(加上備用衛星)組成的衛星網絡
  • 軌道高度:約20,200公里(12,550英里)
  • 軌道週期:每顆衛星每12小時繞地球兩圈
  • 配置方式:分佈在6個不同的軌道面上,每個軌道面有4顆衛星
  • 移動速度:每小時約14,000公里(8,700英里)
  • 供電方式:太陽能電池板,並有備用電池應對日蝕

每顆GPS衛星都配備有:

  • 精確的原子鐘(精確到40奈秒,即0.000000040秒)
  • 無線電發射器
  • 電腦

2. 控制部分(Control Segment)

控制部分包括分佈在世界各地的地面監測站:

  • 主控站:位於美國科羅拉多州的施賴弗空軍基地
  • 監測站:負責追蹤衛星軌道、監測衛星健康狀況
  • 上傳站:向衛星發送校正資料和指令

地面站的主要職責是確保衛星位置精確,校正衛星軌道和時鐘誤差。

3. 使用者部分(User Segment)

使用者部分由全球各地的GPS接收器組成,包括:

  • 手機應用程式
  • 汽車導航系統
  • 航空器和船舶導航設備
  • 測量和測繪儀器
  • 運動和健身追蹤裝置

GPS如何確定位置

GPS定位的核心技術基於「三邊測量法」(Trilateration)原理,它通過測量與多顆衛星的距離來確定位置:

三邊測量法的基本原理

  1. 距離測量:GPS接收器測量它與每顆可見衛星之間的距離
  2. 形成球面:每顆衛星產生一個以衛星為中心、半徑等於測量距離的虛擬球面
  3. 交點定位:
    • 一顆衛星:接收器可能在該衛星為中心的球面上的任何一點
    • 兩顆衛星:接收器位於兩個球面相交形成的圓上的某一點
    • 三顆衛星:接收器位於三個球面的交點處(理論上有兩個交點,一個在地球表面,另一個在太空中,系統會忽略太空中的點)
    • 四顆衛星:用於校正時間誤差並提供高度信息
衛星1->GPS接收器: 發送位置和時間信號
衛星2->GPS接收器: 發送位置和時間信號
衛星3->GPS接收器: 發送位置和時間信號
衛星4->GPS接收器: 發送位置和時間信號
Note right of GPS接收器: 計算與每顆衛星的距離
GPS接收器-->使用者: 顯示三維位置(經度、緯度、高度)

距離計算方法

GPS系統通過測量信號傳播時間來計算距離:

  1. 衛星發送包含發送時間的信號
  2. 接收器接收信號並記錄接收時間
  3. 計算信號傳播時間(接收時間減去發送時間)
  4. 距離 = 傳播時間 × 光速(約299,792.458公里/秒)

注意:由於時間測量必須極其精確,即使納秒級的誤差也會導致定位偏差。這就是為什麼GPS衛星配備了精確的原子鐘,而且需要至少四顆衛星來校正接收器時鐘誤差。

GPS的精確度與誤差來源

GPS系統的精確度受到多種因素影響:

誤差來源 說明 誤差範圍
大氣層延遲 信號通過電離層和對流層時減速 0.5-5米
衛星時鐘誤差 衛星原子鐘的微小偏差 0-2.5米
多路徑效應 信號從建築物和地形反射 0-1米
接收器誤差 設備內部電子元件的誤差 0-1米
衛星幾何分布 可見衛星的空間分布 變化較大

精確度提升技術

為了提高GPS的精確度,現代系統採用了多種改進技術:

  • 差分GPS(DGPS):使用固定地面站提供校正信息
  • 即時動態定位(RTK):能實現厘米級精度
  • 輔助GPS(A-GPS):使用蜂窩網絡數據加速初始定位
  • 多系統接收器:同時使用多種衛星導航系統(GPS、GLONASS、北斗、伽利略等)

全球衛星導航系統(GNSS)

除了美國的GPS,目前全球還有其他衛星導航系統:

  • GLONASS:俄羅斯的全球導航衛星系統
  • 北斗:中國的導航衛星系統
  • 伽利略:歐盟的衛星導航系統
  • QZSS:日本的區域衛星導航系統
  • NavIC:印度的區域衛星導航系統

現代接收器通常可以同時接收多種系統的信號,提高定位的可靠性和精確度。

GPS在日常生活中的應用

交通與運輸

  • 汽車導航
  • 共享單車和電動滑板車定位
  • 航空和航海導航
  • 物流和車隊管理

科學與研究

  • 地質測量
  • 氣象研究
  • 地殼變形監測
  • 野生動物遷徙研究

戶外活動

  • 登山和遠足
  • 地理尋寶(Geocaching)
  • 跑步和騎行路線追蹤
  • 釣魚和狩獵位置標記

緊急服務

  • 救援任務定位
  • 緊急呼叫定位(E911)
  • 災難管理和協調

自建GPS系統的未來發展

GPS技術持續進化,未來發展方向包括:

  • 高精度定位:通過新一代衛星提供厘米級精度
  • 抗干擾能力:更強的抗電子干擾和欺騙信號能力
  • 室內定位:克服建築物阻礙信號的限制
  • 低功耗接收器:適用於物聯網設備的超低功耗GPS晶片
  • 人工智能整合:智能化的定位和導航系統

常見問題解答

GPS在沒有網絡連接的情況下能工作嗎?

是的,GPS接收定位信號不需要網絡連接。然而,許多導航應用需要網絡來下載地圖數據。

GPS信號能穿透建築物嗎?

一般來說,GPS信號很難穿透厚實的建築物、地下或山洞,這就是為什麼在室內或城市峽谷中GPS定位可能不準確。

GPS接收器會消耗大量電池嗎?

GPS接收確實會增加設備的耗電量,但現代晶片已經大大提高了能效。許多智能手機會在不使用時自動關閉GPS以節省電量。

有沒有免費的GPS導航應用?

有許多免費的GPS導航應用可用,如Google地圖、Apple地圖、OSMAnd等,它們提供了良好的基本導航功能。

結論

全球定位系統已經從最初的軍事技術演變成為現代生活中不可或缺的工具。無論是幫助我們找到目的地,追蹤運動表現,還是支援科學研究和緊急救援,GPS都在悄無聲息地改變著我們與世界互動的方式。隨著技術的不斷進步,我們可以期待GPS和衛星導航系統在未來提供更精確、更可靠的定位服務。

參考資源


本文最初發布於 HackMD @BASHCAT。

無線電新手指南:入門必知基礎知識

🔍 這篇文章專為完全沒有無線電經驗的新手撰寫,幫助你快速上手使用無線電對講機。

📻 一、無線電是什麼?基本原理

無線電通訊就像是「隔空對話」,通過電磁波在空氣中傳遞聲音。

基本工作原理

🌊 想像一下在平靜的湖面丟石頭產生波紋。無線電發射器就像丟石頭的人,產生電磁波(波紋);無線電接收器則像湖邊的人,感知到這些波紋。

簡單來說,無線電通訊流程如下:

  1. 你說話 → 麥克風把聲音轉為電信號
  2. 發射器將電信號「編碼」到無線電波上(稱為調變)
  3. 天線發射這些無線電波到空中
  4. 接收端的天線捕獲這些無線電波
  5. 接收器「解碼」信號(稱為解調)
  6. 喇叭將電信號轉回聲音,讓對方聽見

調變方式(AM 與 FM)

無線電有兩種主要的調變方式:

調變方式 全名 工作原理 常見用途
AM 振幅調變 改變電波的強度來傳輸聲音 航空通訊、廣播電台
FM 頻率調變 改變電波的頻率來傳輸聲音 手持對講機、FM收音機

👉 新手須知:大多數一般手持對講機都使用 FM 調變,因為 FM 抗干擾能力較強,音質更清晰。

🎛️ 二、無線電設備類型

常見無線電設備類型

根據使用情境和功能,無線電設備大致可分為:

  1. 手持對講機(俗稱「大哥大」)

    • 優點:攜帶方便,操作簡單
    • 缺點:功率較小,通訊距離有限
    • 常見品牌:QUANSHENG(全勝)、Baofeng(寶鋒)、Motorola(摩托羅拉)
  2. 車載/基地台無線電

    • 優點:功率較大,通訊距離遠
    • 缺點:體積大,需要固定安裝
    • 適用:長距離通訊、固定點使用

業餘無線電 vs. 免執照對講機

類型 功率 頻率範圍 是否需要執照 特點
業餘無線電 較高(5W以上) 多頻段(144/430MHz等) 需要執照 功能多,距離遠
免執照對講機 較低(≤0.5W) 限定頻段(446MHz) 不需執照 簡單易用,距離短

🔍 新手建議:剛入門可以先使用免執照對講機(如 FRS 頻段的對講機)熟悉基本操作,之後再考慮考取業餘無線電執照。

📶 三、頻率和波段知識

台灣常用頻段

台灣常見的無線電頻段及用途:

頻段 頻率範圍 用途 是否需要執照
FRS 446.00625446.09375 MHz 短距離免執照對講 不需執照
VHF 144146 MHz 業餘無線電通訊 需要執照
UHF 430440 MHz 業餘無線電通訊 需要執照
航空頻段 118136 MHz 航空通訊(AM調變) 禁止非相關人員使用

北台灣常用頻率

📡 北台灣常用頻率:

  • 免執照合法使用:

    • 446.025 MHz(FRS頻道)
    • 446.050 MHz(FRS頻道)
  • 需要業餘無線電執照:

    • 145.000 MHz(北部中繼頻道「北145」)
    • 144.600 MHz、144.700 MHz(常用中繼頻道)
    • 433.000 MHz、435.000 MHz(常用UHF頻道)

⚠️ 特別注意:

  • 未持有執照者使用業餘頻段可能會被罰鍰或沒收設備
  • 即使設備可以接收航空頻段,非相關人員也不應傳輸

📜 四、台灣無線電法規知識

業餘無線電執照分級

台灣的業餘無線電執照分為三級:

等級 呼號前綴 可用頻段 最大功率 備註
甲級(一等) BM 全頻段 視頻段而定(最高) 最高等級
乙級(二等) BN 較多頻段 視頻段而定(中等) 中等級別
丙級(三等) BX、BQ、BZ 限定頻段 視頻段而定(較低) 入門級別

呼號解析

台灣業餘無線電呼號格式:BX#ABC

  • 第12位:等級識別(BM、BN、BX等)
  • 第3位:地區代碼
    • 0:台北市、新北市、基隆市
    • 1:桃園、新竹、苗栗
    • 2:台中、彰化、南投
    • 3:嘉義、雲林、台南
    • 4:高雄、屏東
    • 5:宜蘭、花蓮、台東
    • 6:澎湖、金門、馬祖等離島
  • 第46位:個人識別碼

例如:BX0ABC 表示丙級業餘無線電,註冊於北部地區。

執照申請流程

  1. 準備資料:身分證、照片、報名費
  2. 報名測試:向國家通訊傳播委員會(NCC)或委託機構報名
  3. 參加測試:筆試(選擇題)
  4. 測試通過:取得業餘無線電人員執照
  5. 申請電台執照:憑人員執照申請電台設置核准
  6. 設置電台:依核准內容設置電台
  7. 電台審驗:通過審驗後取得電台執照

📌 新手建議:可先考取入門級的「丙級業餘無線電執照」,考題相對簡單,主要測試基本操作與法規知識。

⚙️ 五、基本設定指南

頻率設定

大多數手持對講機都有兩種設定頻率的方式:

  1. 頻道模式:使用預設頻道(如CH-1、CH-16等)
  2. VFO模式:直接輸入頻率(如145.000 MHz)

🔧 設定步驟(以QUANSHENG為例):

  1. 切換到VFO模式(通常按MODE或VFO/MR鍵)
  2. 直接輸入數字(如145000代表145.000MHz)
  3. 按確認鍵(通常是MENU或ENTER)

Squelch(靜音閾值)設定

Squelch是控制接收門檻的重要設定,可減少白噪音(沙沙聲)。

🔧 設定步驟(以QUANSHENG為例):

  1. 按MENU鍵
  2. 選擇SQL/Squelch選項(通常是選單16)
  3. 按MENU確認
  4. 使用上下鍵調整數值(09)
  5. 再次按MENU確認
  6. 按EXIT返回

💡 建議設定值:

  • 0:永遠開啟喇叭(任何雜訊都會放出)
  • 1-2:適合訊號很強時,白噪較多
  • 3-5:建議設定,可過濾一般雜訊
  • 6-9:只接受非常強的信號,可能收不到弱訊號

CTCSS/DCS設定(副音頻/數位靜音碼)

CTCSS(Continuous Tone-Coded Squelch System,副音頻)可以讓你的無線電只接收設定了相同副音頻的信號,避免干擾。

🔧 設定步驟(以QUANSHENG為例):

  1. 按MENU鍵
  2. 選擇T-CTCS(發射副音)或R-CTCS(接收副音)
  3. 按MENU確認
  4. 使用上下鍵選擇值(如67.0、100.0Hz等)或OFF
  5. 按MENU確認
  6. 按EXIT返回

💡 使用提示:

  • 雙方必須設定相同的CTCSS才能互相通訊
  • 若設定不同,即使頻率相同也聽不到對方
  • 不需要時可設為OFF

🔄 六、常用功能解釋

常見功能與按鍵

按鍵/功能 全名 功能說明
PTT Push-To-Talk 發射鍵,按下說話,放開接收
CALL Call 呼叫鍵,發送呼叫提示音
MONI/MON Monitor 監聽鍵,暫時關閉靜音功能
VFO/MR VFO/Memory 切換頻率模式/頻道模式

其他常用功能設定

功能 說明 建議設定
VOX 聲控功能,聲音啟動發射 一般設為OFF,特殊需求時再開啟
TOT 發射超時計時器 建議設為60秒左右,防止過長發射
ABR 自動背光熄滅時間 白天設為35秒,夜間可設為0(常亮)
SAVE 省電模式 建議開啟,延長電池壽命
BEEP 按鍵音 依個人喜好設定

ABR(背光)設定

ABR(Auto Backlight Return)控制螢幕背光多久後自動熄滅:

ABR值 功能說明
0 背光常亮,不會自動關閉(耗電最多)
15 單位是秒,表示無操作後幾秒熄滅背光
越大的值 背光維持越久,電池耗電稍多

✅ 建議設定:

  • 白天戶外、想省電:設為35秒
  • 夜間使用、常看螢幕:設為0或5以上
  • 錄影錄音需螢幕常亮:設為0(不關閉)

❓ 七、常見問題排解

白噪音問題

問題:接收時總是有沙沙聲(白噪音) 可能原因與解決方法:

  1. Squelch設定太低

    • 解決方法:調高Squelch值(建議35)
  2. 未啟用CTCSS/DCS,但對方有開

    • 解決方法:雙方都關閉CTCSS/DCS或設定相同的值
  3. 接收到開路訊號/干擾

    • 解決方法:提高squelch值或換個頻道
  4. 自動喇叭開啟(Monitor Mode)

    • 解決方法:確認沒有誤按「MON」鍵,長按MON鍵可關閉

TX沒發送時白噪音大

問題:對講功能正常,但在沒發射時接收端白噪音大聲 解決方法:

  1. 調整SQL(Squelch)到34
  2. 檢查是否不小心按下「監聽鍵」(MON)
  3. 檢查CTCSS/DCS設定是否一致
  4. 換一個乾淨頻道測試

其他常見問題

問題 可能原因 解決方法
完全沒聲音 Squelch太高 降低Squelch值
對方聽不到我說話 發射功率低、頻率不對 確認發射功率、檢查頻率設定
電池快速耗盡 功率太高或省電模式關閉 降低發射功率、開啟省電模式
通話距離太短 天線問題、地形阻礙 更換好天線、移動到高處

📚 八、無線電常用術語表

術語 全名 中文解釋
TX Transmit 發射
RX Receive 接收
PTT Push-To-Talk 發射鍵
SQL Squelch 靜音閾值
VFO Variable Frequency Oscillator 可變頻率振盪器,即直接輸入頻率模式
CTCSS Continuous Tone-Coded Squelch System 連續音頻編碼靜音系統(副音)
DCS Digital-Coded Squelch 數位編碼靜音系統
TOT Time-Out Timer 發射超時計時器
VOX Voice Operated Exchange 聲控發射
ABR Auto Backlight Return 自動背光熄滅時間
HAM Ham Radio(Amateur Radio) 業餘無線電(火腿)
HT Handheld Transceiver 手持無線電收發器(對講機)

🔗 九、進一步學習資源

  1. 考照資源:

    測試須知:(108年6月10日修正) 1.一、二、三等業餘人員資格測試舉辦日期:每星期一、星期三、星期五,逢假日不另行舉辦 2.每星期一及星期五採現場報名,隨報隨考,不需預約,報名時間9:0011:20,14:0016:20 3.每星期三採預約報名,以團體優先 4.測試當日同一等級測試不及格者,可重新再報考1次並繳交報名費200元

    業餘無線電人員線上模擬測試 (https://nccmember.ncc.gov.tw/exam/application/exam/examc07new.aspx)

    北區監理處地址:臺北市中正區濟南路二段14號,連絡電話:02-33438952 中區監理處地址:臺中市南屯區黎明路2段660號,連絡電話:04-22500210 南區監理處地址:高雄市新興區錦田路142號,連絡電話:07-8599219

  2. 社群資源:

  3. 頻率資源:


希望這份無線電新手指南能幫助你快速上手無線電對講機的使用!如果有其他問題,歡迎隨時提問。

73!(無線電行話,意為「敬禮」,是愛好者間的問候語)


本文最初發布於 HackMD @BASHCAT。

Meshtastic 使用場景

強化台灣的數位韌性:利用 Meshtastic 構建社區網絡安全網

什麼是Meshtastic? Meshtastic 是一個開源的離網通訊系統,基於 LoRa 技術,可實現長距離、低功耗的無線通訊,且不需要依賴於互聯網或行動網絡。這種網狀網絡系統允許多個節點互相連接,形成自組織網絡,從而在沒有傳統通訊設施的環境中提供可靠的通訊解決方案。

在面對自然災害和緊急情況時,傳統的通信網絡常常會遇到中斷的問題。台灣,一個地震頻繁且颱風經常侵襲的島嶼,對於強化數位韌性的需求尤為迫切。此時,Meshtastic 這一基於 LoRa 技術的開源網絡解決方案,為台灣社區提供了一個獨特而有效的溝通方式。

Meshtastic 是一個去中心化的網狀網絡系統,能夠在無需依賴手機網絡或網際網路的情況下運作。這意味著即使在最偏遠的山區或在傳統通信基礎設施受損的災難情況下,Meshtastic 裝置依然能夠實現端到端的通訊。它的應用不僅限於災難應對,也包括日常生活中的社區互助和信息共享。


Meshtastic 的技術優勢

  • 無需許可證: 大多數地區可以免許可使用 LoRa 頻段,不像業餘無線電需要執照
  • 低功耗: 設備可以使用電池長時間運行,非常適合野外和緊急情況使用
  • 自組織網絡: 每個設備既是發送者也是中繼站,能自動擴展網絡範圍
  • 加密通訊: 所有訊息都經過加密,提供私密安全的通訊
  • 開源方案: 完全開源的硬件和軟件,可以根據需求進行定制和擴展
  • 低成本部署: 相較於傳統通訊系統,部署成本低,適合社區自主建設

實際應用場景

面對地震和其他天災

台灣位於太平洋地震帶,經常發生地震,強震可能會導致嚴重的基礎設施損壞,包括破壞通訊塔和電力網絡。在這些災害發生後的首幾小時,迅速而可靠的通訊尤其重要。Meshtastic 裝置由於其耐用性和獨立於傳統網絡的特性,成為災害應對中一個寶貴的工具。它可以幫助救災團隊協調行動,有效進行搜救任務,並且在關鍵時刻使受災居民得以互相聯繫和提供彼此支持。

Meshtastic的地震通報功能是由 Oliver0804 維護,這項功能串接了中央氣象局的進階版本 API。目的是為了在信號不良的環境中,如偏遠地區或登山路徑,提供使用者重要的地震警報信息。由於 Meshtastic 系統的通訊可能不是絕對即時,並且無法提供精確的地理座標信息,因此這個地震通報功能並不實行與台灣地牛翻身系統相同的即時警報策略。 相反,它旨在讓用戶知道他們所在的區域是否存在潛在危險,從而幫助他們做出是否繼續當前行程的決策。這項服務特別適合那些在偏遠或訊號不佳地區活動的人群,如登山者或探險家,為他們提供額外的安全防範措施。

作者Github [BASHCAT](https://github.com/Oliver0804) https://github.com/Oliver0804

地震通報機制目前測試中 441214172_1489341648647640_3889184645701438230_n

使用英文的地震報告,也可以在OLED有良好的顯示效果 目前已先改為中文,主要因為單筆訊息上限為228字元,英文如直接採用氣象局報告,會出現無法傳輸狀況(待修正)

![441285774_8374598445889597_7390305352891841032_n](https://hackmd.io/_uploads/ByHIASsG0.jpg =400x300)

登山救助和野外探險

台灣的山岳地形吸引了大量的登山愛好者,但山區常常面臨信號涵蓋不足的問題,尤其在偏遠和高海拔地區。在這些情況下,Meshtastic 提供了一個獨特的解決方案,可以極大地增強山區救援的效率和安全性。

根據搜尋結果顯示,Meshtastic 已經在實際應用中取得顯著成效。例如,有報導描述如何利用兩個 Meshtastic 設備在15分鐘內成功找回在荒野中走失的寵物狗。這種無需依賴手機信號、能自建無線網格網絡穿透密林的通訊方式,在某些情況下甚至比傳統GPS更可靠。

Meshtastic 在登山和野外活動中的主要優勢包括:
  • 延伸通訊範圍: 透過每個設備的中繼功能,能覆蓋更廣闊的區域
  • 即時位置共享: 團隊成員間可互相看到對方的GPS位置
  • 路徑追蹤: 記錄行進路線,便於回程或救援
  • 緊急求助: 可向網絡內其他成員發送SOS訊息
  • 氣象資訊: 結合其他系統可提供實時氣象預警
  • 低功耗運行: 單次充電可長時間使用,適合多日旅程

同時也可以提供登山人員近期氣候預報地震區域示警...。

IMG_1237

社區防災網絡建設

在台灣各社區,尤其是位於地震、颱風等自然災害高風險區域的社區,可以考慮建立基於 Meshtastic 的防災通訊網絡。這種網絡可以在緊急狀態下作為重要的資訊傳遞管道,同時也能在平時用於社區活動和日常溝通。

社區防災網絡的構建建議:
  1. 高點部署: 將節點設備安裝在社區內的高處,如大樓樓頂、學校屋頂等
  2. 24小時運行: 保持節點全天候運作,確保網絡的連續性
  3. 電源備援: 配置太陽能板或備用電池,保證斷電時仍能運行
  4. 定期測試: 組織社區成員進行通訊演練,熟悉設備使用
  5. 與政府合作: 與當地政府防災部門建立連接,提高協調效率

設備選擇與部署建議

選擇 Meshtastic 設備時,需要考慮以下因素:

  • 硬件配置: 選擇適合您使用場景的處理器、天線和電池容量
  • 頻段匹配: 確保設備支持台灣地區的頻段(923MHz)感謝Sean Young提醒
  • 防水等級: 戶外使用需考慮防水防塵性能
  • 尺寸重量: 攜帶便利性考量
  • 擴展接口: 是否需要連接外部傳感器或設備
### 提高通訊範圍的技巧
  1. 天線高度: 天線的高度對信號覆蓋範圍影響極大,每增加一米高度,視距可增加約一公里
  2. 天線選擇: 在使用者較少的地區,建議使用性能更好的天線,注意頻段必須匹配
  3. 節點位置: 選擇高處安裝節點,如高樓樓頂或山頂,可大幅提升覆蓋範圍
  4. 角色設定: 大多數情況下選擇CLIENT角色;移動設備選擇CLIENT_MUTE;只有在極高點才考慮ROUTER角色
  5. 視距計算: 使用視距計算工具來估算最佳放置位置,通常視距即為最大有效通訊範圍

結語

Meshtastic 作為一種創新的通訊解決方案,在台灣這樣的地理環境和社會背景下具有獨特價值。無論是應對自然災害、增強戶外活動安全,還是強化社區韌性,Meshtastic 都提供了一個值得探索和實施的選擇。隨著使用者社群的擴大和技術的不斷進步,我們可以期待 Meshtastic 在未來發揮更大的作用,為台灣的數位韌性建設貢獻力量。


本文最初發布於 HackMD @BASHCAT。

前言

截圖 2024-05-08 下午1.50.17

image

[toc]

截圖 2024-05-03 上午11.49.19 大家好,我是BASHCAT...這是一篇面向一般民眾的 Meshtastic 教學文件,讓你可以快速入門 Meshtastic。

本於核心精神,開源、離網、去中心化、網狀網絡,專為在經濟實惠的低功耗設備上運行而構建:『新手入門必讀』並不會提到太多花裡胡哨的炫技(魔改射頻、多頻段組網),但絕對可以讓你快速建立一個節點加入我們。

07/07更新:注意,Meshtastic在數據傳輸上並非絕對安全,尤其在開啟MQTT模式,未定期更換key的狀況下,更容易發發生數據洩漏、或冒名的狀況。 請不要在Meshtastic傳送機敏訊息或是個人資訊!並不要聽信任何人的指示。

至於經濟實惠呢,以最容易購買到的 Meshtastic裝置 Heltec V3 在台灣有代理商可以購買,售價約在台幣650~720。(跳至購買管道)

截圖 2024-05-09 下午2.30.58

如果有能力,或市場買左岸的產品的朋友,也可至某寶進行採購(這邊不進行而外購買教學~)。

截圖 2024-05-09 下午2.28.54

如果還想要更便宜,或是動手能力更好的朋友,可以參考下面影片採用ESP32+SX12xx系列構成,當然這需要相關的編程經驗或是,多花點心力來建構: {%youtube Ivs6mewt-fw%}

2024/05/03 北台灣節點分佈 截圖 2024-05-03 中午12.29.45

2024/06/29 北台灣節點分佈 SCR-20240629-m3y

Meshtastic 簡介

台灣頻道快速 QRCODE ![439337288_10223250809052381_7504192286148581237_n](https://hackmd.io/_uploads/B1RktkzGR.jpg =300x300) (https://meshtastic.org/e/#CgMSAQEKNxIgisDhHrNpJPlGX3GBJBX6kjuK7KQNp4Z0M7OTDpnX5N4aBk1lc2hUVyUBAAAAKAEwAToCCBAKNhIgy1HciVgpl5Hzh05KJUe_umWUH8XhG3UjR1rvZHfUHFUaClNpZ25hbFRlc3QoATABOgIIIAo2EiDLaOd_zp9Ol__gAUB_6YLBvNGjGkJXQ_3R2omjT7D9JhoKRW1lcmdlbmN5ISgBMAE6AgggEg4IATgIQANIAVARWBBoAQ

Meshtastic Taiwan Community 臺灣鏈網 社群簡介

Meshtastic 介紹 by 何封

Meshtastic官方連結 https://meshtastic.org/

An open source, off-grid, decentralized, mesh network built to run on affordable, low-power devices

Meshtastic 採用 LoRa,一種遠端無線電協定,與 HAM 無線電操作不同,該協定可在大多數地區廣泛使用,無需額外的許可證或認證。

這些無線電旨在重新廣播它們收到的訊息,形成網狀網絡。此設定可確保每個群組成員(包括距離最遠的成員)都可以接收訊息。根據所採用的設定,Meshtastic 裝置支援最多可以同時與其他 100 個裝置互動。

此外,Meshtastic 裝置可以與一部手機配對,讓朋友和家人可以直接向您的 Meshtastic 裝置發送訊息,然後你就可以在 Meshtastic 裝置和手機上看到來自朋友的訊息。值得注意的是,每台 Meshtastic 設備一次只能和一臺手機連線(透過藍牙連線的狀況)。

Meshtastic 使用場景

  • 面對兩岸局勢 在台灣,兩岸緊張局勢可能導致通訊中斷或被干擾,特別是在軍事演習或其他安全事件發生時。Meshtastic 能在這些情況下提供一個可靠的通訊網絡,因為它不依賴於傳統的通訊基礎設施。即使在手機網絡不穩定或中斷的情況下,人們仍然可以通過 Meshtastic 裝置保持聯繫,進行基本的溝通和組織應對措施。

  • 面對地震和其他天災 台灣位於太平洋地震帶,經常發生地震,強震可能會導致嚴重的基礎設施損壞,包括破壞通訊塔和電力網絡。在這些災害發生後的首幾小時,迅速而可靠的通訊尤其重要。Meshtastic 裝置由於其耐用性和獨立於傳統網絡的特性,成為災害應對中一個寶貴的工具。它可以幫助救災團隊協調行動,有效進行搜救任務,並且在關鍵時刻使受災居民得以互相聯繫和提供彼此支持。

    地震通報機制目前測試中 441214172_1489341648647640_3889184645701438230_n

    使用英文的地震報告,也可以在OLED有良好的顯示效果 目前已先改為中文,主要因為單筆訊息上限為228字元,英文如直接採用氣象局報告,會出現無法傳輸狀況(待修正)

    ![441285774_8374598445889597_7390305352891841032_n](https://hackmd.io/_uploads/ByHIASsG0.jpg =400x300)

  • 登山救助 台灣的山岳地形吸引了大量的登山愛好者,但山區常常面臨信號涵蓋不足的問題,尤其在偏遠和高海拔地區。在這些情況下,Meshtastic 提供了一個獨特的解決方案,可以極大地增強山區救援的效率和安全性。

Meshtastic 能做到那些事?


  1. 通訊連接 在偏遠地區進行登山活動時,常規的手機信號可能無法涵蓋,這時 Meshtastic 裝置與裝置之間,能夠自行建立出網路,讓隊員間可以相互通訊,即使在崇山峻嶺之中也不會失聯。這對於在遇到緊急情況時快速反應至關重要。

  2. 即時位置共享 利用 Meshtastic 的地圖和 GPS 功能,隊員可以實時分享他們的位置。這對於救援隊來說是一個寶貴的功能,因為他們可以即時確定失蹤者的最後位置,並更有效地計劃搜救路線。

  3. 救援協調 在發生意外時,快速的協調救援行動是救援成功的關鍵。Meshtastic 能夠幫助救援隊伍在沒有其他通訊手段的情況下,通過裝置直接協調救援行動,包括安排救援路徑、調配資源及處理突發狀況。

新手入門必讀(入門)

在台灣,LoRa (Long Range) 射頻技術的使用需符合國家通信傳輸委員會 (NCC) 的相關規範與標準。這些規範確保了射頻技術的使用不會干擾其他無線通訊服務,並且保護用戶的隱私與安全。

Part 1:環境建置

其實建置 Meshtastic 就像是組電腦一樣,你可以選擇套裝電腦,或是有動手能力的,也可以自行組裝,因為 Meshtastic 架構開源的特性,你也可以自行修改程式原始碼執行,但相對的門檻較高。

給新手的提示: 1. 任何射頻裝置,請務必先安裝天線後再進行開機,Meshtastic 也是一樣,要養成好習慣。 2. 請在確認接下來不會需要使用藍牙與裝置連線時,才開啟WI-FI模式。Meshtastic ESP32 的開發板可以開啓 WI-FI 功能,但只能藍牙/WI-FI二選一,不小心開啟的朋友可以透過電腦+裝置IP與裝置連線,或者是使用 USB 與電腦或是安卓手機連線後重新開啓藍牙功能,不一定要重新刷韌體喔。 3. iOS版本中 設定>裝置>Managed Device 選項在尚未完成所有配置前,請先不要開啟,否則會無法透過BLE進行設定,可以跟第2點一樣進行 USB 與電腦或是安卓手機連線後修改回來唷。

快速懶人包

1.硬體的選擇

入門建議使用 HeltecV3、登山與戶外運動者可嘗試跨國購買 LILYGO TTGO T-Echo

2.確認韌體版本或是燒寫韌體

Meshtastic 功能還在持續成長中,若有需要更新韌體,可以參考 https://www.facebook.com/groups/meshtastictw/permalink/414578450951353/

3.軟體設定

需要設定的有:
    使用藍牙連上設備,輸入 Meshtastic 裝置螢幕上顯示的 PIN 碼
    裝置使用地區原先預設是 UNNET,請設定為 TW 
    設定裝置的長名稱與短名稱
    點擊本文章的 QRCODE,或使用掃描方式,加入臺灣的頻道(可以視爲聊天室)設定

4.發送數據

可以挑選頻道(聊天室):MESH TW 或是 SignalTest 跟大家打聲招呼

5.設定 GPS 或開啟 FixedGPS 資訊


再次貼心小提醒,任何射頻裝置,在設備上電前,請確保天線安裝妥當,並且安裝正確的頻率,否則可能損害設備


硬體篇

照片 介紹 補充資料
HeltecV3 Heltec V3- 這款裝置結合了 ESP32 和 LoRa,並有一個 OLED 顯示器,方便顯示訊息和狀態(也是目前台灣最多人使用的裝置)。
TTGO TTGO T-Beam - 擁有 GPS 模組和 LoRa 無線模組,背後有一組 18650 電池座,非常適合戶外使用。也相當容易從網路上找到對應的外殼進行 3D 列印。
截圖 2024-05-03 中午12.04.55 NRF52840 - ,可使用原廠開發板或購買台灣勁達 EVB ,此項為低功耗的藍牙開發板,但不具有 WI-FI 功能,入門門檻較高,適合有長時間待機的節點使用。
RAK4631 RAK4631 - 這是一個模組化解決方案, NRF52+LoRa 整合模組的方案。適合配合太陽能板搭建節點。
SCR-20240629-mom LILYGO T-Echo - 這是一臺開箱即用的裝置,採用 NRF 技術與電子紙螢幕,因此會比 ESP32 系列裝置來的省電。內建 GPS,因此會主推給登山愛好者。目前臺灣沒有代理,需從海外購買。
  • 要如何與 Meshtastic 裝置連線 根據不同裝置所可以使用的介面與工具不同,大致上可分為:
    • BLE 低功耗藍牙進行連接(建議的連線方式)
    • USB 介面 內部 USB to TTL 連接 可配合桌面應用程式或是
      • PythonCli
      • WebClient 當設備的設定頁面消失時,可以使用此工具進行修復
    • WIFI 連接
    • Android 手機 OTA連接 作為 NRF52 系列的一個韌體更新方式

韌體篇

通常在台灣購買 HeltecV3 時,可以付費請商家協助進行韌體的更新。 如果買到的設備無預先燒錄韌體,可以參考下方 flaher 工具,裡面可以選擇不同廠牌的裝置與版本。 https://flasher.meshtastic.org/ 使用工具前要先進入燒綠模式(ESP32base),有兩個方式: ~1. 在未接電的狀況下,按住 PROG/BOOT 按鈕:在連接電源或 USB 線之前,按住此按鈕,上電即會進入。 2. 在已接電的狀況下連接裝置:在繼續按住 PROG/BOOT 按鈕的同時,按下RST後釋放RST,此時PROG/BOOT才能將其放開。

這邊有詳細說明 by 何封: 434851390_10223161407857407_5019292819019651219_n https://www.facebook.com/groups/meshtastictw/permalink/414578450951353/

軟體篇

射頻篇

  • 在臺灣,LoRa 的合法使用頻段爲 920Mhz ~ 925 Mhz。
  • 台灣 Meshtastic 預設使用 923Mhz,切換到其他頻段,不但會有違法的風險,也會無法和其他裝置通聯。
  • 補充資訊
    • LoRa(Long Range) 915 MHz 頻段是一種專為長距離低功耗通訊設計的技術,具有幾個顯著特性,使其在各種應用中都非常實用。以下是 LoRa 915 MHz 頻段的一些關鍵特性和可能的影響因素:
    • LoRa 915 MHz 的特性 長距離傳輸:LoRa 915 MHz 能夠提供遠距離的無線通訊能力,常見的通訊距離可以達到2-5公里(城市環境)和15公里(開放或郊區環境),這得益於其低數據傳輸速率和強大的信號調變技術。 高穿透力:915 MHz 頻段具有良好的建築物穿透能力,這使其在城市和室內環境中也能保持較好的通訊連接,適合於室內外結合的應用。 低功耗:LoRa 技術以其極低的功耗著稱,這使得在電池供電的設備上非常實用。
    • 受影響的因素 干擾:由於 915 MHz 是非授權頻段,它可能會受到其他使用相同或相鄰頻段設備的干擾,例如:其他無線設備、手機基地台、某些家用電子產品等。 地理和環境因素:山脈、高樓、樹木等自然和人造障礙物可以影響 915 MHz 信號的傳播距離和品質。 天氣條件:極端的天氣條件,如雨、雪和濃霧,可能會減弱射頻信號,尤其是在更長的傳輸距離上。 法規限制:不同國家和地區對於 915 MHz 頻段的使用有不同的法規限制,這可能會影響設備的功率輸出、頻道分配和運作模式。

Part 2:基本功能

裝置形態

裝置角色 描述 最佳使用場景
CLIENT 可連接應用程式或做爲獨立的消息傳送裝置。 一般人在使用時都是選擇這個。支持客戶端應用。
CLIENT_MUTE 不轉發其他裝置的數據包的裝置。 當設備需要參與網絡,但不協助轉發接收到的數據包時,以減少網絡負荷的情況。
CLIENT_HIDDEN 僅在需要時廣播,以實現隱蔽或節省電力。 用於隱藏/秘密部署或在仍參與網絡的同時減少空中時間/功耗。
TRACKER 優先廣播 GPS 位置數據包。 跟踪個人或資產的位置,特別是在需要即時且高效的位置更新的情境中。
LOST_AND_FOUND 定期向預設頻道發送位置消息以協助找回設備。 用於協助找回丟失的設備。
SENSOR 優先廣播遙測數據包。 在需要收集環境或其他感測數據的情景中部署,具有高效的能源使用和頻繁更新。
TAK 最佳化 ATAK 系統通信,減少常規廣播。 與 ATAK 系統整合(通過 Meshtastic ATAK 插件),用於戰術或協調操作中的通信。
TAK_TRACKER 啟用自動 TAK PLI 廣播並減少常規廣播。 獨立的 TAK PLI 整合,用於戰術或協調操作中的通信。
REPEATER 通過最小開銷中繼消息來擴展網絡涵蓋的基礎設施節點。不顯示在節點列表中。 最佳放置於戰略位置以最大化網絡整體覆蓋。設備在拓撲中不顯示。
ROUTER 通過中繼消息擴展網絡覆蓋的基礎設施節點。顯示在節點列表中。 最佳放置於戰略位置以最大化網絡整體涵蓋。設備在拓撲中顯示。
ROUTER_CLIENT ROUTER 和 CLIENT 的結合體。不適用於移動設備。 放置於戰略位置,需要優先路由的設備,同時也充當標準 CLIENT。

不同模式下工作狀態

裝置角色 BLE/WiFi/序列埠 螢幕啟用 耗電量 重傳 優先路由 在節點列表中可見
CLIENT 是 是 常規 是 否 是
CLIENT_MUTE 是 是 最低 否 否 是
CLIENT_HIDDEN 是 是 最低 僅本地 否 否
TRACKER 是 否 常規 否 否 是
LOST_AND_FOUND 是 否 常規 否 否 是
SENSOR 是 否 高 否 否 是
TAK 是 可選 常規 是 否 是
TAK_TRACKER 是 可選 常規 是 否 是
ROUTER 否1 否 高 是 是 是
ROUTER_CLIENT 是 是 最高 是 是 是
REPEATER 是 否 高 是 是 否

如何讓節點出現在地圖中

https://www.facebook.com/groups/meshtastictw/permalink/415687787507086/

建立/加入網絡

MQTT 使用與設定

若你所在區域的 Meshtastic 覆蓋率還不高,或是因爲四週都是高樓大廈導致無法穩定的收到其他裝置的 LoRa 訊號,那你就需要需要開啓 MQTT ,來利用網際網路傳送訊息,設定方法如下:

  • Android app

    • Radio configuration(裝備設定) → Lora → 不要勾選 Ignore MQTT → 按下 Send → 裝置會重開機,等它開完機並重新連上手機
    • 回到 Radio configuration(裝備設定) → 往下捲動找到 MQTT → 打開 MQTT enabled 開關 → 打開 Encryption enabled 開關 → 打開 Proxy to client enabled 開關(讓裝置透過手機的網路來接收與傳送訊息) → (其他的開關都不用開)→ 按下 Send → 裝置會重開機,等它開完機並重新連上手機即完成
    • 同樣在 MQTT 的設定頁面,Root Topic 的部分確保設定爲 msh/TW,不要是 msh/TW/XXX 之類的,只要 msh/TW 就好,不然會收不到其他人的訊息
  • iOS app

    • 設定頁 → LoRa → 不要勾選 Ignore MQTT → 按下儲存 → 裝置會重開機,等它開完機並重新連上手機

    • 設定頁 → 往下捲動找到 MQTT → 從畫面最上方數起,第 1 2 3 4 個選項的開關打開。 451786627_792825912839187_4315039696692845276_n

    • 同樣在 MQTT 的設定頁面,Root Topic 的部分確保設定爲 msh/TW,不要是 msh/TW/XXX 之類的,只要 msh/TW 就好,不然會收不到其他人的訊息

    • 確認後按下儲存 → 裝置會重開機,等它開完機並重新連上手機即完成

  • 在使用 MQTT 時,因爲是透過手機網路來接收與傳送訊息,因此請不要把手機網路關掉唷。

發送和接收訊息

教使用者如何透過裝置發送文本訊息和接收來自其他裝置的訊息。

Part 3:進階使用

  • 自訂設定 - 解釋如何通過應用程式自訂裝置設定,如更改頻率、調整發射功率等。
  • 群組通訊 - 介紹如何在 Meshtastic 裝置間設立和管理群組通訊。
  • 連接外部設備 - 講解如何將 Meshtastic 裝置與其他設備如: GPS 或氣象儀器連接。

Part 4:日常維護與常見問題

日常維護

對於太陽能節點

1. 檢查太陽能板清潔度:
    定期清潔太陽能板,去除灰塵、污垢或其他異物,這些都可能阻擋陽光,影響充電效率。
2. 檢查電池狀態:
    定期檢查電池是否需要更換。太陽能系統中的電池壽命有限,長時間使用後可能需要更換。
3. 檢查接線和連接:
    確保所有接線緊固且無腐蝕。接線的松動或腐蝕都會影響系統效能。
    確認系統充電和放電效率:
    定期檢查系統的充電和放電效率,確保太陽能板和電池工作正常。

對於室內LoRa節點

1. 設備擺放位置:
    確保LoRa節點放在通風良好且無電子干擾的地方。避免放置在熱源附近或密封環境中,以免影響性能和壽命。
2. 定期檢查和重啟設備:
    定期檢查設備運行狀況,偶爾重啟設備可以清理內存並解決一些暫時性的問題。
3. 更新固件和軟件:
    定期檢查並更新節點的硬體和軟體,以確保所有功能都能正常工作並擁有最新的安全性更新。
    監控訊號強度和連接穩定性:
    監控節點的訊號強度和連接穩定性,確保訊號覆蓋範圍內無死角,且通信穩定。

常見問題

  • Q.為什麼 GPS 一直沒有訊號? A.GPS 需要於是外使用才能有效進行尋星,當搜到一定數量時,在裝置螢幕上,或是 app 端可以查看到當前座標,或衛星數量。

  • Q.為什麼我的 app 畫面跟群友的不太一樣? A.目前 Meshtastic 在手機端支持的兩大平台(iOS&Android),它們的使用邏輯,與操作方式皆有不同,甚至一些較新的功能會出現在其中一個平臺上,但另一個平臺卻無法使用。另外補充,iOS 可以長按訊息進行進行『回覆』與『回覆表情符號』的功能,但 Android 只能看到訊息依序出現,所以使用 iOS 的朋友要注意一下,Android 朋友實際上看不到你是針對哪一條訊息回覆。

  • Q.設備只有充電指示燈有亮,顯示器與藍牙都連不上? A.請先檢查是否為韌體異常,檢查方式可以使用帶有數據傳輸功能的USB線接上板子。注意,有少部份的USB線材並沒有D+D-數據傳輸線(如行動電源送的),會導致無法排查問題,接上後使用baudrate 115200,連上端口,這時可以按下RST查看打印訊息,正常如下圖: 截圖 2024-05-05 晚上10.07.30 如果沒出現則需要重新下載韌體到板子上。

  • Q.Heltec v3 能否關閉電源? A.長按裝置左上角的按鈕 5 秒鐘,當螢幕顯示 Shutting Down 時就是成功了。按下同一顆按鍵即可喚醒。若是喚醒後感覺秀抖秀抖,可以按一下裝置左下角的按鍵,重新開機。

  • Q.T-beam能否關閉電源? A.長按設備上的電源開關5秒鐘。當設備開機後,通常會有指示燈亮起或OLED顯示LOGO,設備已經成功開機,關機操作也是一樣。

  • Q.為什麼通訊距離這麼短? A.LoRa 和無線電一樣,容易遭遇遮蔽干擾,尤其是建築物,盡可能於『視距通訊』(Line of Sight, LOS)與對方通訊。視距通信是指在發射器和接收器之間的通信路徑上,沒有任何障礙物阻擋,因此信號可以直接傳遞。在視距範圍內,無線電信號的傳輸會更加清晰和穩定,經過實際測試,在沒有阻擋的狀態下,透過 Heltec v3 就可以從林口與汐止的裝置成功通訊。而由於城市內建築物很多,因此會建議大家在自家頂樓架設 Meshtastic 太陽能節點,就可以從高處與遠處的裝置做通聯,由頂樓的節點把資訊轉發給樓下的住戶(也就是你)。

  • Q.HeltecV3 可以工作多久? A. HeltecV3 採用 ESP32 方案,基本待機功耗為 120~130mA 可配合 https://www.digikey.tw/zh/resources/conversion-calculators/conversion-calculator-battery-life 進行待機計算,但要注意計算結果為預估值,實際仍依照電池壽命與使用環境有影響。 截圖 2024-05-05 晚上10.22.19

  • Q.我手上有許多設備,但為在家測試時,通訊時有時無? A.當多個 Meshtastic 設備處於彼此非常接近的位置,並且同時嘗試通信時,可能會發生一種稱為信道飽和或信號干擾的現象。這種情況發生的原因主要是因為所有設備都在同一無線頻段上發送信號,從而導致類似蛙群『共鳴』的狀況。

    1. 可以嘗試關閉幾組設備,或是將其距離拉開。
    2. 可以嘗試從原本的『長距離 快速』切換爲『短距離 快速』的傳輸方式。不過切換後,會無法和其他『長距離 快速』的裝置透過 LoRa 連線。(MQTT 連線則是不影響)
  • Q.433Mhz 與 915Mhz 傳輸的差異? A.在無線通訊領域中,433 MHz 和 915 MHz 都是常用的無線電頻率,主要用於低功耗的短距離通訊,例如物聯網(IoT)裝置、無線遙控器和一些家庭自動化系統。這兩個頻率帶有各自的特點和應用上的差異:

    1. 法規限制: 433 MHz:這個頻率在歐洲和亞洲廣泛使用,但在美國和加拿大的使用受到更嚴格的限制。 915 MHz:主要在美國使用,這個頻率在美國允許較高的發射功率,這使得通訊距離可以更遠。在其他地區,如澳大利亞和一些亞洲國家,也有被使用,但可能有不同的法規限制。
    2. 通信距離和穿透能力: 通常來說,較低的頻率(如433 MHz)可以提供更好的穿透能力(例如穿過牆壁和其他障礙物),但可能有較低的數據傳輸速率。 915 MHz 頻率提供較高的數據傳輸速度,但其穿透能力相比433 MHz 要差一些。
    3. 干擾和擁擠: 由於433 MHz 在多個地區使用較為普遍,可能會遇到更多的干擾,尤其是在人口密集的地區。 915 MHz 雖然在美國較為常用,但由於其使用範圍較窄,相對的干擾可能會較少。
    4. 應用範圍: 433 MHz 適合需要大範圍覆蓋且對數據速率要求不高的應用,如某些類型的家庭自動化系統。 915 MHz 則適用於需要較高數據傳輸速度或較短通訊距離的應用,例如某些高速的物聯網應用。
  • Q.為甚麼我的 iOS app,裝置的設定選單突然不見了?QAQ 這可能表示你與你的裝置現在是處於斷線的狀況(藍牙),請檢查連線確認是否正確連線,或者將 iOS 系統中的藍牙設置移除後重新配對,如配對後仍相同狀況,應該是有去設定到使用者管理的選單,解決辦法有兩種:

    ![截圖 2024-05-10 下午4.08.50](https://hackmd.io/_uploads/SkAfILsGA.png =300x600)

    1. 重新刷韌體,需要完全抹除設置
    2. 使用USB接口連接上電腦後,並使用Web Tools進行重新設定 https://client.meshtastic.org/ 位置在Radio Config>Device>Managed 截圖 2024-05-10 下午4.11.43

    截圖 2024-05-10 下午4.11.21

  • Q.藍牙裝置『偶發』連不上? Meshtastic 使用 BLE 藍牙連線,只能支持同一時間一組裝置,所以連不上時可以依據下面方式確認:

    1. 確保只有一個裝置連上 Meshtastic,如果有使用其他手機或是電腦,有可能會被自動連線占用,請其藍牙關閉或是『遺忘該藍牙裝置』後重新配對,查看是否恢復。
    2. 如果有經過韌體重刷的動作,請於手機端進行『藍牙裝置遺忘』後重新配對,查看是否恢復。
    3. 使用 nrf connect app 進行 BLE Scan,查看是否因為訊號不穩定導致連線失敗。 ![IMG_0469](https://hackmd.io/_uploads/SJxRTYlmC.jpg =500x400) IMG_0470

學習資源

進一步學習資源 - 提供進一步學習的資源,包括官方文檔、在線論壇和社群。

購買管道

各種材料、裝置,可以在這裡買

場勘使用(RF通訊測試)

https://www.facebook.com/groups/meshtastictw/posts/449545847454613/

走火入魔XD(進階延伸)

好還要更好的天線

Q. 我的天線太爛了,我要更好的天線!!(急!在線等... A. 我知道你很急,但你先別急。

待我娓娓道來,Meshtastic 這個開源、離線、去中心化的網狀網路系統,特別設計來運行在價格合理且低功耗的設備上。它基於網狀網路的特性,可以利用LoRa節點進行協力轉發,從而擴展通信距離。當你發出的訊息在地圖上顯示,被一些素未謀面的朋友的節點轉發時,這正展示了 Meshtastic的核心價值。

因此,即使是性價比高的射頻設備,也能有效地進行通訊,不一定需要頂級的天線品質。 對於天線的要求可以不需要達到最高標準,依然能夠達成良好的通訊效果,這才是Mesh用眾人的力量來實現廣域的通聯。

想要更多功能的原始碼修改

使用 vscode + platfomrIO https://github.com/meshtastic/firmware/tree/master

我要漂亮的外殼

截圖 2024-05-03 晚上7.05.31

https://www.printables.com/model/741974-h1-case-for-heltec-v3-running-meshtastic/files

https://www.thingiverse.com/search?q=Heltec+V3&page=1

我要更大的發射功率(請注意當地法規)

如何提升接收的靈敏度

ATAK

https://www.facebook.com/groups/861791915202978

等待整理

截圖 2024-05-10 中午12.30.28

tags: Meshtastic lora

本文最初發布於 HackMD @BASHCAT。

無線電是如何工作的

無線電通訊與Meshtastic指南

無線電是如何工作的

無線電通訊是通過空氣(或其他非物理介質)傳播電磁波來進行資訊交換的技術。無線電波是電磁波的一種,可以在不同的頻率上傳輸聲音、數據或影像。

無線電的基本工作原理:

發射:

  • 調製:將想要傳輸的資訊(如聲音或數據)轉換成適合無線傳輸的形式。這通常涉及將信息信號與一個載波信號結合,過程稱為調製。
  • 放大:增強調製後的信號,使其足以傳輸到目的地。
  • 發射:通過天線將調製和放大後的信號以電磁波形式發射出去。

傳輸:

  • 電磁波沿直線從發射點向外擴散,可以穿過空氣、真空,甚至某些物質。

接收:

  • 捕捉信號:接收天線捕捉由發射天線發射的電磁波。
  • 解調:將接收到的調製信號轉換回原始資訊的過程稱為解調。
  • 處理和輸出:將解調後的信號進行必要的處理,以恢復成可以識別的聲音、圖像或數據形式。

無線電調製的類型

調製是無線通訊的關鍵,它決定了如何將資訊「編碼」到無線電波中

#### 類比調製 1. **振幅調變 (AM)** - 通過改變載波信號的振幅來編碼資訊 - 較易受噪聲干擾,但技術實現簡單 - 常用於廣播電台和航空通訊
  1. 頻率調變 (FM)
    • 通過改變載波信號的頻率來編碼資訊
    • 抗噪性能較好,音質更清晰
    • 廣泛用於FM廣播、無線電對講機等

數位調製

  1. 頻移鍵控 (FSK)

    • 使用不同頻率代表數位1和0
    • 用於低速數據傳輸
  2. 相移鍵控 (PSK)

    • 通過改變載波的相位來表示數據
    • 廣泛用於高速數據通訊
  3. 正交振幅調變 (QAM)

    • 結合振幅和相位調變
    • 用於高效寬頻通訊,如Wi-Fi、4G/5G等

頻率與頻段

無線電頻率範圍從3 Hz到300 GHz,不同頻段有不同用途:

頻段 頻率範圍 主要用途
特低頻 (ELF) 3 Hz - 30 Hz 海底通訊
超低頻 (ULF) 30 Hz - 300 Hz 礦山通訊
甚低頻 (VLF) 3 kHz - 30 kHz 導航、政府通訊
低頻 (LF) 30 kHz - 300 kHz 導航、氣象
中頻 (MF) 300 kHz - 3 MHz AM廣播
高頻 (HF) 3 MHz - 30 MHz 短波廣播、業餘無線電
甚高頻 (VHF) 30 MHz - 300 MHz FM廣播、電視、航空
超高頻 (UHF) 300 MHz - 3 GHz 電視、手機、Wi-Fi
極高頻 (SHF) 3 GHz - 30 GHz 衛星通訊、雷達
太赫頻 (THF) 30 GHz - 300 GHz 天文學、未來通訊技術

Meshtastic 的工作原理

Meshtastic是一個開源、離網、去中心化的網狀網路通訊系統,運行在低成本、低功耗的設備上。

### 核心技術與特點

使用LoRa技術:

  • Meshtastic主要使用**低功耗長距離(LoRa)**技術,這是一種專為小數據量、長距離和低功耗設計的無線通訊方式。
  • LoRa使用展頻調變技術,在在台灣863-928 MHz頻段運行(具體頻率因地區而異)。
  • 在理想條件下,LoRa通訊距離可達16公里。

網狀網路架構:

  • 在Meshtastic網絡中,每個裝置不僅是通訊的終端,還可以作為中繼站,幫助轉發其他裝置的信號。
  • 這樣,即使某些裝置之間沒有直接的通訊線路,信息也可以通過多個中繼點間接傳遞。
  • 依據設定,Meshtastic網狀網路可同時支援多達100個設備。

多點傳輸:

  • 通過LoRa發送的信號可以被網絡中的多個接收器接收。
  • Meshtastic 利用這一特性,結合網狀網路技術,有效擴大了通訊範圍和可靠性。

智能路由:

  • 系統會根據網絡條件和節點的連接狀況智能選擇最佳路由,確保消息能夠有效傳遞。
  • 自動適應網絡變化,形成自我修復網路。

Meshtastic的應用場景

  1. 戶外活動

    • 遠足、登山、露營等沒有手機訊號的地區通訊
    • 團隊成員之間的位置共享和訊息傳遞
  2. 緊急救災

    • 自然災害後通訊基礎設施損壞時的應急通訊
    • 搜救行動中的團隊協調
  3. 遠程地區

    • 缺乏通訊基礎設施的偏遠地區
    • 野外科學考察、探險
  4. 物聯網應用

    • 分佈式傳感器網絡
    • 低頻率數據收集和監控

硬體支援

Meshtastic支援多種硬體平台,包括:

  • T-Beam、T-Echo、T-TWR等TTGO設備
  • Heltec LoRa 32和SX1262系列
  • LILYGO TTGO設備
  • SenseCAP系列
  • 各種基於ESP32和LoRa模組的自製設備

每個Meshtastic設備一次只能與一部手機配對使用

### 使用優勢
  1. 不依賴網絡基礎設施:完全離線運作,不需要網際網路或手機網絡
  2. 開源且可擴展:100%社區驅動的開源項目,持續改進
  3. 低成本:使用價格實惠的硬體設備
  4. 低功耗:設備可以長時間運行,適合野外使用
  5. 加密通訊:提供端到端加密,保護通訊隱私
  6. 易於設置:通過手機應用或電腦軟體輕鬆配置

這種結合了LoRa無線技術和網狀網路的方法使Meshtastic在戶外活動、遠程地區或災難應對等場景下成為一個非常實用的通訊工具。


本文最初發布於 HackMD @BASHCAT。

無線電設定

ℹ️ 提示

Meshtastic 不是 LoRaWAN、Helium 或 TTN (TheThingsNetwork)。Meshtastic 使用指定給各區域 LoRa 技術的完整頻譜範圍。這使得僅在美國區域就有幾百個可能的頻率通道。

ℹ️ 提示

如果將 is_licensed 設定為 true,軟體中的功率限制通常會被解除。查看業餘無線電模式以獲取更多資訊。

歐洲頻段

歐盟國家通常受無線電設備指令(2014/53/EU)及其後續修正案的約束,這些規定隨後被納入當地法律。有關於此的有用資訊位於此處。

以下頻段是根據可用的最大功率和工作週期選擇的。對於特定應用可能可以使用其他頻段,但這些頻段目前不受「開箱即用」的支援。

433 MHz

歐洲允許的最大功率為 +10 dBm ERP (有效輻射功率)。

頻段範圍為 433 至 434 MHz。

使用標準無線電預設值 LongFast 定義了四個頻率槽。出廠重置後,無線電將設定為頻率槽 4,中心頻率為 433.875 MHz。

868 MHz

歐洲允許的最大功率為 +27 dBm ERP (有效輻射功率)。

頻段範圍為 869.40 至 869.65 MHz。這低於定義為 SRD (短距離設備) 頻段的 863–870 MHz 範圍,但允許更高的 ERP 和 10% 的工作週期。

使用標準無線電預設值 LongFast 定義了一個頻率槽。出廠重置後,無線電將設定為頻率槽 1,中心頻率為 869.525 MHz。

值得注意的是,868 MHz 通常是歐洲 Meshtastic 最常用的頻段。

北美頻段

915 MHz (ISM 頻段)

北美的最大輸出功率為 +30 dBm ERP (有效輻射功率)。

頻段範圍為 902 至 928 MHz。

在北美,可用的頻率槽取決於頻寬設定,這包含在所選的無線電預設值中。標準預設值 LongFast 提供 104 個頻率槽。出廠重置後,無線電預設為 LongFast,頻率槽為 0,根據通道雜湊算法,這對應於 20 號槽(中心頻率為 906.875 MHz)。

資料傳輸率

考量因素

配置頻率槽時有各種資料傳輸率選項,這些選項與設備的理論範圍成反比。

  • 擴頻因子 (SF) - 我們如何在時間上「擴展」我們的資料。
    • 擴頻因子每增加一步,傳輸所需的空中時間就會加倍。
    • 擴頻因子每增加一步,可增加約 2.5dB 的額外鏈路預算。
  • 頻寬 - 我們使用頻譜中多大的片段。
    • 頻寬每翻倍,鏈路預算就會減少近 3dB。
    • 除非你有高質量的晶體振盪器,否則小於 31 的頻寬可能不穩定。
  • 編碼率 - 我們編碼多少冗餘來抵抗噪聲。
    • 增加編碼率會增加可靠性,同時降低資料傳輸率。
    • 4/5 - 1.25倍開銷
    • 4/6 - 1.5倍開銷
    • 4/7 - 1.75倍開銷
    • 4/8 - 2倍開銷

預設值

我們有八種 LoRa 無線電預設值。這些是最常見的設置,已被證明效果良好:

無線電預設值 替代預設名稱 資料傳輸率 SF / 符號 編碼率 頻寬 鏈路預算
短距離 / 渦輪 Short Turbo 21.88 kbps 7 / 128 4/5 500 kHz[1] 140dB
短距離 / 快速 Short Fast 10.94 kbps 7 / 128 4/5 250 kHz 143dB
短距離 / 慢速 Short Slow 6.25 kbps 8 / 256 4/5 250 kHz 145.5dB
中距離 / 快速 Medium Fast 3.52 kbps 9 / 512 4/5 250 kHz 148dB
中距離 / 慢速 Medium Slow 1.95 kbps 10 / 1024 4/5 250 kHz 150.5dB
長距離 / 快速 Long Fast 1.07 kbps 11 / 2048 4/5 250 kHz 153dB
長距離 / 適中 Long Moderate 0.34 kbps 11 / 2048 4/8 125 kHz 156dB
長距離 / 慢速 Long Slow 0.18 kbps 12 / 4096 4/8 125 kHz 158.5dB

註

這些計算使用的鏈路預算假設發射功率為 22dBm 且天線增益為 0dB。請根據您實際的設備調整您的鏈路預算假設。此表中的資料傳輸率是理論上的最大值,但未考慮封包標頭、跳躍和重新傳輸。計算基於官方 Semtech LoRa 計算器 的資料。

自定義設定

可以通過使用支援的軟體應用自定義設定。

應用設定後,您需要重新啟動設備。設備重新啟動後,它將產生一個新的加密金鑰,您需要將新生成的 QR[2] 碼或 URL 分享給您的所有其他設備。

一些示例設定:

資料傳輸率 SF / 符號 編碼率 頻寬 鏈路預算 備註
37.50 kbps 6 / 64 4/5 500 kHz 129dB 可能的最快速度
3.125 kbps 8 / 256 4/5 125 kHz 143dB
1.953 kbps 8 / 256 4/8 125 kHz 143dB
1.343 kbps 11 / 2048 4/8 500 kHz 145dB
1.099 kbps 9 / 512 4/8 125 kHz 146dB
0.814 kbps 10 / 1024 4/6 125 kHz 149dB
0.610 kbps 10 / 1024 4/8 125 kHz 149dB
0.488 kbps 11 / 2048 4/6 125 kHz 152dB
0.073 kbps 12 / 4096 4/5 31 kHz 160dB 「長距離 / 慢速」的兩倍範圍和/或覆蓋範圍,低抗噪能力
0.046 kbps 12 / 4096 4/8 31 kHz 160dB 「長距離 / 慢速」的兩倍範圍和/或覆蓋範圍,高抗噪能力

這些計算使用的鏈路預算假設發射功率為 17dBm 且天線增益為 0dB。請根據您實際的設備調整您的鏈路預算假設。

這些頻率槽設定可能尚未經過測試。使用時請自行判斷。在 Meshtastic 討論頁面 分享您的成功或失敗經驗。

加密

設備使用的預共享金鑰 (PSK) 可以是 AES128 或 AES256 序列。或者,可以關閉加密,這在您持有業餘無線電執照的情況下可能會有用。

註腳

[1]: 短距離/渦輪是最快的預設值,也是唯一一個頻寬為 500kHz 的預設值。由於頻寬較寬,在某些地區使用它可能不合法。

[2]: Meshtastic QR 碼(或頻道 URL)允許用戶快速共享頻道和 LoRa 設定,使得配置多個具有匹配設定以進行通信的節點變得容易。掃描 QR 碼會應用所有包含的頻道設定和 LoRa 配置設定,因此請確保在繼續之前檢視這些設定包含哪些內容。只掃描來自可信來源的 QR 碼。


本文最初發布於 HackMD @BASHCAT。

Darknet YOLO 入坑手冊

電腦視覺物件偵測實戰課程

Oliver's Tech Workshop 2025


今日議程

  • 🎯 電腦視覺與物件偵測簡介
  • 🧠 機器學習與神經網路基礎
  • 🚀 YOLO 技術原理與最新發展
  • 💻 開發環境建置 (CUDA/Docker)
  • 🔧 實戰訓練流程 (PyTorch & Darknet)
  • 📱 部署到邊緣設備 (Ameba Pro2)
  • 🛠️ 故障排除與最佳化技巧

第一章:電腦視覺基礎


什麼是物件偵測?

YOLO架構圖

核心任務

  • 🔍 定位 (Localization) - 找出物體在哪裡
  • 🏷️ 分類 (Classification) - 判斷物體是什麼
  • 📦 邊界框 (Bounding Box) - 框出物體範圍
  • 📊 置信度 (Confidence) - 預測的可信度

YOLO 家族演進 (2025更新)

版本 特點 年份 mAP 速度
YOLOv1 開創性的實時檢測 2016 63.4% 45 FPS
YOLOv3 Darknet-53, 多尺度預測 2018 55.3% 20 FPS
YOLOv4 CSPDarknet53, Mish激活 2020 65.7% 65 FPS
YOLOv5 PyTorch實現, 輕量化 2020 68.9% 140 FPS
YOLOv7 可訓練的包袋式自注意力 2022 69.7% 161 FPS
YOLOv8 統一框架, 多任務 2023 68.2% 280 FPS
YOLOv9 PGI + GELAN架構 2024 70.4% 104 FPS
YOLOv10 實時檢測最佳化 2024 71.2% 300+ FPS

為什麼選擇 YOLO?

🚀 速度優勢

  • 實時處理: 30+ FPS
  • 端到端: 單一神經網路
  • 推理快速: 適合邊緣計算

🎯 精度提升

  • 多尺度特徵: 檢測大小物體
  • 豐富的增強: 資料增強策略
  • 損失函數: 針對檢測任務優化

🛠️ 易用性

  • 生態成熟: 大量預訓練模型
  • 文檔完善: 豐富的學習資源
  • 社群活躍: 持續更新維護

第二章:前置準備


學習路線圖

[mermaid 圖表 — 原始 HackMD 版本可正常渲染]

graph TD A[YOLO前置準備] --> B[硬體準備] A --> C[軟體環境] A --> D[知識基礎]

B --> E[GPU/NPU]
B --> F[CUDA/cuDNN]

C --> G[Linux/Docker]
C --> H[Python/PyTorch]

D --> I[神經網路]
D --> J[深度學習]</div>

硬體需求

基本配置

  • CPU: i5 以上
  • RAM: 16GB+
  • GPU: NVIDIA GTX 1060+

推薦配置

  • CPU: i7/i9 或 AMD Ryzen 7/9
  • RAM: 32GB+
  • GPU: RTX 3060+ (12GB VRAM)

GPU vs NPU

類型 優點 缺點
GPU 通用性強、生態完整 功耗高、成本高
NPU 專為AI優化、低功耗 生態受限、彈性較低

💡 沒有GPU也能學習!可使用:

  • Google Colab (免費GPU)
  • Kaggle Kernel
  • 雲端服務 (AWS, GCP)

第三章:機器學習基礎


什麼是機器學習?

定義

讓電腦從數據中自動學習規律,而無需明確編程

三大類型

  1. 監督式學習 - 有標註數據 (分類、回歸)
  2. 非監督式學習 - 無標註數據 (聚類、降維)
  3. 強化學習 - 透過獎懲機制學習 (遊戲、機器人)

物件偵測屬於監督式學習

  • 需要標註的邊界框
  • 需要物體類別標籤
  • 使用損失函數優化

神經網路 (NN)

神經網路架構

基本概念

  • 神經元: 最基本的計算單元
  • 權重: 控制輸入的重要性
  • 激活函數: 增加非線性能力
  • 反向傳播: 調整權重的方法

卷積神經網路 (CNN)

為什麼要用 CNN?

  • 🖼️ 空間不變性: 位置改變不影響識別
  • 🔍 局部感受野: 關注局部特徵
  • 📉 參數共享: 減少參數數量
  • 🎯 平移不變性: 特徵可以出現在任何位置

CNN 核心組件

# CNN 基本結構
Input Image (224x224x3)
    ↓
Conv2D (32 filters, 3x3) → ReLU → MaxPool (2x2)
    ↓
Conv2D (64 filters, 3x3) → ReLU → MaxPool (2x2)
    ↓
Conv2D (128 filters, 3x3) → ReLU → MaxPool (2x2)
    ↓
Flatten → Dense (512) → ReLU → Dropout
    ↓
Dense (num_classes) → Softmax

CNN 層級特徵學習

低層特徵 (前幾層)

  • 邊緣檢測: 水平線、垂直線、對角線
  • 紋理識別: 點狀、條紋、格子
  • 色彩梯度: 顏色變化、亮度變化

中層特徵 (中間層)

  • 形狀組合: 圓形、矩形、三角形
  • 物體局部: 眼睛、耳朵、輪廓
  • 複雜紋理: 毛髮、皮膚、表面材質

高層特徵 (最後幾層)

  • 完整物體: 人臉、汽車、動物
  • 場景理解: 室內、戶外、街道
  • 語義概念: 抽象的物體類別

從分類到檢測

圖像分類 vs 物件偵測

任務 輸入 輸出 難度
分類 整張圖片 類別標籤 較簡單
檢測 整張圖片 位置+類別 較複雜

檢測的挑戰

  • 🔍 多尺度: 大小物體都要檢測
  • 📍 精確定位: 邊界框要準確
  • 🚀 實時性: 速度要夠快
  • 🎯 多物體: 同時檢測多個物體

YOLO 的解決方案

  • 單一網路: 端到端訓練
  • 網格劃分: 全圖同時預測
  • 多尺度: 不同層級特徵融合

第四章:Dataset 資料集


為什麼需要 Dataset?

  • 🎯 訓練模型的"教材"
  • 📊 評估模型性能
  • 🔄 持續改進的基礎

資料集三要素

  1. 訓練集 (Train) - 70%
  2. 驗證集 (Valid) - 20%
  3. 測試集 (Test) - 10%

YOLOv7 資料集結構

dataset/
├── train/
│   ├── images/
│   └── labels/
├── valid/
│   ├── images/
│   └── labels/
├── test/
│   ├── images/
│   └── labels/
└── data.yaml

YOLOv7 資料集結構範例

資料集結構

分別有測試、訓練、驗證三個部分

資料集分割

data.yaml 訓練時會使用到


常用資料集資源

公開資料集平台

Roboflow 資料集下載範例

Roboflow 水族館資料集

使用 Yolo v7 PyTorch 格式下載

下載格式選擇

標註工具

  • LabelImg
  • CVAT
  • Roboflow Annotate

第五章:環境建置


GPU 設備檢查

1. 確認 GPU 支援

# 檢查 GPU 資訊
nvidia-smi

# 檢查 CUDA 版本
nvcc --version

# 檢查 GPU 計算能力
nvidia-smi --query-gpu=compute_cap --format=csv

2. 推薦 GPU 配置

GPU 型號 VRAM 適用場景
RTX 4060 16GB 學習/小規模訓練
RTX 4070 12GB 中等規模訓練
RTX 4080+ 16GB+ 大規模訓練

CUDA & cuDNN 完整安裝

Ubuntu 20.04/22.04 安裝步驟

# 1. 移除舊版本
sudo apt-get --purge remove "*nvidia*" "*cuda*" "*cudnn*"

# 2. 安裝 NVIDIA 驅動
sudo apt update
sudo apt install nvidia-driver-535

# 3. 重開機
sudo reboot

# 4. 安裝 CUDA 11.8
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

# 5. 設定環境變數
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> <sub>/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> </sub>/.bashrc
source <sub>/.bashrc

cuDNN 安裝

# 1. 下載 cuDNN 8.7.0 (需要 NVIDIA 帳號)
# 從 https://developer.nvidia.com/cudnn 下載 tar 檔案

# 2. 解壓縮並複製檔案
tar -xvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz

# 3. 複製標頭檔
sudo cp cudnn-*/include/cudnn*.h /usr/local/cuda/include 

# 4. 複製函式庫
sudo cp -P cudnn-*/lib64/libcudnn* /usr/local/cuda/lib64 

# 5. 設定權限
sudo chmod a+r /usr/local/cuda/include/cudnn*.h 
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

# 6. 驗證安裝
nvidia-smi
nvcc --version

Python 環境設置

Conda 完整設置

# 1. 下載 Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

# 2. 建立專用環境
conda create -n yolo python=3.8 -y
conda activate yolo

# 3. 安裝 PyTorch (CUDA 11.8)
pip install torch<mark>2.0.1 torchvision</mark>0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118

# 4. 驗證 PyTorch CUDA 支援
python -c "import torch; print(torch.cuda.is_available())"
python -c "import torch; print(torch.cuda.get_device_name(0))"

必要套件安裝

# 基本套件
pip install numpy opencv-python pillow matplotlib seaborn
pip install pandas scikit-learn tqdm

# 深度學習相關
pip install ultralytics  # YOLOv8
pip install roboflow     # 資料集管理
pip install wandb        # 訓練監控

# 圖像處理
pip install albumentations  # 資料增強
pip install imgaug         # 圖像增強

# 視覺化
pip install tensorboard
pip install plotly

# 驗證安裝
python -c "import cv2; print(cv2.__version__)"
python -c "import ultralytics; print('YOLOv8 安裝成功')"

Docker 環境 (推薦)

Docker 工作流程

優點

  • ✅ 環境隔離: 不會影響主系統
  • ✅ 可重現性: 團隊環境一致
  • ✅ 快速部署: 一鍵啟動完整環境
  • ✅ 版本控制: 不同專案用不同版本

Docker 完整設置

1. 安裝 Docker

# Ubuntu 安裝 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 安裝 NVIDIA Docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

2. 使用預建映像

# 方式1: 使用官方映像
docker pull nvcr.io/nvidia/pytorch:22.12-py3

# 方式2: 使用自定義映像
docker pull oliver0804/darknet-opencv:latest

# 運行容器
docker run --gpus all -it --rm \
  -v $PWD:/workspace \
  -p 8888:8888 \
  nvcr.io/nvidia/pytorch:22.12-py3

自建 Docker 映像

Dockerfile 範例

FROM nvidia/cuda:11.8-devel-ubuntu20.04

# 安裝基本套件
RUN apt-get update && apt-get install -y \
    python3 python3-pip git wget \
    libopencv-dev python3-opencv \
    && rm -rf /var/lib/apt/lists/*

# 安裝 Python 套件
RUN pip3 install torch torchvision torchaudio \
    opencv-python ultralytics

# 設定工作目錄
WORKDIR /workspace

# 複製專案檔案
COPY . .

# 暴露端口
EXPOSE 8888

# 啟動命令
CMD ["bash"]

建置與使用

# 建置映像
docker build -t my-yolo-env .

# 運行容器
docker run --gpus all -it --rm \
  -v $PWD:/workspace \
  my-yolo-env

第六章:YOLO 訓練實戰


訓練前準備檢查清單

📋 硬體需求確認

  • ✅ GPU 記憶體 > 8GB
  • ✅ 系統記憶體 > 16GB
  • ✅ 儲存空間 > 50GB
  • ✅ CUDA 版本相容

📋 軟體環境確認

# 檢查清單
python --version         # Python 3.8+
pip list | grep torch    # PyTorch 1.12+
nvidia-smi              # GPU 狀態
nvcc --version          # CUDA 版本

YOLOv8 完整訓練流程

1. 環境設置

# 安裝 Ultralytics YOLOv8
pip install ultralytics

# 驗證安裝
yolo version

2. 準備資料集

# 資料集結構
dataset/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
├── labels/
│   ├── train/
│   ├── val/
│   └── test/
└── data.yaml

資料集配置檔案

data.yaml 範例

# 資料集路徑
path: ./dataset
train: images/train
val: images/val
test: images/test

# 類別數量
nc: 3

# 類別名稱
names:
  0: person
  1: bicycle
  2: car

標註格式 (YOLO)

# 每行一個物體: class_id x_center y_center width height
# 座標為相對值 (0-1)
0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.2

訓練腳本詳解

資料集配置範例

data.yaml 配置

此檔案經過修改,將 Path 改為絕對路徑

模型配置選擇

YOLOv7 配置檔案

路徑中包含 v7-tiny 版本選項

基本訓練

from ultralytics import YOLO

# 載入模型
model = YOLO('yolov8n.pt')  # nano 版本

# 開始訓練
results = model.train(
    data='data.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    name='my_experiment'
)

進階訓練設定

# 進階參數設定
results = model.train(
    data='data.yaml',
    epochs=300,
    imgsz=640,
    batch=32,
    lr0=0.01,           # 初始學習率
    lrf=0.01,           # 最終學習率
    momentum=0.937,     # 動量
    weight_decay=0.0005,# 權重衰減
    warmup_epochs=3,    # 預熱期
    warmup_momentum=0.8,# 預熱動量
    box=7.5,            # 邊界框損失權重
    cls=0.5,            # 分類損失權重
    dfl=1.5,            # 分布焦點損失權重
    patience=50,        # 早停耐心值
    save_period=10,     # 保存週期
    name='advanced_training'
)

訓練監控與視覺化

1. TensorBoard 監控

# 啟動 TensorBoard
import tensorboard
%load_ext tensorboard
%tensorboard --logdir runs/train

2. Weights & Biases 整合

# 安裝 wandb
pip install wandb

# 登入 wandb
wandb login

# 訓練時自動記錄
results = model.train(
    data='data.yaml',
    epochs=100,
    project='yolo-training',  # W&B 專案名稱
    name='experiment-1'
)

訓練過程監控

即時監控腳本

import psutil
import GPUtil
import time

def monitor_training():
    while True:
        # CPU 使用率
        cpu_percent = psutil.cpu_percent()
        
        # 記憶體使用率
        memory = psutil.virtual_memory()
        
        # GPU 使用率
        gpus = GPUtil.getGPUs()
        
        print(f"CPU: {cpu_percent}%")
        print(f"RAM: {memory.percent}%")
        
        for gpu in gpus:
            print(f"GPU {gpu.id}: {gpu.load*100:.1f}%")
            print(f"VRAM: {gpu.memoryUsed}MB/{gpu.memoryTotal}MB")
        
        time.sleep(5)

# 背景執行監控
import threading
monitor_thread = threading.Thread(target=monitor_training, daemon=True)
monitor_thread.start()

訓練過程展示

訓練開始

訓練開始截圖

GPU 資源監控

nvtop GPU 監控

可以使用 nvtop 進行 GPU 使用資源檢視


超參數調整策略

學習率調整

# 學習率調度策略
schedulers = {
    'cosine': 'cos',      # 餘弦退火
    'linear': 'linear',   # 線性衰減
    'constant': 'constant' # 常數
}

# 自動學習率尋找
model.tune(
    data='data.yaml',
    epochs=30,
    iterations=300,
    optimizer='AdamW',
    plots=True,
    save=True
)

批次大小優化

# 自動批次大小調整
def find_optimal_batch_size(model, data_yaml):
    batch_sizes = [8, 16, 32, 64, 128]
    best_batch = 8
    
    for batch in batch_sizes:
        try:
            results = model.train(
                data=data_yaml,
                epochs=5,
                batch=batch,
                verbose=False
            )
            best_batch = batch
            print(f"Batch {batch}: 成功")
        except RuntimeError as e:
            if "out of memory" in str(e):
                print(f"Batch {batch}: 記憶體不足")
                break
    
    return best_batch

模型驗證與測試

驗證腳本

# 驗證模型性能
metrics = model.val(
    data='data.yaml',
    imgsz=640,
    batch=32,
    conf=0.001,
    iou=0.6,
    save_json=True,
    save_hybrid=True
)

# 輸出指標
print(f"mAP50: {metrics.box.map50:.3f}")
print(f"mAP50-95: {metrics.box.map:.3f}")
print(f"Precision: {metrics.box.mp:.3f}")
print(f"Recall: {metrics.box.mr:.3f}")

測試腳本

# 單張圖片測試
results = model.predict(
    source='test.jpg',
    conf=0.25,
    save=True,
    show_labels=True,
    show_conf=True
)

# 批次圖片測試
results = model.predict(
    source='test_images/',
    conf=0.25,
    save=True,
    save_txt=True,  # 保存標註
    save_crop=True  # 保存裁切圖片
)

# 即時攝影機測試
results = model.predict(
    source=0,       # 攝影機ID
    conf=0.25,
    show=True,
    save=True
)

模型匯出與部署

多格式匯出

# 匯出為不同格式
model.export(
    format='onnx',      # ONNX 格式
    imgsz=640,
    dynamic=True,       # 動態輸入尺寸
    half=True,          # FP16 精度
    int8=True,          # INT8 量化
    optimize=True       # 優化
)

# 其他格式
formats = [
    'torchscript',  # PyTorch Script
    'tflite',       # TensorFlow Lite
    'edgetpu',      # Edge TPU
    'tfjs',         # TensorFlow.js
    'coreml'        # Core ML
]

for fmt in formats:
    model.export(format=fmt)

性能基準測試

# 推理速度測試
import time
import numpy as np

def benchmark_model(model, input_size=(640, 640), iterations=100):
    model.eval()
    dummy_input = np.random.randn(1, 3, *input_size).astype(np.float32)
    
    # 預熱
    for _ in range(10):
        model.predict(dummy_input, verbose=False)
    
    # 測試
    times = []
    for _ in range(iterations):
        start = time.time()
        model.predict(dummy_input, verbose=False)
        end = time.time()
        times.append(end - start)
    
    avg_time = np.mean(times)
    fps = 1.0 / avg_time
    
    print(f"平均推理時間: {avg_time*1000:.2f}ms")
    print(f"FPS: {fps:.2f}")
    
    return avg_time, fps

訓練成果展示

魚類偵測範例

偵測結果

魚類偵測結果

好多好多魚魚 <>< <3

最終魚類偵測

訓練指標

測試集結果

測試集結果

訓練集結果

訓練集結果

混淆矩陣

混淆矩陣

攝影機即時檢測

攝影機檢測


常見問題解決

記憶體不足

# 解決方案
strategies = {
    '降低批次大小': 'batch=8',
    '使用混合精度': 'amp=True',
    '減少輸入尺寸': 'imgsz=320',
    '梯度累積': 'accumulate=2'
}

# 梯度累積範例
model.train(
    data='data.yaml',
    epochs=100,
    batch=8,
    accumulate=4,  # 等效批次大小 = 8*4 = 32
    amp=True       # 自動混合精度
)

訓練不收斂

# 診斷與解決
diagnostic_steps = [
    "檢查學習率是否過高",
    "確認資料集標註正確性",
    "檢查類別平衡性",
    "調整損失函數權重",
    "增加資料增強"
]

# 學習率調整
model.train(
    data='data.yaml',
    lr0=0.001,      # 降低初始學習率
    warmup_epochs=5, # 增加預熱期
    patience=100     # 增加早停耐心
)

第七章:Darknet 框架


Darknet 簡介

特點

  • ✨ C/CUDA 原生實現 - 極致性能
  • 🚀 輕量級框架 - 無複雜依賴
  • 📦 易於修改 - 源碼清晰
  • 🔧 原生支援 - YOLO 官方框架

作者

Joseph Redmon (YOLO v1-v3 原作者)
Alexey Bochkovskiy (YOLOv4 維護者)

與 PyTorch 比較

特性 Darknet PyTorch
速度 極快 快
易用性 中等 高
生態系統 有限 豐富
自定義 需要 C 代碼 Python 即可

Darknet 完整安裝

1. 系統依賴安裝

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y build-essential cmake git

# 編譯工具
sudo apt-get install -y gcc g++ make

# 可選:OpenCV 支援
sudo apt-get install -y libopencv-dev

# 可選:OpenMP 支援
sudo apt-get install -y libomp-dev

2. 克隆與編譯

# 克隆改良版 Darknet (推薦)
git clone https://github.com/AlexeyAB/darknet.git
cd darknet

# 編輯 Makefile
nano Makefile

Makefile 配置

# GPU 支援
GPU=1
CUDNN=1
CUDNN_HALF=1

# OpenCV 支援
OPENCV=1

# OpenMP 支援
OPENMP=1

# 偵錯模式
DEBUG=0

# 其他選項
LIBSO=1  # 建立 .so 檔案
ZED_CAMERA=0  # ZED 攝影機支援

編譯指令

# 清理舊檔案
make clean

# 編譯 (使用多核心)
make -j$(nproc)

# 驗證編譯結果
./darknet version

OpenCV 安裝過程截圖

OpenCV 3.4.19 版本確認

OpenCV 版本

編譯過程

編譯進度1 編譯進度2 編譯完成


基本測試

1. 下載預訓練模型

# YOLOv4 權重
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

# YOLOv4-tiny 權重
wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov4-tiny.weights

# YOLOv7-tiny 權重
wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov7-tiny.weights

2. 測試圖片檢測

# YOLOv4 檢測
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg

# YOLOv4-tiny 檢測
./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg

# 自訂閾值
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg -thresh 0.5

測試結果展示

YOLOv3 檢測結果

YOLOv3 狗狗檢測

YOLOv7-tiny 檢測結果

YOLOv7-tiny 結果


影片與攝影機檢測

影片檢測

# 檢測影片
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4

# 儲存結果
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename result.avi

攝影機檢測

# 使用 webcam
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0

# 使用外接攝影機
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 1

# 設定參數
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0 -thresh 0.25 -here

自定義訓練準備

1. 建立專案資料夾

mkdir my_yolo_project
cd my_yolo_project

# 建立目錄結構
mkdir -p {data,cfg,weights,results}
mkdir -p data/{images,labels}
mkdir -p data/images/{train,valid,test}
mkdir -p data/labels/{train,valid,test}

2. 準備資料集

# 資料集結構
my_yolo_project/
├── data/
│   ├── images/
│   │   ├── train/
│   │   ├── valid/
│   │   └── test/
│   ├── labels/
│   │   ├── train/
│   │   ├── valid/
│   │   └── test/
│   ├── train.txt
│   ├── valid.txt
│   └── test.txt
├── cfg/
│   ├── my_dataset.data
│   ├── my_yolov4.cfg
│   └── my_classes.names
└── weights/

配置檔案設定

1. 建立 .data 檔案

# my_dataset.data
classes = 3
train = data/train.txt
valid = data/valid.txt
names = cfg/my_classes.names
backup = weights/

2. 建立 .names 檔案

# my_classes.names
person
car
bicycle

3. 建立圖片列表

# 產生訓練列表
find $(pwd)/data/images/train -name "*.jpg" > data/train.txt

# 產生驗證列表
find $(pwd)/data/images/valid -name "*.jpg" > data/valid.txt

# 檢查列表
head -5 data/train.txt

模型配置調整

1. 複製基礎配置

# 複製 YOLOv4-tiny 配置
cp ../darknet/cfg/yolov4-tiny.cfg cfg/my_yolov4.cfg

2. 修改配置檔案

# 編輯配置
nano cfg/my_yolov4.cfg

# 關鍵修改點:
# 1. 修改 classes 數量
# 2. 修改 filters 數量
# 3. 調整學習率
# 4. 設定批次大小

重要參數說明

[net]
batch=64          # 批次大小
subdivisions=8    # 子批次
width=416         # 輸入寬度
height=416        # 輸入高度
channels=3        # 通道數
momentum=0.9      # 動量
decay=0.0005      # 權重衰減
angle=0           # 隨機旋轉角度
saturation=1.5    # 飽和度變化
exposure=1.5      # 曝光變化
hue=.1            # 色調變化

learning_rate=0.001  # 學習率
max_batches=6000     # 最大批次 (classes * 2000)
policy=steps         # 學習率策略
steps=4800,5400      # 降低學習率的步驟
scales=.1,.1         # 學習率縮放

預訓練權重準備

1. 下載預訓練權重

# YOLOv4-tiny 預訓練權重
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

# YOLOv4 預訓練權重
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

2. 驗證權重檔案

# 檢查檔案大小
ls -lh weights/

# 測試權重載入
./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29

開始訓練

自定義資料集範例

手語識別資料集

手語資料集

自定義設定資料夾

自定義設定

基本訓練指令

# 單 GPU 訓練
./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29

# 多 GPU 訓練
./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -gpus 0,1

# 從檢查點繼續訓練
./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_last.weights

# 計算 mAP
./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -map

訓練過程監控

訓練進行中


訓練監控

1. 查看訓練日誌

# 即時查看訓練進度
tail -f training.log

# 提取損失值
grep "avg" training.log | tail -10

2. 損失函數分析

# 訓練輸出範例
Region xx: cfg: (anchors) ...
1000: 2.950644, 2.950644 avg, 0.000010 rate, 3.456 seconds, 64000 images

參數說明

  • 1000: 當前迭代次數
  • 2.950644: 當前損失值
  • 2.950644 avg: 平均損失值
  • 0.000010 rate: 當前學習率
  • 3.456 seconds: 此批次訓練時間
  • 64000 images: 已處理圖片數

訓練結果評估

1. 計算 mAP

# 計算驗證集 mAP
./darknet detector map cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights

2. 測試個別圖片

# 測試單張圖片
./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights data/test.jpg

# 批次測試
./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights < data/test.txt

3. 調整檢測閾值

# 不同閾值測試
for thresh in 0.1 0.25 0.5 0.75; do
    echo "Testing with threshold: $thresh"
    ./darknet detector test cfg/my_dataset.data cfg/my_yolov4.cfg weights/my_yolov4_best.weights data/test.jpg -thresh $thresh
done

高級功能

1. 資料增強

# 在 [net] 部分加入
mosaic=1          # 馬賽克增強
cutmix=1          # CutMix 增強
mixup=1           # MixUp 增強

2. 多尺度訓練

# 隨機尺度訓練
random=1

# 多尺度設定
width=416
height=416

3. 學習率調度

# 學習率策略
policy=steps
steps=4800,5400
scales=.1,.1

# 或使用多項式衰減
policy=poly
power=4

疑難排解

常見錯誤解決

# 1. CUDA 記憶體不足
# 解決:降低 batch size 或 subdivisions

# 2. 找不到圖片
# 解決:檢查 .txt 檔案中的路徑

# 3. 標註格式錯誤
# 解決:檢查 YOLO 格式是否正確

# 4. 類別數量不匹配
# 解決:確認 classes 和 filters 設定正確

優化建議

  1. 記憶體優化: 調整 subdivisions
  2. 速度優化: 使用 -dont_show 參數
  3. 精度優化: 增加 max_batches
  4. 穩定訓練: 使用 -map 監控 mAP

Docker 部署 (完整版)

1. 使用現成映像

Docker 工作流程示意

Docker 工作流程

# 拉取映像
docker pull oliver0804/darknet-opencv:latest

# 運行容器
docker run --gpus all -it --rm \
    -v $(pwd):/workspace \
    -v $(pwd)/data:/darknet/data \
    -v $(pwd)/cfg:/darknet/cfg \
    -v $(pwd)/weights:/darknet/weights \
    oliver0804/darknet-opencv:latest

Docker 執行結果

Docker 執行結果

最終檢測結果

Docker 檢測結果

2. 在容器中訓練

# 進入容器
docker exec -it <container_id> bash

# 開始訓練
./darknet detector train cfg/my_dataset.data cfg/my_yolov4.cfg weights/yolov4-tiny.conv.29 -dont_show -map

3. 自動化腳本

#!/bin/bash
# auto_train.sh

# 設定參數
DATA_FILE="cfg/my_dataset.data"
CFG_FILE="cfg/my_yolov4.cfg"
WEIGHTS_FILE="weights/yolov4-tiny.conv.29"

# 執行訓練
docker run --gpus all -it --rm \
    -v $(pwd):/workspace \
    oliver0804/darknet-opencv:latest \
    ./darknet detector train $DATA_FILE $CFG_FILE $WEIGHTS_FILE -dont_show -map

第八章:邊緣設備部署


Ameba Pro2 簡介

硬體規格

  • 處理器: ARM Cortex-M55 @ 500MHz
  • AI 加速器: 0.4 TOPS NPU
  • 記憶體: 768KB SRAM + 16MB PSRAM
  • 攝像頭: 2MP 感光元件
  • 連接: Wi-Fi 6 + BLE 5.0
  • 尺寸: 35mm x 28mm

為什麼選擇邊緣 AI?

  • 🔒 隱私保護: 資料不上雲
  • ⚡ 低延遲: 即時推理
  • 💰 成本效益: 無雲端費用
  • 🔋 低功耗: 適合 IoT 應用

重要注意事項

支援時程

注意: ameba pro2 對 yolo 的支援時間會比較晚

當前限制

  • 模型轉換需要線上工具
  • 暫無離線版本工具
  • 如果在意模型保密需要考慮

適用場景

  • 🏠 智慧家居監控
  • 🏭 工業品質檢測
  • 🚗 車內駕駛行為分析
  • 📱 IoT 邊緣計算

模型轉換詳解

1. 準備轉換檔案

檔案要求

# 打包內容
yolo_model.zip
├── yolov4-tiny.weights    # 訓練好的權重檔
└── yolov4-tiny.cfg        # 對應的配置檔

# 重要限制
❌ 不能包含中文字符
❌ cfg 檔案註解也不能有中文
❌ 檔案路徑不能有中文

配置檔案清理

# 移除中文註解
sed -i '/[\u4e00-\u9fff]/d' yolov4-tiny.cfg

# 檢查檔案編碼
file yolov4-tiny.cfg

# 確保 UTF-8 編碼
iconv -f GB2312 -t UTF-8 yolov4-tiny.cfg > yolov4-tiny_clean.cfg

線上轉換流程

1. 上傳模型

模型轉換上傳

網址: https://www.amebaiot.com/en/amebapro2-ai-convert-model/

2. 轉換過程

  • ⏱️ 等待時間: 10-20 分鐘
  • 📧 結果通知: 轉換完成會發送郵件
  • 📦 輸出格式: .nb 檔案 (Neural Network Binary)

3. 轉換參數

參數 說明 建議值
Input Size 輸入圖片尺寸 416x416
Quantization 量化位元數 INT8
Optimization 優化等級 High

Arduino IDE 環境設置

1. 安裝 Arduino IDE

# 下載 Arduino IDE 2.0+
wget https://downloads.arduino.cc/arduino-ide/arduino-ide_2.2.1_Linux_64bit.zip

# 或使用套件管理器
sudo apt install arduino

2. 添加開發板支援

開發板管理員 URL

https://github.com/ambiot/ambpro2_arduino/raw/main/Arduino_package/package_realtek.com_amebapro2_index.json

開發板管理員設定

安裝步驟

  1. 開啟 Arduino IDE
  2. 檔案 → 偏好設定 → 額外的開發板管理員網址
  3. 貼上上述 URL
  4. 工具 → 開發板 → 開發板管理員
  5. 搜尋 "Realtek Ameba"
  6. 安裝 "Realtek Ameba Pro2 Boards"

選擇開發板

開發板設定

選擇 Ameba Pro2

設定路徑: 工具 → 開發板 → Realtek Ameba Pro2 → "Ameba Pro2"

編譯選項

Board: "Ameba Pro2"
CPU Speed: "500MHz"
Optimization: "Smallest (-Os)"
Upload Speed: "115200"

神經網路範例程式

1. 開啟範例

NN 範例

路徑: 檔案 → 範例 → AmebaNN → YOLO

2. 基本程式結構

#include "NeuralNetwork.h"
#include "VideoStream.h"
#include "RTSP.h"

// 物件類別定義
#define YOLO_CLASSES 26  // 自定義類別數

// 類別名稱陣列
String objectList[YOLO_CLASSES] = {
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
    "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 
    "U", "V", "W", "X", "Y", "Z"
};

void setup() {
    Serial.begin(115200);
    
    // 初始化攝像頭
    Camera.configVideoChannel(VIDEO_CHN, 416, 416, 30, VIDEO_H264_JPEG);
    Camera.videoInit();
    
    // 初始化神經網路
    NNObjectDetection.configVideo(VIDEO_CHN);
    NNObjectDetection.modelSelect(OBJECT_DETECTION, YOLO_CLASSES, DEFAULT_YOLO, NA_MODEL);
    NNObjectDetection.begin();
    
    // 初始化 RTSP
    RTSP.configVideo(VIDEO_CHN);
    RTSP.begin();
}

void loop() {
    // 執行物件偵測
    if (NNObjectDetection.available()) {
        ObjectDetectionResult result = NNObjectDetection.getResult();
        
        // 處理偵測結果
        for (int i = 0; i < result.count(); i++) {
            int obj_type = result.type(i);
            int score = result.score(i);
            
            if (score > 50) {  // 信心度閾值
                Serial.printf("偵測到: %s (信心度: %d%%)\n", 
                             objectList[obj_type].c_str(), score);
            }
        }
    }
    delay(100);
}

模型替換詳解

1. 找到模型檔案位置

模型檔案路徑

典型路徑:

<sub>/Arduino/libraries/AmebaNN/src/
├── models/
│   ├── yolov4_tiny.nb      # 原始模型
│   └── yolov4_tiny_new.nb  # 你的新模型

2. 備份原始模型

# 進入模型目錄
cd </sub>/Arduino/libraries/AmebaNN/src/models/

# 備份原始模型
cp yolov4_tiny.nb yolov4_tiny_original.nb

# 替換新模型
cp /path/to/your/model.nb yolov4_tiny.nb

3. 修改類別設定

更新類別數量

// 原始 COCO dataset (80 類)
#define YOLO_CLASSES 80

// 改為你的類別數 (例如: 26 類手語)
#define YOLO_CLASSES 26

更新類別名稱

// 原始 COCO 類別
String objectList[YOLO_CLASSES] = {
    "person", "bicycle", "car", ... // 80 個類別
};

// 改為手語字母 (26 類)
String objectList[YOLO_CLASSES] = {
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
    "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 
    "U", "V", "W", "X", "Y", "Z"
};

程式碼修改詳解

1. 修改 OSD 標籤顯示

原始標籤清單

OSD 標籤修改

修改後的手語標籤

手語標籤清單

原始代碼:

// 舊版本 (可能已修正)
printf("%s", item.name());

修正後:

// 新版本
printf("%s", objectList[obj_type].c_str());

2. 物件類型處理

物件類型修正

修改位置: 約第 114 行

// 修改前
item.name()

// 修改後  
objectList[obj_type].objectName

測試與除錯

1. 序列埠監控

void printDetectionInfo(ObjectDetectionResult result) {
    Serial.printf("偵測到 %d 個物件\n", result.count());
    
    for (int i = 0; i < result.count(); i++) {
        int obj_type = result.type(i);
        int score = result.score(i);
        int x = result.xMin(i);
        int y = result.yMin(i);
        int w = result.width(i);
        int h = result.height(i);
        
        Serial.printf("物件 %d: %s\n", i+1, objectList[obj_type].c_str());
        Serial.printf("  信心度: %d%%\n", score);
        Serial.printf("  位置: (%d, %d) 大小: %dx%d\n", x, y, w, h);
    }
}

2. 性能監控

unsigned long prev_time = 0;
int frame_count = 0;

void loop() {
    if (NNObjectDetection.available()) {
        frame_count++;
        unsigned long curr_time = millis();
        
        if (curr_time - prev_time >= 1000) {  // 每秒統計
            Serial.printf("FPS: %d\n", frame_count);
            frame_count = 0;
            prev_time = curr_time;
        }
        
        // 處理偵測結果...
    }
}

實際展示效果

1. 手語識別展示

YouTube 影片: Ameba pro2 yolo展示

功能展示

  • ✅ 即時手語字母識別
  • ✅ 邊界框繪製
  • ✅ 信心度顯示
  • ✅ RTSP 串流輸出

2. 性能表現

指標 數值
推理速度 10 FPS
延遲 <100ms
功耗 <500mW
精確度 85%+

模型快速替換工具

1. 問題描述

  • 🔍 路徑深層: Arduino 目錄結構複雜
  • 🔄 頻繁更換: 需要測試不同模型
  • 💾 備份需求: 保存之前的模型版本

2. 自動化腳本

YouTube 教學: Ameba pro2 快速替換模型腳本

Windows 批次檔 (model_swap.bat)

@echo off
setlocal enabledelayedexpansion

echo Ameba Pro2 模型快速替換工具
echo ================================

set ARDUINO_PATH=%USERPROFILE%\Documents\Arduino
set MODEL_PATH=%ARDUINO_PATH%\libraries\AmebaNN\src\models
set BACKUP_PATH=%MODEL_PATH%\backup

REM 建立備份目錄
if not exist "%BACKUP_PATH%" mkdir "%BACKUP_PATH%"

REM 顯示當前模型
echo 當前模型檔案:
dir "%MODEL_PATH%\*.nb" /b

echo.
echo 選擇操作:
echo 1. 替換模型
echo 2. 還原備份
echo 3. 建立備份
set /p choice="請輸入選項 (1-3): "

if "%choice%"=="1" goto REPLACE_MODEL
if "%choice%"=="2" goto RESTORE_BACKUP  
if "%choice%"=="3" goto CREATE_BACKUP
goto END

:REPLACE_MODEL
set /p new_model="請輸入新模型檔案路徑: "
if not exist "%new_model%" (
    echo 錯誤: 找不到指定的模型檔案
    goto END
)

REM 備份當前模型
copy "%MODEL_PATH%\yolov4_tiny.nb" "%BACKUP_PATH%\yolov4_tiny_%date:</sub>0,4%%date:<sub>5,2%%date:</sub>8,2%.nb"

REM 替換模型
copy "%new_model%" "%MODEL_PATH%\yolov4_tiny.nb"
echo 模型替換完成!
goto END

:RESTORE_BACKUP
echo 可用的備份檔案:
dir "%BACKUP_PATH%\*.nb" /b
set /p backup_file="請輸入要還原的備份檔案名: "
copy "%BACKUP_PATH%\%backup_file%" "%MODEL_PATH%\yolov4_tiny.nb"
echo 模型還原完成!
goto END

:CREATE_BACKUP
copy "%MODEL_PATH%\yolov4_tiny.nb" "%BACKUP_PATH%\yolov4_tiny_%date:<sub>0,4%%date:</sub>5,2%%date:~8,2%.nb"
echo 備份建立完成!
goto END

:END
pause

3. Linux/Mac 腳本 (model_swap.sh)

#!/bin/bash

ARDUINO_PATH="$HOME/Arduino"
MODEL_PATH="$ARDUINO_PATH/libraries/AmebaNN/src/models"
BACKUP_PATH="$MODEL_PATH/backup"

# 建立備份目錄
mkdir -p "$BACKUP_PATH"

echo "Ameba Pro2 模型快速替換工具"
echo "================================"

echo "當前模型檔案:"
ls -la "$MODEL_PATH"/*.nb 2>/dev/null || echo "找不到模型檔案"

echo ""
echo "選擇操作:"
echo "1. 替換模型"
echo "2. 還原備份"
echo "3. 建立備份"
read -p "請輸入選項 (1-3): " choice

case $choice in
    1)
        read -p "請輸入新模型檔案路徑: " new_model
        if [ ! -f "$new_model" ]; then
            echo "錯誤: 找不到指定的模型檔案"
            exit 1
        fi
        
        # 備份當前模型
        cp "$MODEL_PATH/yolov4_tiny.nb" "$BACKUP_PATH/yolov4_tiny_$(date +%Y%m%d_%H%M%S).nb"
        
        # 替換模型
        cp "$new_model" "$MODEL_PATH/yolov4_tiny.nb"
        echo "模型替換完成!"
        ;;
    2)
        echo "可用的備份檔案:"
        ls -1 "$BACKUP_PATH"/*.nb 2>/dev/null || echo "沒有備份檔案"
        read -p "請輸入要還原的備份檔案名: " backup_file
        cp "$BACKUP_PATH/$backup_file" "$MODEL_PATH/yolov4_tiny.nb"
        echo "模型還原完成!"
        ;;
    3)
        cp "$MODEL_PATH/yolov4_tiny.nb" "$BACKUP_PATH/yolov4_tiny_$(date +%Y%m%d_%H%M%S).nb"
        echo "備份建立完成!"
        ;;
    *)
        echo "無效的選項"
        ;;
esac

疑難排解

常見問題

  1. 模型轉換失敗

    • 檢查檔案是否包含中文
    • 確認 cfg 和 weights 對應
    • 重新清理配置檔案
  2. 編譯錯誤

    • 確認開發板選擇正確
    • 檢查類別數量設定
    • 更新 Arduino 核心
  3. 推理速度慢

    • 降低輸入解析度
    • 使用 INT8 量化
    • 優化模型架構

效能優化建議

  • 🎯 模型選擇: 使用 YOLOv4-tiny 而非完整版
  • 📏 輸入尺寸: 建議 320x320 或 416x416
  • ⚡ 量化: 使用 INT8 量化減少記憶體用量
  • 🔄 批次處理: 避免頻繁的模型切換

第九章:實用技巧


OpenCV 應用

電腦視覺基礎操作

OpenCV 基本操作

OpenCV 可以處理顏色、物件邊緣、光流等,是代碼版本的 Photoshop

影像前處理

import cv2

# 讀取圖片
img = cv2.imread('image.jpg')

# 轉換顏色空間
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 邊緣檢測
edges = cv2.Canny(gray, 50, 150)

# 影像增強
enhanced = cv2.equalizeHist(gray)

進階應用範例

人臉識別應用

OpenCV 人臉識別

透過 OpenCV contrib 實現人臉偵測

OCR 文字識別

OpenCV OCR

使用 Tesseract 進行光學字符識別


資料增強技巧

常用方法

  1. 旋轉 - 增加角度變化
  2. 翻轉 - 水平/垂直鏡像
  3. 縮放 - 尺度不變性
  4. 色彩調整 - 光照變化
  5. 加噪 - 提升魯棒性
# Albumentations 範例
transform = A.Compose([
    A.RandomRotate90(),
    A.Flip(),
    A.RandomBrightnessContrast(p=0.2),
])

第十章:常見問題


GPU 記憶體不足

解決方案

  1. 降低 batch size
  2. 使用混合精度訓練
  3. 減少輸入圖片尺寸
  4. 使用梯度累積
# 梯度累積範例
accumulation_steps = 4
for i, (imgs, targets) in enumerate(dataloader):
    loss = model(imgs, targets)
    loss = loss / accumulation_steps
    loss.backward()
    
    if (i + 1) % accumulation_steps == 0:
        optimizer.step()
        optimizer.zero_grad()

訓練不收斂

檢查清單

  • ✅ 學習率是否合適
  • ✅ 資料集是否平衡
  • ✅ 標註是否正確
  • ✅ 增強是否過度

調試技巧

# 學習率調度
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer, T_max=epochs
)

總結與展望


學習要點回顧

技術堆疊

  • ✅ 深度學習基礎
  • ✅ YOLO 架構原理
  • ✅ 訓練流程實作
  • ✅ 模型優化技巧
  • ✅ 邊緣設備部署

實戰經驗

  • 💡 資料集準備的重要性
  • 🔧 超參數調整的藝術
  • 📊 性能指標的理解
  • 🚀 部署優化的考量

未來發展方向

技術趨勢

  1. Vision Transformer - 新架構崛起
  2. 自監督學習 - 減少標註需求
  3. 邊緣 AI - 更強大的端側推理
  4. 多模態融合 - 結合語言理解

應用場景

  • 🏭 智慧製造
  • 🚗 自動駕駛
  • 🏥 醫療影像
  • 🛡️ 安防監控

參考資源

官方資源

社群資源

  • GitHub: AlexeyAB/darknet
  • GitHub: WongKinYiu/yolov7
  • Roboflow Blog
  • PyImageSearch

Q&A 時間

聯絡方式

感謝聆聽!🎉


附錄:快速參考

常用指令

# PyTorch 訓練
python train.py --batch 16 --epochs 100

# Darknet 訓練
./darknet detector train cfg/data.data cfg/yolo.cfg weights.conv

# 模型測試
python detect.py --weights best.pt --source test.jpg

# Docker 運行
docker run --gpus all -it darknet:latest

本文最初發布於 HackMD @BASHCAT。

8GB 的 RK3588 能跑多聰明的 LLM?ROCK 5C 用 NPU 實測 5 個模型

先講結論,省得你滑到最後: 在一片 8GB 的 RK3588 板子上,用 NPU 跑得最聰明的是 Qwen3-4B-Instruct-2507,我出的 7 題全對,但每秒只吐 3.7 個 token。 想要順一點的對話體驗,Qwen3.5-2B 的 8.4 tok/s 是比...