iOSアプリと連携させて使えるデバイスたち

第2回 3次元コントローラにもなるボール型ラジコン「Sphero」対応 iOSアプリの実装方法

この記事を読むのに必要な時間:およそ 1 分

その他のレシピ

前進させる

Spheroを動かすための実装は,とてもシンプルで,RKRollCommand クラスのsendCommandWithHeading:velocity: メソッドを呼ぶだけです。

まっすぐ前に進む場合は,次のようにします。

[RKRollCommand sendCommandWithHeading:0.0 velocity:0.5];

第1引数には進む方向を「度」で指定します。まっすぐ前を0.0とします。

たとえば,右に進む場合は,

[RKRollCommand sendCommandWithHeading:90.0 velocity:0.5];

左に進む場合は,

[RKRollCommand sendCommandWithHeading:270.0 velocity:0.5];

となります。

キャリブレーション

Spheroは球体なので,どの方向を「前」とするか,という調整をしてやる必要があります。そのために,しっぽにあたる青いLEDが自分(ユーザ)側に向くようSpheroを回転させる,キャリブレーション機能がそのGUIとともにSDKで提供されています。

下記のようにプロパティを定義し,キャリブレーションGUIを表示させたい位置にUIButtonオブジェクトを置き,calibBtnプロパティとアウトレット接続します。

@property (nonatomic, weak) IBOutlet UIButton *calibBtn;
@property (nonatomic, strong) RUICalibrateButtonGestureHandler *calibrateHandler;

RUICalibrateButtonGestureHandlerを次のように初期化します。

self.calibrateHandler = [[RUICalibrateButtonGestureHandler alloc] initWithView:self.view
                                                                        button:self.calibBtn];
self.calibrateHandler.calibrationRadius = 200;
self.calibrateHandler.calibrationCircleLocation = RUICalibrationCircleLocationLeft;

これで,calibBtnをタップすると,次のようにキャリブレーションGUIが表示されるようになります。

calibBtn

calibBtn

RUICalibrateButtonGestureHandlerのcalibrationCircleLocationプロパティは,キャリブレーションGUIをボタンに対してどの位置に表示するかを示すものですが,上下左右はPortrait の状態を基準として考えるようです。たとえば,上記サンプルはLandscape Leftでつくっているため,ボタン情報にGUIを出したい場合にはRUICalibrationCircleLocationLeftを指定することになります。

ペアリングがされてない場合のアラート画面を出す

親切にも「Spheroがペアリングされてないのでこのようにペアリングしてください」ということをユーザに伝えるリソース(nib)と,クラスがSpheroのSDKにはあらかじめ用意されています。

下記のように,RobotUIKit.bundleから必要なnibファイルを読み込みRUINoSpheroConnectedViewControllerを表示するメソッドを実装しておき,

- (void)showNoSpheroConnectedViewController {

    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"RobotUIKit"
                                                           ofType:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    
    RUINoSpheroConnectedViewController *noSpheroCtr;
    NSString *nibName = @"RUINoSpheroConnectedViewController_Portrait";
    noSpheroCtr = [[RUINoSpheroConnectedViewController alloc] initWithNibName:nibName
                                                                       bundle:bundle];
    [self presentModalLayerViewController:noSpheroCtr animated:YES];
}

次のように,isRobotUnderControlがNOの場合に上記メソッドを呼ぶようにすると,

- (IBAction)connect {
    
    if ([[RKRobotProvider sharedRobotProvider] isRobotUnderControl]) {
        [[RKRobotProvider sharedRobotProvider] openRobotConnection];
    }
    // ペアリングされていない
    else {
        // NO SPHERO CONNECTED画面を表示
        [self showNoSpheroConnectedViewController];
    }
}

Spheroがペアリングされてない場合に,下記のような画面が表示されるようになります。

Apheroがペアリングされていないときの画面

Apheroがペアリングされていないときの画面

リソース(nib)はPortrait(横向き)用以外にも,Landscape(立て向き)用や,iPad用も用意されているので,実装するアプリケーションに応じて使い分けてください。

その他サンプル

Spheroはジャイロセンサと加速度センサを持っており,それらの値をiOSアプリ側で取得することによりSpheroを3Dコントローラのように使用することも可能です。

そのためにはRKDeviceMessagerクラスのaddDataStreamingObserver:メソッドでデータのストリーミングの監視を開始し,RKSetDataStreamingCommandクラスのsendCommandWithSampleRateDivisor:packetFrames:sensorMask:packetCount:メソッドで,Spheroにセンサデータのストリーミングを依頼します。

これらの処理の実装には,次の2つのサンプルが参考になります。

前者は加速度センサとジャイロのデータをリアルタイム表示するサンプル,後者はそれらの値によって3Dのティーポットモデルを操作するサンプルになります。

ドキュメントをXcodeから参照する

GitHubからSpheroのディストリビューションをダウンロードすると,apiフォルダに下記2種類の.docsetファイルが入っています。

  • com.orbotix.RobotKit.docset
  • com.orbotix.RobotUIKit.docset

これらを

~/Library/Developer/Shared/Documentation/DocSets/

フォルダにコピーしておくと,Xcode の"Documentation and API Reference"メニューから参照できるようになります。

まとめ

iOSアプリと連携できるボール型デバイス「Sphero」を紹介しました。転がしてラジコンのように遊べるだけなく,ジャイロと加速度センサを持つ球体の3Dコントローラとしても使えるので,非常に可能性の高いデバイスかと思います。日本国内でも簡単に購入でき,技適マークももちろん取得されていて安心して使えるので,ぜひともお試しください。

著者プロフィール

堤修一(つつみしゅういち)

1978年生まれ。京都大学工学部を卒業後,同大学院修了。その後,NTTデータにて音声認識技術の研究開発,キヤノンにて画像処理機能の設計に携わる。

2010年より面白法人カヤックに入社。3年間ほぼiOSアプリ開発に専念し,フルスクラッチで開発しリリースしたアプリは30本以上。代表作は150万ユーザを突破した「バウンドモンスターズ」,AppStore Best of 2012を獲得した「タップ忍者」,カンヌ国際広告祭でブロンズを獲得した「Domino's App」など。

現在は,米国シリコンバレーのマウンテンビューにあるAppSocially社の一員として活躍中。

著書=『iOSアプリ開発 達人のレシピ100―開発現場で実証された実用コード集』

ブログ=Over&Outその後

Github=shu223

Twitter=shu223