2016 年 11 月

第 31 卷,第 11 期

本文章是由機器翻譯。

Azure IoT 中樞 - 使用 Azure IoT 中樞擷取並分析腦波

Benjamin Perkins

大腦是引擎,會將從許多來源和多介面,同時輸入,然後觸發某種類型的動作或不正常的反應。來源,例如像氣味、,而聲音可以觸發 calmness、 實體移動至陰影或吵雜的聲音個笨蛋反應花卉、 太陽或 firecrackers 和介面。目前,尚不存在的可靠的演算法,像這樣由於大規模的來源,人類與介面之間的變數數目。

衍生這個複雜的演算法的方式是以取得進一步了解如何做大腦,並在許多情況下,例如 smelling 花卉、 燒錄太陽中和意外聽到 firecrackers 反應。本文說明如何取得更多了解如何大腦函式中指定的案例,希望有朝一日在多個非預期的情況下可靠地定義回應的演算法。

擷取、 儲存及分析大腦波

這篇文章中所述的專案會使用許多技術來擷取、 儲存和分析大腦波形,其中每一個簡短描述 [圖 1。前兩個元件︰ 擷取大腦浪潮,並將它們儲存到 Azure IoT 中心 — 這篇文章的下一節所述。其餘的三個元件將會說明在未來年 MSDN Magazine 的這篇文章的第 2 部分。

[圖 1 的大腦次日專案的元件

元件 角色 簡短描述
Emotiv Insights SDK 擷取 將轉換成數字的大腦波大腦介面
Azure IoT 中心 儲存空間 IoT 裝置呈現資料的暫存儲存體佇列
SQL Azure 儲存空間 高度可調整、 價格合理且彈性資料庫
資料流分析 儲存空間 Azure IoT 與 SQL Azure 之間的介面
Power BI 分析 資料分析工具使用簡單的圖形支援

 

章節細分元件後,每個包括的功能與技術的說明,再加上程式碼或組態需求的詳細資料。方案的不同部分排序的方式,我建立它們。不過,很可能在許多不同的排序順序中建立它們。技術的目標是上傳使用大腦電腦介面 (BCI) 所收集的大腦浪潮、 將它們儲存成 SQL Azure 資料庫及分析 Power bi 的資料。

擷取大腦浪潮

當大腦接收輸入,且需要回應時,它會決定如何藉由引發稱為類神經振動神經之間的電力目前回應。這些神經的力道會導致大腦真實、 燒錄振動的情況下的不同強度與從不同位置的實體移動。

Electroencephalograph 擷取這些振動的情況下,並只在過去幾年來已開始建立擷取這些大腦活動且價格實惠 BCI 的公司。(許多這些公司和裝置的清單會很 bit.ly/2c7j4fw。) 此外,這些公司的數個已建立允許即時的視覺效果與儲存體的大腦活動其裝置的 SDK。

有關我的大腦波放置到 Azure; 我初始意圖撰寫簡短的文章您可以讀取在 bit.ly/294Hi4R。請注意,我選擇 Emotiv 深入了解 BCI,此專案。此 BCI 與每個狀態的心讀數提供五個不同的大腦頻率,有五個電極 (AF3、 AF4、 T7、 T8 和 O1) 示 [圖 2

[圖 2 Emotiv 深入了解 BCI 閱讀資料

大腦頻率 注意的狀態
ALPHA 比較不嚴謹、 高的層級的創意,反射
LOWBETA 社交活動、 興趣,警示
HIGHBETA 焦點、 快速思考、 工作
GAMMA 想考慮,作用中的最佳的頻率
THETA 睡眠狀態,請立即停止該、 meditative 和夢

 

Emotiv SDK 可從 GitHub (github.com/Emotiv) 且輕鬆地設定; 這個範例會使用社群 sdk 版本。在 C# 版本的 SDK,才能使用 Visual Studio 執行設定時,發生了三個 「 問題 」 並非直覺式︰

  1. 您必須特別注意您的 Visual Studio 專案的 「 位元 」,且位元屬性目標的位元 No.3 中的元件。
  2. 請確定 DotNetEmotivSDK.dll 會編譯成相同的位元為 [否]。 3。
  3. 您必須手動將 edk.dll glut32.dll/glut64.dll 複製到工作目錄,例如解決方案︰ /bin/Debug 或/bin/Release。

若要開始,請瀏覽社群中的 C# 專案-sdk-master\examples\C # 資料夾,然後開啟 Visual Studio 中 DotNetEmotivSDK 方案。DotNetEmotivSDK 專案設定為啟始專案,以滑鼠右鍵按一下專案,然後選取 [設定為啟始專案,按下 Ctrl + Shift + B 編譯專案。請特別注意平台目標,請務必保持一致的 sdk 設定期間。您應該選擇 x86 或 x64。

接下來,在 Visual Studio 中建立新的主控台應用程式,並加入 DotNetEmotivSDK.dll 參考上按一下滑鼠右鍵,並導覽至 ex DotNetEmotivSDK 專案的編譯期間所建立的參考︰ \obj\x86\Release 目錄,然後選取 [只編譯的二進位檔案。最後,將 edk.dll 和 glut*.dll 檔案複製到相同的工作目錄,如 DotNetEmotivSDK.dll 放置。有許多 edk.dll 和 glut*.dll 的複本。選擇此位置的 SDK 中所包含的二進位檔社群-sdk-master\bin\win32,如果您已經編譯為 32 位元的所有項目,否則,請選擇 64 位元版本。

一旦 SDK 已正確設定,並準備新的主控台應用程式,將使用 Emotiv Program.cs 類別中,參考程式庫中的功能。如有需要,請檢視 BrainComputerInterface 專案可下載的範例程式碼。因為這是其執行 BCI 裝置的某些預先驗證時,請請特別注意 GetHeadsetInformation。

EmoStateUpdatedEventHandler ProcessEvents EmoEngine 類別方法呼叫時都會觸發訂閱 GetHeadsetInformation 方法。GetHeadsetInformation 方法會繼續呼叫 ProcessEvents 一段時間內執行迴圈,直到 bool stopHeadsetInformation 設為 false。觸發 EmoStateUpdatedEventHandler 時,它會執行 engine_EmoStateUpdated 方法,用來檢查電池層級及訊號強度。請務必電池已可接受的計量所收集 BCI 資料的有效而且有足夠的藍芽 4.0 LE 連線 BCI 連絡人與電腦之間。

在原始程式碼中,擷取 BCI 資料不是之前的兩個測量值傳遞適當的臨界值,例如 chargeLevel > 1 & & signalStrength > EdkDll.IEE_SignalStrength_t.BAD_SIG。只要訊號強度大於的 IEE_SignalStrength_t.NO_SIG,其中 NO_SIG 表示沒有訊號,裝置被視為正常運作,但不是理想的狀況,因此 signalStrength 必須至少等於 GOOD_SIG 再繼續進行。此外,maxChargeLevel 為 5,並目前大於一的充電程度反映運作狀態。擷取大腦浪潮的程式碼,但電力等級、 訊號強度和電極的每個連絡人的品質如下所示︰

EmoState es = e.emoState;
EdkDll.IEE_SignalStrength_t signalStrength =
  es.GetWirelessSignalStatus(); es.GetBatteryChargeLevel(
  out chargeLevel, out maxChargeLevel);
WriteLine($"AF3: {(int)es.GetContactQuality(
  (int)EdkDll.IEE_InputChannels_t.IEE_CHAN_AF3)}");
WriteLine($"AF4: {(int)es.GetContactQuality(
  (int)EdkDll.IEE_InputChannels_t.IEE_CHAN_AF4)}");
WriteLine($"T7:  {(int)es.GetContactQuality(
  (int)EdkDll.IEE_InputChannels_t.IEE_CHAN_T7)}");
WriteLine($"T8 : {(int)es.GetContactQuality(
  (int)EdkDll.IEE_InputChannels_t.IEE_CHAN_T8)}");
WriteLine($"Pz : {(int)es.GetContactQuality(
  (int)EdkDll.IEE_InputChannels_t.IEE_CHAN_O1)}");

注意: BCI 可以達到電極的讀數,即使是不好的連絡人的品質。當某些電極正在擷取資料,其他電極可能不是,這是不理想的情況下,因為結論稍後從 [資料分析的錯誤解譯如果工作階段期間所有電極不完整的功能。在範例中,來測量,並確認所有電極功能; 沒有程式碼不過,這應該是大小寫之前儲存的度量單位。程式碼撰寫邏輯以確認所有電極都可執行程式碼之前完全正常運作的替代方式是使用可從線上 Emotiv CPANEL bit.ly/1LZge5T。那里,您會看到類似的程式碼 [圖 3

驗證電極 BCI 的大腦介面
[圖 3 驗證電極 BCI 的大腦介面

一旦 engine_EmoStateUpdated 方法確認 BCI 是否正常運作時,它會設定 stopHeadsetInformation = false,會中斷 while 迴圈 GetHeadsetInformation 方法中的。從每個電極讀取頻率的 C# 程式碼所示 [圖 4 GetBrainInterfaceMeasurements 方法中找不到。方法會先建立單一維度陣列型別的 EdkDll.IEE_DataChannel_t 五個參考項目時,在裝置上的 electrode 每一個參考項目。最後,程式每五個電極執行迴圈,並輸出至主控台的頻率優點。請注意 GetAverageBandPowers EmoEngine 類別方法接受 channel\electrode (channelList[i]) 和頻率的變數 (theta、 alpha、 low_beta、 high_beta 和 gamma) 的大腦 wave 數字表示會儲存到其中。每個與 electrode 讀數會轉譯為使用靜態的 WriteLine 方法系統類別中的主控台視窗。

[圖 4 讀取的大腦頻率值介面電極

EmoEngine engine = EmoEngine.Instance;
EdkDll.IEE_DataChannel_t[] channelList = new EdkDll.IEE_DataChannel_t[5]
{
EdkDll.IEE_DataChannel_t.IED_AF3,
EdkDll.IEE_DataChannel_t.IED_AF4,
EdkDll.IEE_DataChannel_t.IED_T7,
EdkDll.IEE_DataChannel_t.IED_T8,
EdkDll.IEE_DataChannel_t.IED_O1
};
while (true)
{
  for (int i = 0; i < 5; i++)
  {
  engine.IEE_GetAverageBandPowers(0, channelList[i],
    theta, alpha, low_beta, high_beta, gamma);
  WriteLine($"Channel: {channelList[i]}");
  WriteLine($"Alpha: {alpha[0].ToString()}, Low Beta: {low_beta[0].ToString()}, " +
    $"High Beta: {high_beta[0].ToString()}, Gamma: {gamma[0].ToString()}, " +
    $"Theta: {theta[0].ToString()}");
  }
}

主控台應用程式,您必須 Emotiv 深入了解 BCI 和它的有效藍芽連線。不論選擇 BCI、 原則是以下列方式相同︰

  • 在開始之前擷取和儲存資料確定裝置處於最佳且一致的狀態,讓所有記錄的資料收集方式相同。
  • 了解如何設定電極和什麼它們會測量,然後存取測量結果並顯示它們,更新儲存體和分析。

主控台應用程式使用,並將結果寫入至主控台視窗之後,請繼續下一節,討論如何設定 Azure IoT 中心。這篇文章的第 2 部分將討論如何設定 SQL Azure 資料庫,資料流分析插入 BCI 資料分析和學習。

平行之間撰寫的程式碼和大腦

我不認為我是唯一的人員所做的程式碼結構的建構與人類特性之間的連線。似乎在許多方面的程式碼的平台建置當初設計的使用我們的人力的特性,因為程式碼中定義自己的能力似乎運作,因此,它幾乎不會想到的流程。請參考的物件導向程式設計詞彙繼承,其中的子類別接收自父類別的一組屬性和特性。在人力的內容中,子系會接收屬性從其父代,像是眼睛和線色彩。此外,逐步、 閃爍以及嗅覺功能是通常擁有人,有條理特性的範例,我的父母一樣。不過,這些特性並不是直接來自我的父母、 它們繼承許多層代,透過從人為的基底類別本身。

如果您要建立的人為的類別,您應該會執行,藉由包含所有基本的人力屬性,在該類別中,例如性別特性吃、 睡眠、 石,依此類推。然後,您會建立父系類別繼承自人力的類別,使用一些其他唯一或更多進階特性,例如反映、 語音、 慣用的等等,假設,或不是,每個層代繼承的類別的一段時間,成為更複雜。繼承漸進式延續至較新的子類別的實作。

方法讓人談而溝通與每個層代是另一個稱為多型的程式設計概念其中發生的變更。多型表示,雖然父特性具有相同名稱的目的和子系的目的,它可以執行不同的方式與多個輸入,讓結果更精確。比方說,雖然父系有能力說話,子系可以有類似,說能力反向此外也包含多種語言的方法。額外的參數到語音方法就是語言型別。這項輸入不會出現在父代的語音方法。衍生的多載說話特性也可能包括一些增強的通訊功能,例如臉部的運算式或語氣變化。

建立這些結構化的類別、 複雜的方法和一組唯一的屬性是有趣的旅程,到我們的內部 self 和存在性的經驗。建構並定義自己是了解為何我們我們的使命的最佳方式。還有一件事,不過,也就是很快就發現建立模型之後,也就是︰ 如何觸發方法,因此子系可以實際辦點。具現化類別是小事一樁 (子系子 = 新 Child()),但的引擎,然後呼叫的方法,並使用屬性是什麼? 引擎不存在於所有是蒼穹和 thoughtless 的實體。雖然人力引擎使用選擇題目視、 氣味和觸控觸發適當的方法,但電腦引擎會使用資料和自動程式碼來解譯輸入做為動作的基礎邏輯。若要撰寫程式碼邏輯正確寫入我們必須先瞭解的人類的運作方式,這是我們不執行。缺漏的一角是大腦。

儲存大腦浪潮

若要儲存從 BCI 收集大腦浪潮,有許多必要的元件。從個別的觀點來看,理論上,您可以建立簡單的 ADO.NET 連接到本機 SQL 資料庫就是這樣。不過,如果您想要讓許多裝置很多人使用的應用程式,使用 Azure IoT 中心是最佳的選擇,因為這其可靠性和延展性。已成功上傳並儲存大腦波需要下列三個元件︰

  1. Azure IoT 中心
    1. 裝置識別身分
    2. 若要上傳的大腦 wave 的程式碼
  2. SQL Azure 執行個體和資料的資料表
  3. 資料流分析介面

現在探討更多詳細資料中建立的 Azure IoT 中心。

建立 Azure IoT 中心

Azure IoT 中心是類似的訊息佇列,在於它暫時儲存多個資料列的資料,但卻該另一個實體,例如讀取器或,在此情況下,資料流分析工作,監視佇列,並採取行動一次訊息抵達。Azure IoT 中心的好處是時間的它是時間的極有彈性且可調整為非常大的大小,在很短。當測試此解決方案,插入每秒約三個資料列,用戶端記錄計數完全相符的伺服器端的計數。每秒的三個事件是非常小。Azure IoT 中心可以處理數百萬事件每秒。

若要建立 Azure IoT 中心,您需要 Azure 訂用帳戶和存取在 Azure 入口網站 bit.ly/2bA4vAn。按一下 [+ 新增] 功能表項目並瀏覽至物聯網,然後選取 [IoT 中心。輸入所需的資料,然後按 [建立] 按鈕。很可能有一個免費層每一訂閱的 IoT 中心。在免費層支援 8000 每日的事件。「 免費 」 層次是我選擇此專案中。不過,如果您需要將多個事件,然後選擇適當的層。一旦建立之後,檢視詳細資料,如所示 [圖 5

BCI Azure IoT 中心的 [詳細資料] 頁面
[圖 5 BCI Azure IoT 中心的詳細資料頁面

Azure IoT 中心建立之後下, 一個步驟是建立連接和資料上傳至 Azure IoT 中心所需的唯一裝置身分識別。可下載的來源包含名為 BrainComputerInterface-CreateIdentity,便會執行此活動的主控台專案。若要建立您自己的專案,開始在 Visual Studio 中建立空的主控台應用程式。建立之後,專案上按一下滑鼠右鍵並選取 [管理 NuGet 封裝,然後搜尋並將新增 Microsoft.Azure.Devices 封裝所提供的範例程式碼。會使用版本 1.0.11。

之前開始撰寫程式碼的裝置實體建立、 存取 Azure IoT 中心,並選取共用取得的連接字串,請從 [設定] 刀鋒視窗存取原則。接下來,選取適當的資料表中所述的原則 [圖 6。選取其中一個表格中顯示的原則會開啟刀鋒視窗中顯示的權限和共用存取金鑰。複製連線字串-主索引鍵,並將它用於設定連接字串中所示的值 [圖 7

[圖 6 連線字串原則、 權限和使用方式

原則 權限 用途
Iothubowner 登錄讀取/寫入,服務/裝置連線 系統管理
服務 服務連線 傳送和接收端定域機組端點上
裝置 裝置連線 傳送和接收裝置後端端點上
RegistryRead 登錄讀取 識別登錄的讀取權限
RegistryReadWrite 登錄讀取/寫入 識別登錄的讀取/寫入存取

[圖 7 建立每個唯一的裝置識別碼的裝置金鑰

static RegistryManager _registryManager;
static string _connectionString = "the iothubowner connection string";
static void Main(string[] args)
{
_registryManager = RegistryManager.CreateFromConnectionString(_connectionString);
AddDeviceAsync().Wait();
ReadLine();
}
private static async Task AddDeviceAsync()
{
string deviceId = "ADD UNIQUE DEVICE ID";
Device device;
try
{
  device = await _registryManager.AddDeviceAsync(new Device(deviceId));
}
catch (DeviceAlreadyExistsException)
{
  device = await _registryManager.GetDeviceAsync(deviceId);
}
WriteLine($"Generated device key: {device.Authentication.SymmetricKey.PrimaryKey}");
}

若要建立裝置身分識別,您需要的連接字串具有寫入權限身分識別登錄的原則。這表示您可以使用 iothubowner 或 registryReadWrite 原則。強烈建議使用最少的執行所需的工作; 所需的權限的原則這可以減少非預期的動作,例如全域刪除或更新的機會。保護 iothubowner 連接字串參數,並提供它,只有當您需要建立裝置身分識別或其他系統管理活動時。

檢視中顯示的範例程式碼 [圖 7。因為這是一個簡單的程式,建立 _connectionString 和 Microsoft.Azure.Devices.RegistryManager _registryManager 做為靜態類別變數。它也是沒問題,在 Main 方法中建立它們,然後將它們傳遞做為方法參數,如有需要。具現化所呼叫的 CreateFromConnectionStringMethod _registryManager 變數,然後以非同步方式呼叫 Program.AddDeviceAsync 方法。

Program.AddDeviceAsync 方法呼叫 Microsoft.Azure.Devices.RegistryManager.AddDeviceAsync 方法,傳遞新 Microsoft.Azure.Devices.RegistryManager.Device。如果身分識別不存在,則會建立;否則,會擲回 Microsoft.Azure.Devices.Common.Exceptions.DeviceAlreadyExistsException。因為 try {} catch {} 程式碼區塊內執行的程式碼處理例外狀況。{} Catch 區塊內呼叫 Microsoft.Azure.Devices.RegistryManager.GetDeviceAsyncmethod,並在這兩種情況下,是否新增或 Get 方法所呼叫,裝置金鑰呈現到主控台。

當程式碼完成,並會編譯時,執行程式碼並記下裝置的金鑰,如需要建立 DeviceClient 類別,其中包含的邏輯連接,並將資料傳送到下一節中所使用的 Azure IoT 中心。此外,看看 [圖 5 並請注意,裝置連結一開始呈現灰色。建立裝置之後,已啟用 Azure IoT 中心] 分頁上的 [裝置] 連結。按一下可讓您停用/啟用裝置,並擷取裝置的金鑰,以防萬一您遺漏了建立時在主控台視窗中。

上一節中已撰寫的程式碼來擷取大腦浪潮。現在需要發生的情況是,反而比撰寫 BCI 輸出至主控台,將其寫至剛建立之 Azure IoT 中心。範例程式碼中沒有名為 BrainComputerInterface 的專案其中 while {} 迴圈前述的 [圖 2 中所示,呼叫新方法 SendBrainMeasurementToAzureAsync,變更 [圖 8, ,這將 BCI 資料傳送到 Azure 的 IoT 中心,而不是傾印到主控台讀取的大腦電腦介面。

[圖 8 大腦 Wave 插入 Azure IoT 中心

while (true)
{
for (int i = 0; i < 5; i++)
{
  engine.IEE_GetAverageBandPowers(0, channelList[i],
    theta, alpha, low_beta, high_beta, gamma);
  SendBrainMeasurementToAzureAsync(channelList[i].ToString(), theta[0].ToString(),
    alpha[0].ToString(), low_beta[0].ToString(),
    high_beta[0].ToString(), gamma[0].ToString());
  }
}
private static async void SendBrainMeasurementToAzureAsync(string channel,
  string theta, string alpha, string lowbeta, string highbeta,
  string gamma)
{
  // ...
  try
  {
   var brainActivity = new
    { ManufacturerId, HardwareId, ActivityId, ChannelId,
      DeviceId, UserName, MeasurementDateTime, theta,
      alpha, lowbeta, highbeta, gamma };
  var messageString = JsonConvert.SerializeObject(brainActivity);
  var message = new Message(Encoding.ASCII.GetBytes(messageString));
  await deviceClient.SendEventAsync(message);
catch (Exception ex)
{ //...}
}

請注意 SendBrainMeasurementToAzureAsync 方法,如先前所述,使用 Microsoft.Azure.Devices.Client.DeviceClient 和格式化資料,並新增至雲端讀取 BCI Newtonsoft.Json 類別。如果建立新的專案,請將這兩個 NuGet 封裝加入專案上按一下滑鼠右鍵,然後選取 [管理 NuGet 封裝。

現在,BCI 將輸出寫入至 Azure IoT 中心的程式碼已完成,您可以將 BCI 放在頭上,開始上傳。BrainComputerInterface 程式啟動時執行,它會要求您選取的大腦浪潮為要儲存的案例。這些範例 smelling 花卉,處於 「 太陽聽到鞭炮,依此類推。選取案例,請驗證電極/連絡人是綠色 (請參閱 [圖 3) 然後電源和感應器模組準備好後,大腦浪潮開始被擷取並上傳至雲端。

請注意,此時,您會看到使用量計量表 IoT] 刀鋒視窗中變更為正在傳送的資料 (請參閱 [圖 5),不過,資料會刪除,24 小時後因為沒有,此時,資料庫來儲存資料,也不會將訊息從 Azure IoT 中心永久儲存位置的程式。在第 2 部分,SQL Azure 資料庫,然後建立資料流分析工作,因此您可以分析資料並探索新的項目。

總結

本文章系列最後應該會引導您朝的路徑是一體兩面。第一個是從哪裡越您進一步了解您自己和您的大腦的運作方式,更可以開始複寫,或者加強可改善您的生活品質的認知觀點來看。機器更好且更快完成數學運算,他們可以繪製從許多拓展知識基礎的決策,而不需要情緒,比用人腦可以。如果您以某種方式可以將這整合到您自己的認知,使用某種人工智慧,您能夠更快速且更精確地說就更高。

其他概念是能夠使用您日常生活中的想法控制項項目。擷取和分析大腦波能力增加時,也會增加了可放心使用。一或多個思考要推播,一旦能夠完美地定義提取或微調時,它們可以用來控制物件或執行活動,例如變更電台頻道的電視頻道。它甚至可以擷取讀取,並採取行動,才能將您自己辨識您有想要執行這項操作。有無限的可能性。


Benjamin Perkins 是高階工程師,Microsoft,C#、 IIS、 NHibernate 和 Microsoft Azure 上的四個書籍的作者。 他最近完成的共同編寫 「 開頭 C# 6 程式設計使用 Visual Studio 2015 」 (Wrox)。與他連絡 benperk@microsoft.com

感謝下列 Microsoft 技術專家來檢閱這份文件︰ Sebastian Dau
Sebastian Dau 是內嵌的高階工程師 Azure IaaS 小組