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

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

原文網址 石小川
2019-11-26 11:24:33

(之前在其他社團分享過C#版本, 現在改用Python分享給社團好友。) 這個羅技飛行搖桿本來是用在一個從頭城出發要去一個遙遠地方的大台UAV,看到挑戰國內法令的罰款可能會罰到脫褲子, 所以只能收手不玩了, 天空不能玩了, 就換地上及海上囉, 於是把程式移植到CNC, 運作起來還蠻順手的, 像是 夾娃娃機, 其實不管是CNC軸控、太空船、飛機或機器人, Joystick程式是一樣的。 以前玩Apple-II時曾經用6502組合語言改寫地球保衛戰的電玩, 大意是太空衛星發射雷射光射向入侵地球的飛碟, 但不可以射到底下建築物否則扣分, 這個CNC Demo頗有幾分神似呢, 特別是雷射扳機打開發射時, 感覺還蠻爽的^^ 下面是控制搖桿程式庫TJoystick, 分享給社團好友參考一下, 須自行想辦法最佳化, 可很容易地加入自已的機台或UAV。 因為主程式很長, 所以只列出TJoystick程式庫, 主程式就不po了, 有興趣再私下討論了。 當然, 眾所皆知, Python在資料處理方面的確非常方便, 對科學家來說可以省下很多Coding 時間, 有機會再分享Python 在光學雷達(Lidar)及數位訊號處裡(DSP)的應用實例和程式碼。 p.s. Python在將來關燈工廠會佔有一席之地, 事實上在我專案計畫裡有個1024顆Xilinx FPGA迷你超級電腦是用Python當介面。 如果對Python自動控制有興趣的朋友可上我臉書或私訊我, 我有開些課程, 參考看看是否有幫助, 光騰臉書 : https://www.facebook.com/qmlab/ #須先pip install pygame #引用搖桿模組 import pygame #------------------------------------------------------------------------------ #列舉搖桿的手柄動作型態 #------------------------------------------------------------------------------ class __JoystickDirectionType(): Center = 0 zUp = 1 zDown = 2 Up = 3 Right = 4 Down = 5 Left = 6 JoystickDirectionType = __JoystickDirectionType() #------------------------------------------------------------------------------ #搖桿控制類別 #------------------------------------------------------------------------------ class TJoystick: #------------------------------------------------------------------------ def __init__(self): self.joystickCount = 0 #搖桿數目 ,接了幾支搖桿。 self.numberButtons = 0 #按鍵數目 #串列 [ ] ,用來儲存搜尋到的搖桿名稱,一隻就一個名稱。 self.joysticks = [] self.pjoystick = None #指向選用的搖桿位址 #字典型態 { },用來儲存搖桿手柄三軸及按鍵的目前狀態。 self.Controls = { 'Trigger' : 0, # Button_0 'Axis-X' : 0, 'Axis-Y' : 0, 'Axis-Z' : 0, 'Hat-X' : 0, 'Hat-Y' : 0, 'Slider' : 0, 'Button-0' : 0, 'Button-1' : 0, 'Button-2' : 0, 'Button-3' : 0, 'Button-4' : 0, 'Button-5' : 0, 'Button-6' : 0, 'Button-7' : 0, 'Button-8' : 0, 'Button-9' : 0, 'Button-10' : 0, 'Button-11' : 0, 'Button-12' : 0 } #------------------------------------------------------------------------ #開啟搖桿設備 def Open(self): #顯示初始化設定 , 沒使用到, 但必須有這一項, 否則無法正常執行 #Console : error: video system not initialized訊息不用理會 pygame.display.init() #搖桿初始化設定 pygame.joystick.init() #取得幾隻搖桿 self.joystickCount = pygame.joystick.get_count() #print (self.joystickCount) #串列 [pointer, name, nameaxes, numbuttons, umhats], 用來暫存一個搖桿資訊。 joystick = [] #找到的搖桿名稱就放進joystick for i in range(self.joystickCount): pjoystick = pygame.joystick.Joystick(i) pjoystick.init() pygame.joystick.init() #暫存取得的一個搖桿資訊 [pointer, name, nameaxes, numbuttons, umhats] joystick.append(pjoystick) #pointer [0] joystick.append(pjoystick.get_name()) #name [1] joystick.append(pjoystick.get_numaxes()) #numaxes [2] joystick.append(pjoystick.get_numbuttons()) #numbuttons [3] joystick.append(pjoystick.get_numhats()) #numhats [4] #[pointer, name, nameaxes, numbuttons, umhats] self.joysticks.append(joystick) #指向第一個Joystick (因為只接一個搖桿) self.pjoystick = self.joysticks[0][0] self.numberButtons = pjoystick.get_numbuttons(); #取得按鍵數目 #假如沒接搖桿則傳回False if(self.joystickCount == 0): return False #正確傳回True return True #------------------------------------------------------------------------ #關閉搖桿設備 def Close(self): pygame.quit() #------------------------------------------------------------------------ #取得搖桿資訊 def JoystickInfo(self): return self.joysticks #------------------------------------------------------------------------ #取得搖桿目前所有狀態 def ControlsInfo(self): return self.Controls #------------------------------------------------------------------------ #取得搖桿目前Trigger鍵狀態 (同Button-0), 所有Button 壓下去 = 1, 放掉 = 0 def getTrigger(self): return self.Controls['Trigger'] #------------------------------------------------------------------------ #取得搖桿目前Button -0鍵狀態(同Trigger) def getButton0(self): return self.Controls['Button-0'] #------------------------------------------------------------------------ #取得搖桿目前Button -1鍵狀態 def getButton1(self): return self.Controls['Button-1'] #------------------------------------------------------------------------ #取得搖桿目前Button -2鍵狀態 def getButton2(self): return self.Controls['Button-2'] #------------------------------------------------------------------------ #取得搖桿目前Button -3鍵狀態 def getButton3(self): return self.Controls['Button-3'] #------------------------------------------------------------------------ #取得搖桿目前Button -4鍵狀態 def getButton4(self): return self.Controls['Button-4'] #------------------------------------------------------------------------ #取得搖桿目前Button -5鍵狀態 def getButton5(self): return self.Controls['Button-5'] #------------------------------------------------------------------------ #取得搖桿目前Button -6鍵狀態 def getButton6(self): return self.Controls['Button-6'] #------------------------------------------------------------------------ #取得搖桿目前Button -7鍵狀態 def getButton7(self): return self.Controls['Button-7'] #------------------------------------------------------------------------ #取得搖桿目前Button -8鍵狀態 def getButton8(self): return self.Controls['Button-8'] #------------------------------------------------------------------------ #取得搖桿目前Button -9鍵狀態 def getButton9(self): return self.Controls['Button-9'] #------------------------------------------------------------------------ #取得搖桿目前Button -10鍵狀態 def getButton10(self): return self.Controls['Button-10'] #------------------------------------------------------------------------ #取得搖桿目前Button -11鍵狀態 def getButton11(self): return self.Controls['Button-11'] #------------------------------------------------------------------------ #取得搖桿目前Button -12鍵狀態 def getButton12(self): return self.Controls['Button-12'] #------------------------------------------------------------------------ #取得搖桿目前Axis -X軸值 def getAxisX(self): return self.Controls['Axis-X'] #------------------------------------------------------------------------ #取得搖桿目前Axis -Y軸值 def getAxisY(self): return self.Controls['Axis-Y'] #------------------------------------------------------------------------ #取得搖桿目前Axis -Z軸值 def getAxisZ(self): return self.Controls['Axis-Z'] #------------------------------------------------------------------------ #取得搖桿目前Slider軸值 def getSlider(self): return self.Controls['Slider'] #------------------------------------------------------------------------ #取得搖桿目前Hat -X軸狀態 def getHatX(self): return self.Controls['Hat-X'] #------------------------------------------------------------------------ #取得搖桿目前Hat -Y軸值 def getHatY(self): return self.Controls['Hat-Y'] #------------------------------------------------------------------------ #同時取得搖桿目前Hat -X軸, Hat-Y軸值 def getHatXY(self): return self.Controls['Hat-X'], self.Controls['Hat-Y'] #------------------------------------------------------------------------ #輪循監聽搖桿所有狀態 , 此函數應該放在執行緒中執行 def poll(self): #取得搖桿事件並放入事件堆疊中 , 此函數必須放置此處 pygame.event.pump() #將偵測到的搖桿狀態儲存至字典self .Controls for i in range(self.numberButtons): self.Controls['Button-'+str(i)] = self.pjoystick.get_button(i) self.Controls['Axis-X'] = self.pjoystick.get_axis(0) self.Controls['Axis-Y'] = self.pjoystick.get_axis(1) self.Controls['Slider'] = self.pjoystick.get_axis(2) self.Controls['Axis-Z'] = self.pjoystick.get_axis(3) self.Controls['Hat-X'] = self.pjoystick.get_hat(0)[0] self.Controls['Hat-Y'] = self.pjoystick.get_hat(0)[1] self.Controls['Trigger'] = self.pjoystick.get_button(0)

Grass Lin
2019-11-26 13:20:29


原文網址 石小川
2019-11-26 10:25:02

有蠻多朋友問我一個問題 - 學完Python程式之後就不知要幹嘛? 在此我提出我的看法, 看是否對初學者有幫助。

程式語言重要但只是一個輔助工具而已、就像英文一樣,不要模糊了主軸,最重要的還是人,建議找一個專題投入你的想像力和創造力, 程式功力自然提升,到時就可理解Python除了可做AI專家系統推論機、解藥廠化學式、高能物理學方程式外,還可做到雷達\聲納訊號分析或控制機器人....等等。與此跟大家共勉之。

後續會提出一些軟/硬體專題提供大家參考,希望有興趣的朋友將Python + PyQt5基礎先預習一下跟上腳步,以後軟硬體都會用Python + PyQt5來實作。

圖中操作面板就是以PyQt5實作UI介面。

p.s. 這幾天會將以前散布在各個社團的舊文章及程式整合起來以方便查閱,歡迎沒看過的朋友閱覽

陳必凱
2019-11-26 10:49:05

Grass Lin
2019-11-26 12:21:37

Grass Lin
2019-11-26 12:21:46

感謝分享

侯凱亮
2019-11-26 15:08:41

感恩!


原文網址 石小川
2019-11-25 18:31:38

Python語法簡單易學,最重要的是還有大量功能強大的免費模組可下載,其強大的應用層面已經發展到令人不可忽視的重要地位,甚至NASA也拿來當作航太人機介面的控制語言。

社團主要以Python程式控制軟/硬體為出發點,研習圖形自動控制、 機器視覺 、語音辨識 、人工智慧 、機器人、自動駕駛 、 無人飛行器 、 水下無人載具 、 光學雷達 、、 等 相關技術研討, 並且分享開源軟硬體。


原文網址 石小川
2019-11-25 16:48:14

機器視覺的一些應用,例如CNC自動對刀、物件追蹤標定、材料檢測、微生物標定、、等。


原文網址 石小川
2019-11-25 16:36:09


原文網址 石小川
2019-11-25 15:35:25

前幾期上課同學請注意, 為了簡化教學, 老師不小心將下列粗黑體字程式刪除導致雷射無法正常開關, 請自行補上, 謝謝了^^
#------------------------------------------------------------------------ # In/out Process (輸入/輸出函數) #------------------------------------------------------------------------ #對輸出端口進行控制 #port :1-48 #data :1 ON, 0 OFF def Output(self, port, data): #訂正 ,前面版本沒有加上 #清空PFIFO st = IMC_Pkg.PFIFOclear(self.gHandle, self.FIFO) if(st == 0): return False #失敗回傳False #設置加速度和進給率 st = self.SetPFIFO(self.Acceleration, self.FeedRate, self.FIFO) if(st == False): return False st = IMC_Pkg.SetOut(self.gHandle, port, data, self.FIFO) if(st == 0): return False #失敗回傳False return True; #成功回傳True #------------------------------------------------------------------------ #開 /關雷射頭, bEnable: True ON, False OFF def Laser0(self, bEnable): port = 5 if(bEnable == True): #st = self.Output(5, 1) st = self.Output(port, 1) else: #st = self.Output(5, 0) st = self.Output(port, 0) return st #回傳狀態 翻譯年糕


原文網址 石小川
2019-11-25 14:58:45


原文網址 石小川
2019-11-25 14:56:28

步驟 1 安裝 免費開源的 Python 整合開發環境 Anaconda 到官網 https://www.anaconda.com/distribution/ 下載並執行( Python 3.7 Version 32-Bit ) : Anaconda3-2019-.07-Windows-x86.exe Anaconda 會自動幫你管理 Python 的環境及函式庫,可以避 開一堆麻煩事,如果你的API 動態連結程式庫(DLL)是32 Bit,則Python版本就必須是32 Bit, 否則App執行會錯誤, 如果之前已經有安裝 Python,建議先移除,避免造成系統環 境錯誤。
步驟 2 建議選 All Users。
步驟 3 可自選路徑,Win10 預設的路徑是在 C:\ProgramData\Anaconda3,我路徑放在 C:\Anaconda3\。
步驟 4 建議勾選 Add Anaconda to the system PATH environment variable ,這很 重要,勾了才會自動將 Anaconda 路徑加進系統環境變數中。
步驟 5 安裝完成,建議 Windows 作業系統重先啟動。
滑鼠左鍵開啟 Anaconda Prompt 視窗(Windows 命令提示字元) ,用 Python 指令 pip install 安裝下列開發程式需要引用的套件 pip install opencv-python pip install numpy pip install PyQt5 pip install PyQt5-tools
[註 1] pip 是Python套件管理系統(A tool for installing and managing Python packages) ,在命令列下可很輕易地安裝Python套件。 PIP 操作命令 pip list # 查詢目前系統安裝了哪些套件 pip search package # 搜尋相關套件 pip install package # 安裝套件 pip uninstall package # 移除套件 pip show --files package # 秀出套件檔案列表 pip list --outdated # 列出過期套件 pip install --upgrade package # 升級套件


[註 2] spyder 3.3.6 尚未支援 pyQt5 ver.5.13.1 我的版本: PyQt5 Version is: 5.9.2 改這個版本看看 方法: Command Line 打下列指令, 指定版本 pip install PyQt5==5.9.2 p.s. 有同學用PyQt5 5.10.1 有成功


原文網址 石小川
2019-11-25 14:44:23

spyder 3.3.6 尚未支援 pyQt5 ver.5.13.1

我的版本: PyQt5 Version is: 5.9.2 改這個版本看看

方法:

Command Line 打下列指令, 指定版本 pip install PyQt5==5.9.2

p.s. 有同學用PyQt5 5.10.1 有成功


原文網址 石小川
2019-11-25 12:44:37


 

討論主題

發文排行榜

回文排行榜

熱門關鍵字