Windows 8でロボットをプログラミングします。Spheromagic ball

画像



数日前、ロボットを愛しエンコードするオタクのための面白いおもちゃに出会いました。 最後の2晩は、このおもちゃを研究し、Windows 8開発の経験をそのおもちゃに応用しました。 レッスンは非常に魅力的であることが判明したので、私はあなたとそれを共有することを急いでいます。



あなたの注意がに招待されています...



Sphero( www.gosphero.com )は、Orbotix製の小さなボールロボットです。



画像



キットには、充電器、取扱説明書、およびボール自体が付属しています。



画像



Spheroは、プログラミングロボットの基本を理解するための優れたプラットフォームのように見えますが、オタク、その友人、子供、ペットにとっては楽しいおもちゃです。



Spheroは、水泳を含むほぼすべての表面を所定の方向に移動でき、さまざまな色で点灯します。



製造業者は、次のシナリオでロボットを使用することをお勧めします。



画像



想像力とSDKを使用して、独自のゲームを作成したり、既製のアプリケーションを使用したりできます。



開発者向けの既製のSpheroおよびSDK管理アプリケーションは、多くの一般的なプラットフォームで利用できます。





発行価格



ロシアでは、4,000から7,000ルーブルまで、このような喜びがあります。 Yandex.Marketで 。 海外では、80〜130ドルで購入できます。 はい、これは最も安いおもちゃではありません。



理論のビット



ロボットにジャイロスコープと電球だけでなく、加速度計も組み込まれています。 Spheroが動くためには、Spheroがその前にあり、その裏側がどこにあり、座標系がどのようになっているかを理解する必要があります。 座標系を次の図に示します。



画像



Y軸は、前後に移動します(正の値-前方、負の-後方)。 X軸-横方向の動き。 Z軸-上下に移動します。

Spheroは調整可能です。 同じロバをシャッフルし、行く先の前で。 ロボットの背面は、ロボットが移動しているときに燃える青色の光で識別できます。



開発



最後に、最も興味深いことに到達しました。 このことをプログラムで管理する前に。 例として、小規模企業向けのシンプルなリアクションゲームを作成します。 それをSphero Party Gameと呼びましょう。



ゲームのルール


アプリケーションのボタンをクリックすると、ゲームが開始されます。 Spheroはその軸の周りを回転し、ランダムに異なる色で燃えます。 プレイヤーはSpheroが緑に変わり、それをつかむのを待つ必要があります。 つかむ人は誰でも勝ちました。



ツール


開発には、次のものを使用します。



仕事を始める


1.最初に行う必要があるのは、 Sphero SDKのダウンロードです。 これは、プロジェクトに接続して使用するアセンブリです。

2. Sphero SDKBluetooth RFCOMMを使用してデバイスを操作します。 プログラムでデバイスを操作できるようにするには、Bluetoothをオンにして、デバイスとの接続を確立する必要があります。



画像



3.次に、 Visual Studio 2013を開き、ファイル/新規/プロジェクト/空のアプリプロジェクトを作成します。



画像



4. RobotKit.dll SDKからアセンブリを接続します



画像



5.アプリケーションにBluetooth RFCOMMサポートを追加します。 Package.appxmanifestをコード編集モードで開き、以下のコードを機能セクションに追加します。



アプリケーションのBluetooth RFCOMMサポート
<wb:DeviceCapability Name="bluetooth.rfcomm"> <wb:Device Id="any"> <wb:Function Type="serviceId:00001101-0000-1000-8000-00805F9B34FB" /> </wb:Device> </wb:DeviceCapability>
      
      







画像



6.アプリケーションのメイン画面で、次を入力します。



MainPage.xamlファイルを開き、そこにすべて追加します。



アプリケーションのメイン画面
 <Grid Background="#0094D0"> <TextBlock x:Name="SpheroName" HorizontalAlignment="Left" Margin="82,97,0,0" TextWrapping="Wrap" Text="No Sphero Connected" VerticalAlignment="Top" FontSize="24"/> <ToggleSwitch x:Name="ConnectionToggle" HorizontalAlignment="Left" Margin="76,122,0,0" VerticalAlignment="Top" Toggled="ConnectionToggle_Toggled" /> <Grid HorizontalAlignment="Center" Height="512" Margin="0,0,0,0" VerticalAlignment="Center" Width="512"> <Button Name="startGameBtn" Click="startGameBtn_Click" Content="Start" Height="113" Width="334" /> </Grid> </Grid>
      
      







画像



7. MainPage.xaml.csに移動して、ゲームのロジックを説明します。 Spheroと通信するには、SDKが提供するオブジェクトモデルを使用します。



ゲームロジック
 public sealed partial class MainPage : Page { private Sphero m_robot = null; private long m_lastCommandSentTimeMs; private bool m_gameIsStarted = false; private const string c_noSpheroConnected = "No Sphero Connected"; private const string c_connectingToSphero = "Connecting to {0}"; private const string c_spheroConnected = "Connected to {0}"; public MainPage() { this.InitializeComponent(); } // .     protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); SetupRobotConnection(); Application app = Application.Current; app.Suspending += OnSuspending; } // .     protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); ShutdownRobotConnection(); Application app = Application.Current; app.Suspending -= OnSuspending; } //     private void OnSuspending(object sender, SuspendingEventArgs args) { ShutdownRobotConnection(); } //      private void SetupRobotConnection() { SpheroName.Text = c_noSpheroConnected; RobotProvider provider = RobotProvider.GetSharedProvider(); provider.DiscoveredRobotEvent += OnRobotDiscovered; provider.NoRobotsEvent += OnNoRobotsEvent; provider.ConnectedRobotEvent += OnRobotConnected; provider.FindRobots(); } //    private void ShutdownRobotConnection() { if (m_robot != null) { m_robot.SensorControl.StopAll(); m_robot.Sleep(); m_robot.Disconnect(); ConnectionToggle.OffContent = "Disconnected"; SpheroName.Text = c_noSpheroConnected; m_robot.SensorControl.AccelerometerUpdatedEvent -= OnAccelerometerUpdated; RobotProvider provider = RobotProvider.GetSharedProvider(); provider.DiscoveredRobotEvent -= OnRobotDiscovered; provider.NoRobotsEvent -= OnNoRobotsEvent; provider.ConnectedRobotEvent -= OnRobotConnected; } } // ! private void OnRobotDiscovered(object sender, Robot robot) { if (m_robot == null) { RobotProvider provider = RobotProvider.GetSharedProvider(); provider.ConnectRobot(robot); ConnectionToggle.OnContent = "Connecting..."; m_robot = (Sphero)robot; SpheroName.Text = string.Format(c_connectingToSphero, robot.BluetoothName); } } //   :( private void OnNoRobotsEvent(object sender, EventArgs e) { MessageDialog dialog = new MessageDialog(c_noSpheroConnected); dialog.DefaultCommandIndex = 0; dialog.CancelCommandIndex = 1; dialog.ShowAsync(); } //    private void OnRobotConnected(object sender, Robot robot) { ConnectionToggle.IsOn = true; ConnectionToggle.OnContent = "Connected"; SpheroName.Text = string.Format(c_spheroConnected, robot.BluetoothName); SetRobotDefault(); m_robot.SensorControl.Hz = 10; m_robot.SensorControl.AccelerometerUpdatedEvent += OnAccelerometerUpdated; } //   private void OnAccelerometerUpdated(object sender, AccelerometerReading reading) { if (m_gameIsStarted) MoveRobot(reading.X, reading.Y); } //  .      private void SetRobotDefault() { m_robot.SetHeading(0); m_robot.SetRGBLED(0, 255, 0); m_robot.Roll(0, 0); } //        public async void ChangeRobotColor() { int colorsCount = 20; Random r = new Random(); List<Color> colors = new List<Color> { Color.FromArgb(100, 0, 255, 0) }; for (int c = 0; c < colorsCount; c++) colors.Add(Color.FromArgb(100, (byte)r.Next(255), 0, (byte)r.Next(255))); List<int> miliseconds = new List<int>(); for (int m = 0; m <= 5; m++) miliseconds.Add(r.Next(1000)); while (true) { int colorNumber = r.Next(colorsCount); Color color = colors[colorNumber]; int milisecond = miliseconds[r.Next(5)]; m_robot.SetRGBLED(color.R, color.G, color.B); await Task.Delay(TimeSpan.FromMilliseconds(milisecond)); } } //   .  10    public void MoveRobot(float x, float y) { m_robot.SetHeading(0); int angleDegrees = 10; long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; if ((milliseconds - m_lastCommandSentTimeMs) > 1) { m_robot.Roll(angleDegrees, 0); m_lastCommandSentTimeMs = milliseconds; } } //      private void startGameBtn_Click(object sender, RoutedEventArgs e) { m_gameIsStarted = !m_gameIsStarted; if (m_gameIsStarted) { startGameBtn.Content = "Stop"; ChangeRobotColor(); } else { startGameBtn.Content = "Start"; SetRobotDefault(); } } //    private void ConnectionToggle_Toggled(object sender, RoutedEventArgs e) { ConnectionToggle.OnContent = "Connecting..."; if (ConnectionToggle.IsOn) { if (m_robot == null) { SetupRobotConnection(); } } else { ShutdownRobotConnection(); } } }
      
      







8.アプリケーションを起動します。 私のアプリケーションは次のとおりです。



画像



Bluetoothを介してアプリケーションをロボットに接続する許可に関する質問は、プログラムの必須部分です。インストールされたアプリケーションを最初に開くと、全員が表示されます。



画像



画像



9. [ スタート ]ボタンをクリックして、実際にゲームを確認します。







ここからソースをダウンロードできます: http : //1drv.ms/MXwR6w



おわりに



今日は以上です。 誰かがそのようなデバイスに興味があるか、持っている場合、楽しいゲーム、アプリケーション、ユースケース、発見を共有してください。 この一連の記事を継続する予定です。しばらくしてから、SpheroとそのAPIの使用に関する別の記事をお送りします。



便利なリンク



Sphero公式ウェブサイト

Sphero開発者センター

Windows 8.1 Sphero SDK

Windows 8.1用のSphero SDKの例

Sphero YouTube開発者チャンネル

Visual Studio 2013をダウンロードする

Visual Studio Onlineの詳細をご覧ください。

Visual Studio Onlineにサインアップする



All Articles