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

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

原文網址 石小川
2020-03-22 15:02:17

近期為了ROS(機器人作業系統)相關專案,於是想起了以前的小玩具 - ROVIO,塵封已久的路威機器人在倉庫找了許久,終於抓到這隻小烏龜了,檢查電池、發現零組件狀況不錯,可見保存很好,這個ROVIO機器人麻雀雖小卻五臟俱全,看看下面硬體規格就知道。分享給有興趣製作機器人的朋友做參考。 Rovio機器人主要特點: 內含麥克風及喇叭可以雙向語音交談 可以遙控攝影機頭上下移動 可以手機和電腦或者Pad遠程網路控制 可以自動充電 雷達偵測障礙 硬體規格: 是以三大電路板結合而成:
(1)主ARM 板
Main Processor —科宇KOI-MP802 蓋面
實際為華邦 W99702 內建mpeg壓縮 跑 WEB server ,rtsp , and 主機總控
制 "spook" media streaming server ( [Spook Live Video Streamer]
( http://www.litech.org/spook/ ) )
Clock frequency 200Mhz
Main Memory — 8MB RAM
USB ttl port 與電腦通訊 (以W99100DG實現,負責isp下載)
Audio chip WM8976
Web cam video chip OV7670
SPI FLASH(W25X16) 2MB
OS Open-source "eCos" (2)充電電路板:專用NiMH充電管理芯片LS2516,PWM恆流方式,
電流不詳,穩壓二極體用的是1N5822,估計>1A。 (3)驅動板 MCU:4路BJT H電橋,3個輪子用光柵反饋,攝像頭升降用
可變電阻反饋,紅外線訊號和主控板通過串口通訊。 自動導航電路以紅外線感應運算
充電基座會投射出紅外線導航點,車上再以紅外線感應器做幾何
定位.定位程式由專門晶片負責.再送出串口訊號回應給上位機定位訊息

海闊天
2020-03-22 15:42:03

這台夢幻超跑要賣多少錢啊?小川哥!

海闊天
2020-03-22 15:42:32

海闊天
2020-03-22 15:42:44

石小川
2020-03-22 17:31:46

2013年露天買的, 3000多台幣, 拿來解剖研究用! 哈哈!

詹俊英
2020-03-24 20:58:27


原文網址 石小川
2020-03-18 19:49:48

Android Studio是Google官方自家推出的免費開發工具,學習Android程式設計當然首選是Android Studio。 現在智慧手機功能強大, 多核心、影像、語音、通訊、GPS該有的都有了,隨身攜帶配合不同Sensor,想到智慧手機就有128種用途,不好好利用它實在浪費,計畫開相關Android軟/硬體實作課程。有興趣的同學可先下載Android Studio熟悉一下開發環境。 p.s. 因為Android Studio主要是用Java語言來開發程式,下次再貼文如何用Python結合Android Studio開發應用程式的方法。 注意,必須先安裝JDK,再安裝Android Studio。 步驟1. JDK下載與安裝: 須確定你的作業系統是32位元或64位元,然後選擇32位元或 64位元。 https://www.oracle.com/java/technologies/javase-jdk14-downloads.html 因為我的OS是Win10 64位元,故選 jdk-14_windows-x64_bin.exe 圖1 ? 步驟2. 確認JDK安裝版本是否正確 進入命令列視窗後輸入「java -version」指令,即可查詢目前java運作的版本。 圖2 ? 步驟3. Android Studio下載與安裝 請到下面官網Android Developers 下載,安裝很簡單,按Next鍵就對了。 https://developer.android.com/studio ? 圖3 步驟4. Android Studio IDE 如圖開發環境特寫。 ? 圖 4


原文網址 石小川
2020-03-07 18:57:10

當相同類型的程式時常使用或必須重複呼叫時,這時就是考慮將副程式加進程式庫的時候,我習慣將功能相同的函式放在一起製作專用的程式庫,例如處裡影像副程式放在TImage.dll、處裡語音副程式放在
TSpeech.dll、處裡神經網路程式放在TNeuron.dll、處裡光達程式放在TLidar.dll等等 , 一旦你的程式庫累計的夠多的話,將來設計APP應用程式就會如同貼圖一樣方便,只要呼叫程式庫就好,主程式變少了。 接下來Demo一個動態程式庫TSystem.dll,裡面函式是負責儲存使用者最後操作各個視窗元件位置及大小的資訊, 請一步步看圖解。 step1. 建立新的專案。 圖1 ? step2. 選 C#類別庫, 按下一步。 圖2 ? step3. 設定新的專案, 並按建立。 圖3 ? step4. 設計程式碼TSystem.cs。
//----------------------------------------------------------------------
//動態程式庫 TSystem.dll 範例
//---------------------------------------------------------------------- using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Drawing; namespaceTSystem
{
public class WindowPosition
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Point position)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create));
WriteFile.Write(position.X);
WriteFile.Write(position.Y);
WriteFile.Close();
} //------------------------------------------------------------------------
public Point ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Point(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Point position = new Point(ReadFile.ReadInt32(),
ReadFile.ReadInt32());
ReadFile.Close();

return position;
} } //public class WindowPosition //-------------------------------------------------------------------------
public class WindowhSize
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Size size)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create)); //main form size
WriteFile.Write(size.Width);
WriteFile.Write(size.Height);
WriteFile.Close();
}

//------------------------------------------------------------------------
public Size ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Size(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Size size = new Size(ReadFile.ReadInt32(), ReadFile.ReadInt32());
ReadFile.Close();

return size;
} } //public class WindowSize
} //namespace TSystem step5. 建置方案, 產生TSystem.dll。 圖4 ? step6. 產生的TSystem.dll的檔案及路徑。 圖5 ? step7. 主程式呼叫TSystem.dll, 需將產生的TSystem.dll加入參考。 圖6 ? step8. 主程式呼叫TSystem.dll( 關注//Note的地方即可 )。
//----------------------------------------------------------------------
//C# 主程式呼叫動態程式庫 TSystem.dll 範例
//----------------------------------------------------------------------
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using Emgu.Util;
using Emgu.CV.UI;
using Emgu.CV.BgSegm;
using Emgu.CV.VideoSurveillance; //Note
using TSystem;
using TCamera; //-----------------------------------------------------------------------------
namespace VT
{
public partial class MainForm : Form
{
//---------------------------------------------------------------------
public ToolboxForm CreateToolboxForm(Form parent, string text,
bool bshow = true)
{
ToolboxForm toolboxForm;
toolboxForm = new ToolboxForm();
toolboxForm.MdiParent = parent;
toolboxForm.Text = text; if(bshow)
toolboxForm.Show();

return toolboxForm;
}

//---------------------------------------------------------------------
public ImageXYForm CreateImageXYForm(Form parent, int number,
stringtext, bool bshow = true)
{
ImageXYForm imageForm;
imageForm = new ImageXYForm(number);
imageForm.MdiParent = parent;
imageForm.Text = text;

if(bshow)
imageForm.Show();

return imageForm;
}

//---------------------------------------------------------------------
public static MainForm _gmainForm = null;
public static ToolboxForm _gtoolboxForm = null;
public static ImageXYForm _gimageXYForm = null;

//Note
public WindowhSize _winSize = null;

//---------------------------------------------------------------------
//Main Program
//---------------------------------------------------------------------
public MainForm()
{
InitializeComponent();
}

//---------------------------------------------------------------------
private void MainForm_Load(objectsender, EventArgs e)
{
_gmainForm = this;

//Note
//讀取系統設定檔
_winSize = new WindowhSize();
Size size = _winSize.ReadSystemInfo(@"..\..\system\mainform.inf");
if(size.Width == -1 && size.Height == -1)
this.ClientSize = new Size(1200, 700);
else
this.ClientSize = new Size(size.Width, size.Height);

//修改mdi窗体背景色--------------------------------------------------------
MdiClient ctlMDI;

// Loop through all of the form's controls looking
foreach(Control ctl in this.Controls)
{
try
{
// Attempt to cast the control to type MdiClient.
ctlMDI = (MdiClient) ctl;

// Set the BackColor of the MdiClient control.
ctlMDI.BackColor = Color.LightGray; //this.BackColor; //Color.Blue;
}
catch(InvalidCastException)
{
// Catch and ignore the error if casting failed.
}
}

_gtoolboxForm = CreateToolboxForm(this, "工具箱");
_gimageXYForm = CreateImageXYForm(this, 0, "XY軸攝影機");
} //private void MainForm_Load(object sender, EventArgs e)

//--------------------------------------------------------------------- private void MainForm_FormClosed(object sender,
FormClosedEventArgs e)
{
//Note
_winSize.WriteSystemInfo(@"....\system\mainform.inf",
new Size(this.ClientSize.Width, this.ClientSize.Height));
}
} //public partial class MainForm : Form
} //namespace VT step9. 執行主程式成功。
圖7 ?


原文網址 石小川
2020-03-06 15:23:51

時常有學員問我PyQt5授權問題, 在這裡就一起回答同學的提問。

PyQt是GPLv3協議,大意是你的程式中使用了它,你的程式就要開源,如果閉源商用就會違反協議。

老師上課都開源程式碼故無此問題,但有同學是寫套裝商用軟體販售的,商用無法開源,就需要付可觀的授權費,這時用PyQt就麻煩了!

有沒有解套方式? 沒關係,直接換PySide2就好, 兩者API幾乎一樣, PySide2是由Qt官方維護,而PyQt5由非Qt官方維護。 而且未來發展應會超越PyQt5。

PySide是LGPL協議,如果你只是作為程式庫用它,你的程式還是可以閉源商用。所以很多人喜歡PySide,而且PySide2版本已支援Qt5功能。

結論是: 如果不做商業項目,強烈建議使用PyQt5,資料多,穩定。需要開發閉源商用軟體的就用PySide2。

避免無謂的商業授權費干擾,下面連結很清楚可參考看看LGPL和GPL :

https://progressbar.tw/posts/97


原文網址 石小川
2020-01-07 09:56:49

今天想介紹三本好書給大家參考,對於想窮盡宇宙知識的朋友來說應該是一個很好的入門書籍。影像、語音、雷達數位信號處理、神經網路底層的推導式子都是這些基本知識的延伸,立志當科學家的朋友強烈建議一定要看! (一) 數學中美麗的詩篇 - 傅立葉分析 數學中美麗的詩篇是 "傅立葉轉換",而 電磁學中美麗的詩篇是 "馬克斯威爾方程式". 今天要介紹的這本書 ~『數學中美麗的詩篇 - 傅立葉分析』, 是復漢71年出版, 是我很喜歡的一本書, 在學生時期我就對傅立葉級數很著迷, 這本書是我的心靈捕手, 它是大自然的樂譜, 描述一段段美麗的音符, 所幸找到它填補了我心靈上的空虛, 懂得能欣賞它的美是幸福的! 哈哈! 我發現我也是怪咖一個^^ 傅立葉轉換的應用範圍廣泛, 舉凡光學、聲學、電磁學、機械都可看到它的蹤跡, 我在研究語音及影像辨識的時候也是以傅立葉轉換做頻譜特徵分析的, 現在做能源更少不了它, 是非常好用的數學分析工具, 介紹給有需要的朋友! p.s. 雖然書局也有其他傅立葉相關著作, 但是我覺得這本書還是比較佳, 這是已經是絕版的書, 圖書館應該還找的到吧! 圖1 ? (二)A Student's Guide to Maxwell's Equations(中譯本: 電磁學天堂祕笈) 裡面內容淺顯易懂, 看完不會有見樹不見林的感覺, 適合想真正瞭解電磁學Maxwell's Equations涵義的人閱讀, 我教研究生及工程師時也是用此當做輔助教材, 可參考看看! 圖2、3 ? ? ( 三 ) 推薦研讀費曼物理學講義 熟讀唐詩三百首,不會吟詩也會吟。同樣的,研讀費曼物理學,不識科學也很難了。 費曼物理學講義(The Feynman Lectures on Physics)不同於其他教科書的無趣,章節精彩實用,記的年少時除了迷戀金庸小說之外,費曼物理學講義就是我最愛的章回小說了。目前工作遇上瓶頸時我會翻翻費曼物理學講義,還能找到不少線索提供研發的參考呢! 對想瞭解宇宙的朋友更值得一看,融會貫通之後就能欣賞造物者之美。我腦袋稍微開竅也是拜此書所賜。 對讀者的建議是最好有微積分的基礎較能輕鬆閱讀,亞馬遜網路書局有賣 ( http://www.amazon.com/dp/0465023827/ref=dra_a_rv_ff_fx_it_P2000_1000?tag=dradisplay-20 ), 或打上關鍵字 "The Feynman Lectures on Physics"可以完全免費線上閱讀。 圖4 ?

廖偉
2020-03-02 14:30:05

逛到這邊突然心裡也有共鳴,不知版大有無也看過這本https://www.sanmin.com.tw/product/index/001416577

石小川
2020-03-02 15:56:31


原文網址 石小川
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-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…


原文網址 石小川
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


 

全不選 發文排行