• COSPLAY 3D 建模
  • 3D列印服務
  • #maker+t=market
  • 1
  • 2
  • 3

Python人工智慧圖控 - 研習交流廳 造訪社團

原文網址 石小川
2019-12-23 08:25:25

樹莓派都已經來到第四代了,四核心、RAM 4GB,運算能力已大幅提升,便宜的電腦可做很多事,早期 Z80 CPU八位元電腦就可做六軸機器手控制了,相較樹莓派這種等級 ~ Raspberry-Pi 4B根本就是超級迷你微電腦了,同學可要好好利用啊! 有興趣的朋友可玩看看。

分享一下網友安裝過程:

https://william-weng.github.io/…/…/raspberry-pi-helloworld/…

Steve Wu
2019-12-23 08:32:58

目前p3拿來裝recall box ? !給小朋友玩 ? !


原文網址 石小川
2019-12-22 10:53:57

光學相位陣列雷達的好處是使用光的干涉原理研製, 不用機械掃描, 只用固態光電模組發射接收(T/R), 響應時間極短, 理論上超級電腦上線, 可同時追蹤並擊落空中256架飛行物游刃有餘, 在火炮射控及自動駕駛或機器人方面非常有潛力, 因為要讓光干涉轉大角度,有一些技術門檻需要克服, 目前各大公司將它視為機密積極研發相關技術.

我喜歡用簡單的東西加上演算法兜出功能複雜的產品, 我這裡是用現成的近紅外光(不可見光, 波長1550nm, 功率5mW)的半導體雷射陣列研製, 每個發射接收就是一個T/R模組, 模組可示任務需要增減, 此次總共用256個T/R模組組成陣列.

圖中的架構是我這次要實驗的外觀, 構造並不複雜, 主要是將OPA雷達的訊號透過WIFI傳輸到1公里外的電腦自動判讀及控制, 因為裡面是吃鋰電, 可傳很久...... 我希望商用規格的價格能down到NT$3000 - NT$6000, 這是我要努力的目標!

張傑富
2019-12-22 11:15:45

請問,光學相位陣列雷達主要是偵測什麼?有什麼應用? 謝謝。


原文網址 石小川
2019-12-22 10:48:09

打樣的光學陣列電路板送洗回來了, 品質感覺還不錯, 以後不再用CNC雕刻PCB電路了!

光是頻率極高的電磁波, 極難駕馭, 在物理學中"光"的性質是最神秘, 最令人捉摸不定的東西, 我大半的時間都耗在光的量子物理學打轉.

目前很多人研究AI深度學習是用GPU在模擬神經網路, 我倒是覺得光學電腦(光學神經網路)才是解決巨量神經元連結問題, 只要採用一片片積層式的LED + LCD技術即可, 最重要的是現在的技術可行, 事實上我已不用FPGA或ASIC晶片模擬類神經網路(ANN)了, 這一轉眼, 進入光學電腦領域已是十年的事了, 期盼有好的佳績^^

林永仁
2019-12-22 12:16:46

哥借分享

曾希哲
2019-12-22 16:04:33

這神經網路是做死的 還是programmable

Aslam Lin
2019-12-23 10:20:30

我對您的光學神經網路覺得很有興趣,現在已經可以實作了?

林志強
2019-12-23 11:05:06


原文網址 石小川
2019-12-22 10:35:00

機器視覺在工業4.0的應用非常廣泛,例如樣本比對、良率偵測、工件大小量測、微生物標定…..等,如果結合人工智慧資料分析就是一套很完整的專家系統了。

圖中軟體是我將紅血球/白血球辨識及標定的核心程式改寫成簡單的CNC自動對刀及工件偵測系統,理論上量測精度可控制在1um(10^-6m)以內,不過我的CNC機台螺桿可沒這麼精密,所以我把它控制在浮點數第3位即可,整體而言精密度與攝像頭、機台、都有關係,端看應用者的要求而調整軟硬體。

自動對刀是用演算法找出工件中心點,而自動對焦是採用Z軸移動加上演算法達成,另外比例尺可配合3軸移動及像素自動求得,一旦中心點座標找出來就很容易結合Mach3或PLC將主軸定位在工件上。值得一提的是打光技術在影像辨識也非常重要,打光打得好辨識率就很好,演算法就可精簡些,其餘利用影像偵測工作臺大小及影像多軸限位開關技巧和Z軸單鏡頭工件深度偵測技巧,這些功能我就留在下回再演示了


原文網址 石小川
2019-12-19 17:24:38

軟硬兼施 – 給2020年未來工程師的建言
早期的工程師是以專業導向為主,分工細膩,有電子專長的就負責電子電路設計,熟悉雷達數位訊號處裡的就專心寫軟體,對機械材料科學領域有研究的就做火箭噴嘴設計,在20世紀以前這些都是完全正確的方向。 但這個世代恐怕這種思維需要修正或至少要微調了,很多以前專家會的知識電腦做的毫不遜色,電腦醫療輔助診斷、自動電子電路Layout、IC佈局、自動程式產生器皆是,而且還在進步中,目前軟硬體已逐漸成熟,估計再十年後殺手級的電腦專家系統會取代很多人的工作,所以提升自已的第二專長絕對很重要,有機會還是要多涉獵自已不熟悉的領域,培養不被取代的技能,不久的將來應徵工程師的門檻會被要求軟硬體要有一定的程度,大家一起加油! 以此共勉之^^

林志強
2019-12-19 19:05:39


原文網址 石小川
2019-12-19 11:59:26

目前自動化機器很多都是用虛擬儀表板來顯示機器狀態,例如飛行儀表板(圖1、2),今天跟大家分享一下如何用Python+ PyQt5設計出夠炫的虛擬儀錶,沒時間寫註解,貼上程式碼,有問題可互相討論! ? ? Step1. 準備一個背景透明的儀表png圖檔(圖3)。 ? Step2. 用Qt Designer設計UI(不熟悉話,可先找我之前寫的文章K一下)(圖4)。 當然也可以不經過PyQt5設計UI,只不過有工具來設計介面程式會省時多了。 ? Step3. 設計虛擬儀表類別class QGauge(QWidget)。 在此雖然表示轉速,但套用不同的公式也可以表示溫度、壓力、高度、流量等。 我直接貼程式(gauge.py)如下: #----------------------------------- # gauge.py #----------------------------------- # -*- coding: utf-8 -*- ''' 石小川 / Michael Shih 光騰高科技工作室 / Quantum Tek. ''' #PyQt5模組 from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget from PyQt5.QtCore import Qt, pyqtSignal, QRect from PyQt5.QtGui import QPixmap, QImage, QIcon, QPainter, QPen, QBrush, QPalette #------------------------------------------------------------------------------ class QGauge(QWidget): rpmValueChanged = pyqtSignal(int) #轉速變化時發射的信號 #------------------------------------------------------------------------- def __init__(self, parent=None): super().__init__(parent) #self .__imageGauge = QImage(r'E:\Instrument\image\rpm.png') self.__imageGauge = QImage(r'rpm.png') self.__rpmValue = 10 self.color = Qt.green self._startAngle = -40 * 16 self._rotateAngle = 260 * 16 #------------------------------------------------------------------------- def rpm2Arc(self, rpm): start = 230 - rpm rotate = rpm return start * 16, rotate * 16 #------------------------------------------------------------------------- def set_rpmValue(self, rpm): self.__rpmValue = rpm self.rpmValueChanged.emit(rpm) self._startAngle, self._rotateAngle = self. rpm2Arc(rpm) self.repaint() #------------------------------------------------------------------------- def get_rpmValue(self): return self.__rpmValue #------------------------------------------------------------------------- def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) pen = QPen() pen.setWidth(10) if(self.__rpmValue < 115): self.color = Qt.green elif(self.__rpmValue > 115 and self.__rpmValue < 222): self.color = Qt.yellow elif(self.__rpmValue > 222): self.color = Qt.red pen.setColor(self.color) pen.setStyle(Qt.SolidLine) pen.setCapStyle(Qt.FlatCap) painter.setPen(pen) w = self.width() h = self.height() rect = QRect(0, 0, self.width(), self.height()) painter.drawImage(rect, self.__imageGauge) lw = w-50 lh = h-60 rect2 = QRect(85, 88, lw/2, lh/2) painter.drawArc(rect2, self._startAngle, self._rotateAngle)
Step4. 主程式,需引用QGauge類別(from gauge import QGauge)。
我直接貼程式(rpm.py)如下: #----------------------------------- # rpm.py #----------------------------------- # -*- coding: utf-8 -*- ''' 石小川 / Michael Shih 光騰高科技工作室 / Quantum Tek. ''' #引用程式會用到的模組 import sys #引用設計好的UI介面 from panel import Ui_MainWindow from gauge import QGauge #PyQt5模組 from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget from PyQt5 import QtWidgets from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtGui import QPixmap, QImage, QIcon, QPainter, QPen, QBrush #------------------------------------------------------------------------------ #定義類別MyWindow繼承自已設計好的介面Ui_MainWindow #------------------------------------------------------------------------------ class MyWindow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): #類別初始化 super(MyWindow, self).__init__(parent) self.setupUi(self) self.setWindowTitle("Gauge - RPM x 1000") self.setWindowIcon(QIcon('COMPASS')) self.setFixedSize(361, 381) self.gauge.set_rpmValue(10) #------------------------------------------------------------------------- #刻度盤變化會執行此函數 def slider_valueChanged(self, value): self.gauge.set_rpmValue(value) #------------------------------------------------------------------------------ def main(): app = QApplication(sys.argv) myWin = MyWindow() myWin.show() sys.exit(app.exec_()) #------------------------------------------------------------------------------ if __name__ == '__main__': main()
Step 5. 執行結果。 轉速超過4000顯示黃色指示燈(圖5)。 ? 轉速超過8000顯示紅色指示燈(圖6)。 ?

林永仁
2019-12-19 12:01:12

哥借分享

Jade Yang
2019-12-19 12:07:53

Pablo Tseng
2019-12-19 12:09:56

哇 這資料找好久 感謝 感謝

Brian Lin
2019-12-20 17:56:04

好強⋯⋯圖控這一部分,我也找了好久。
感謝⋯⋯⋯⋯


原文網址 石小川
2019-12-16 09:26:03

上回寫的程式版本是透過USB HID介面直接控制Mach3, 這次版本是透過Mach3橋接, 用它提供的API做控制, 好處是幾乎所有Mach3功能皆可實作, 壞處是Mach3必須先執行, 這樣做有甚麼好處呢? 主要是二次開發用, 會自已寫程式的人(C# , C++, VB)可加入演算法提升CNC的功能, 例如可在CNC加入OpenCV做影像辨識或做3D工件掃描建模功能, 或者加入類神經網路做深度學習….等等, 下次有機會我們再詳細討論這部份.

本章重點是簡單介紹開發步驟, 以C#程式語言為例(其實任何語言皆可, 只是呼叫方式略有不同而已)如下:

(1)正常機碼必須有下列註冊檔, 否則程式無法呼叫API(有個補救方法, 下載Mach3Registry.reg, 執行可產生).
xxxxxxxxxx : 每套機碼不一樣.
[HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxx}]
@="Mach4.Document"
[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx]
@="ole32.dll"
[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\LocalServer32]
@="C:\\Mach3\\Mach3.exe"
[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\ProgID]
@="Mach4.Document"
[HKEY_CLASSES_ROOT\Mach4.Document]
@="Mach4.Document"
[HKEY_CLASSES_ROOT\Mach4.Document\CLSID]
@="{ xxxxxxxxxxx }"

(2)在C# /專案/加入參考/ 將Mach3.exe 加入參考,
並在程式前面加入
using System.Runtime.InteropServices;
using Mach4;

(3)主要操作就是這項, 一旦取得Mach3的handle(mInst), 就可長驅直入使用其提供的所有功能(功能可參考Mach3 Version3.x Macro Programmers Reference Manual.pdf)
IMyScriptObject mInst = null;
try
{
Mach4 mach = (Mach4.IMach4)
Marshal.GetActiveObject("Mach4.Document");
mInst = (Mach4.IMyScriptObject)
mach.GetScriptDispatch();
}
catch
{
}

(4)程式有點長, 為避免洗版, 只好摘錄部分程式如下(有疑問或有興趣找我研發的也歡迎私訊我!):
//---------------------------------------------------------------------
//Mach3 Control Process
//---------------------------------------------------------------------
private IMyScriptObject GetMachInstance()
{
IMyScriptObject mInst = null;
try
{
IMach4 mach = (Mach4.IMach4)Marshal.GetActiveObject("Mach4.Document");
mInst = (Mach4.IMyScriptObject)mach.GetScriptDispatch();
}
catch
{
}
return mInst;
}
//---------------------------------------------------------------------
private bool DoEmButton(short number)
{
if(_mInst != null)
{
_mInst.DoOEMButton(number); //Start
return true;
}
return false;
}
//---------------------------------------------------------------------
private void DoGCode(string code)
{
if(_mInst != null)
_mInst.Code(code);
}
//---------------------------------------------------------------------
private void sendMDI()
{
if(textBoxMDI.Text.Trim() != null)
{
DoGCode(textBoxMDI.Text.Trim());
}
}
//---------------------------------------------------------------------
private double[] UpdateDRO()
{
double[] dro = new double[3];
if(_mInst != null)
{
dro[0] = _mInst.GetOEMDRO(800);
dro[1] = _mInst.GetOEMDRO(801);
dro[2] = _mInst.GetOEMDRO(802);
}
return dro;
}
//---------------------------------------------------------------------
//dir = 0 to + direction, dir = 1 to - direction
private void xJogStart(DirectionType dir)
{
if(_mInst != null)
_mInst.JogOn((short)AxisType.X, (short)dir);
}
//---------------------------------------------------------------------
private void xJogStop()
{
if(_mInst != null)
_mInst.JogOff((short)AxisType.X);
}
//---------------------------------------------------------------------
private void yJogStart(DirectionType dir)
{
if(_mInst != null)
_mInst.JogOn((short)AxisType.Y, (short)dir);
}
//---------------------------------------------------------------------
private void yJogStop()
{
if(_mInst != null)
_mInst.JogOff((short)AxisType.Y);
}
//---------------------------------------------------------------------
private void zJogStart(DirectionType dir)
{
if(_mInst != null)
_mInst.JogOn((short)AxisType.Z, (short)dir);
}
//---------------------------------------------------------------------
private void zJogStop()
{
if(_mInst != null)
_mInst.JogOff((short)AxisType.Z);
}
//---------------------------------------------------------------------
private void buttonStart_Click(object sender, EventArgs e)
{
DoEmButton(1000); //start
}
//---------------------------------------------------------------------
private void buttonFeedhold_Click(object sender, EventArgs e)
{
DoEmButton(1001); //Feedhold
}
//---------------------------------------------------------------------
private void buttonStop_Click(object sender, EventArgs e)
{
DoEmButton(1003); //Stop
}
//---------------------------------------------------------------------
private void buttonMDI_Click(object sender, EventArgs e)
{
if(_mInst != null && textBoxMDI.Text.Trim() != null)
_mInst.Code(textBoxMDI.Text.Trim()); //senMDI
}
//---------------------------------------------------------------------
private void timerUpdateDRO_Tick(object sender, EventArgs e)
{
double[] dro = UpdateDRO();

textBoxX.Text = dro[0].ToString("#0.0000");
textBoxY.Text = dro[1].ToString("#0.0000");
textBoxZ.Text = dro[2].ToString("#0.0000");
}
//---------------------------------------------------------------------
private void buttonPX_MouseDown(object sender, MouseEventArgs e)
{
xJogStart(DirectionType.Positive);
}
//---------------------------------------------------------------------
private void buttonPX_MouseUp(object sender, MouseEventArgs e)
{
xJogStop();
}
//---------------------------------------------------------------------
private void buttonNX_MouseDown(object sender, MouseEventArgs e)
{
xJogStart(DirectionType.Negtive);
}
//---------------------------------------------------------------------
private void buttonNX_MouseUp(object sender, MouseEventArgs e)
{
xJogStop();
}
//---------------------------------------------------------------------

p.s. 一手操作一手攝影, 非專業攝影, 影片有些抖動請見諒!

陳必凱
2019-12-16 10:56:00


原文網址 石小川
2019-12-16 09:18:25

分享給想要了解Mach3及USB控制卡如何通訊的朋友參考,可進一步修改成Python版本。

Mach3 USB程式是以HID裝置類型通訊協定作為溝通管道, 因為現在Windows 作業系統都有內建支援HID裝置的驅動程式, 所以焦點只要設計PC應用程式即可, 省掉很多麻煩事情.

如果用抓封包工具程式(Wireshark 或 Bus Hound)觀察Mach3 USB封包可得知, HID報告描述元(Report)的每次輸入/輸出資料交易是以61個位元組(Byte)為單位送出或接收, 只要解析這些位元組即可直接控制USB Mach3 CNC運動控制卡, 不須Mach3介入, 這樣做的好處是可以自已設計一些人工智慧演算法(例如影像辨識)去直接控制CNC機台做自動光學檢測(AOI), 或改裝CNC成機器手等. 當然有些非Mach3 CNC控制卡廠商有推出API開發包, 應用程式直接呼叫API就更方便了, 這樣就不需要了解煩人的底層封包問題, 不過這篇是要分享給想設計類似Mach3程式或製作USB Mach3 CNC運動控制卡的人參考, 由於資料太多, 不想洗板, 我就列出部分範例提供參考。

我的CNC機器裝置配備是USB Mach3 CNC六軸連動控制卡, 螺桿Pitch=5mm, 步進驅動128細分.

解析後的封包資料如下:
基本上Reset , M code, G Code都要解碼.

(A)繼電器控制
M204/M205碼我是規劃成繼電器控制警示燈
M204 Code(Output 7 ON) :
public string[] Output = { "02 06 58 00 09 20 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

M205 Code(Output 7 OFF) :
public string[] Output = { "02 06 58 00 09 00 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

p.s. 標註的02 06 58 是M控制碼, 09 20/09 00 是On/Off作動參數.

(B)步進馬達控制
G0 Xn Code :
public string[][] G0X = {
//G0 X0
new string[]
{"02 0e 55 e6 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
"02 0e 55 b4 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
.
.
};

p.s. 標註的02 0e 55 是G0控制碼, e6 ff/b4 ff 是馬達脈衝參數.

另外值得一提的是Mach3步進馬達的脈衝控制是以圖中(G0 X5)所示的方式控制, 只要遵照斜率及內插數值就可組合出想要馬達移動的距離及速度了, 如果是六軸連動當然更複雜了!

沒圖沒真相, 最後簡單的寫了一個小程式Demo一下, 有興趣的朋友可參考一下囉!


原文網址 石小川
2019-12-15 18:14:44

[開發機器人工具箱- G9 Toolkit v2.0]

這個板子是我設計用來開發機器人運算核心 - G9模組的開發板, G9模組採用的是ADI公司的高速DSP晶片, 多顆G9模組陣列可平行運算, 適合跑類神經網路演算法, 目前也用在AI產品上, 希望很快能跟大家見面, 介紹給大家^^

[G9 Module (G9 類神經網路晶片模組)]
CPU: ADI 高速DSP
size: 3.2cm x 3.2cm

這顆是我設計的第三代類神經網路晶片模組, 既是單晶片IO控制電腦, 也是高速數位訊號處理DSP電腦, 代號我取名G9, 內部有一顆高速DSP內核, 外部輸入電壓是DC5V,DSP內核工作電壓為DC3.3V,目前設定DSP工作頻率為400MHz。可實現語音、影像、類神經網路等演算法Real time的需求。現在我的專案是把它拿來Run自動導航及光學雷達, 機器人視覺聽覺等深度學習演算法用。

主要功能是語音/影像辨識及馬達控制, 開發軟體是C語言, 可跑類神經網路(ANN)及平行處裡運算, 目前只提供員工內部教育訓練及開發產品上, 將來開發手冊完備後再Release G9 Toolkit v2.0給有興趣研發的人士.

圖1. G9 Toolkit v2.0.
圖2. G9 Module.
圖3. G9 Module可接CMOS Sensor做影像辨識.

Eric Yang
2019-12-15 20:52:56

加一


原文網址 石小川
2019-12-15 18:06:21

Qt是一個跨平台的C++應用程式開發框架, 是自由且開放原始碼的軟體, 程式編譯碼可在PC, ARM, x86, 平板或手機上Run, Qt Creator IDE開發環境跟使用VS C#差不多, 在此我就不多說了, 我通常拿來開發自動控制人機圖形介面, 雖說Python我也蠻熟悉的, 但老實說我喜歡Qt >>>>>> Python 更多!!!!!!!!!!!!!!!!!!!!!, 不過很遺憾地似乎國內工程師使用的比較少, 大陸工程師用的比較多! Qt不看書也可以很快上手, 但要更進階的Qt設計程式, 例如跑OpenGL, 多執行序, TCP/IP, SQL 或多媒體圖形處理, 建議案頭上還是買一本參考的書看看, 下面我介紹兩本書給有興趣的好友參考, 這兩本我都看過了, 只要熟讀一本就足以舉一反三了, 都是對岸寫的簡體字版, 台北天瓏書局有售! p.s. 下列官方網址可免費下載最新版本Qt, 建議在PC上玩看看, 有問題的話也可跟我討論一下. https://www.qt.io/download-qt-installer…


 

討論主題

發文排行榜

回文排行榜

熱門關鍵字