2021年6月25日金曜日

iOS用のOpenCVが無事機能した

 こちらのサイトのサンプルを動かしてみた。無事動いたようだ。


確かに、グレースケールになっている。最初、画像をリソースの中に入れていず、それに気付かずにやると、

color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

こんな感じのエラーが長々と出た。

ただし、プレビューウィンドウでは、

com.apple.dt.PreviewFoundation.ExceptionError (0):

 ==NSLocalizedFailureReason: too many arguments (4152) -- limit is 4096

こんなエラーが出て、動かなかった。今のところ、なお仕方がわからないが、シミュレーターではちゃんと動くので、真剣に直そうとしていない。OpenCVファイルが多すぎるのかと思うが、わからない。

iOS用 OpenCVの組み込み

MAVIC MINIのカメラで、差し当たって顔認識をさせようと、 最初は、iOSのシステムを使おうとした。が、1日やっても、顔認識はできていても、認識した顔のboundsで、顔の枠を作らせるときにつまづいて進まなかった。頑張ればなんとかなりそうな気もするのだが、どうせだったら、いずれ組み込む予定のOpneCVでやらせることに時間を使ったほうがいいということで、方向転換した。

やってみると、壁が色々あって、それらをクリアしていったら、どれがどれか記憶の収集がつかなくなってきたので、記憶にある範囲のことをメモしておこうと思った。

(1)IOS用のOpenCVについては(A)ここにあるように、サイトから直接ダウンロードできる。それもやってみたが、途中で躓いたときに、安直にやったのが原因のように思えるので、最初からビルドし直した。既存のものでも良いような気はしている。

ビルドは、(B)こちらのサイトを参照させていただいた。時間はかかる。

 組み込みは、(A)を参照させていただきながらできる。一つ、コードサイニングのスクリプトのopencvのあるフォルダを絶対パスで指定したことを付け加えておく。



この、手続きをやらないとサイニングのエラーが出て、キーチェーンをいじらないといけないようなアドバイスが色々出てくるので、それに戸惑ってしまう。が、それは必要ない。

(2)ヘッダーが見つからないとか色々エラーが出るがBuild settingの

Build option →Validate workspaceをYESにする



Search pathのFramework search pathとHeader search pathを自分の環境の絶対パスを指定した



これくらいで、差し当たって、エラーは出なくなった。

これからまだまだ何かありそうな気はするが、差し当たってここまではすすんだ。

2021年6月23日水曜日

DJIWidgetのフレームワークを認識しない問題(2)

認識問題だけは解決したようだ。次のような作業をした。

(1)新規のSwiftUIプロジェクトを作成する。

(2)DJI Mobile SDKを連結する。そのためのPodfileは次のようなものである。

platform :ios, '14.6'

source 'https://github.com/CocoaPods/Specs.git'


target 'FPVController' do

   pod 'DJI-SDK-iOS', '~> 4.14'

   pod 'DJIWidget', '~> 1.6.4'

end

(3)再度プロジェクトを立ち上げる。

(4)DJIMobileSDKのデモファイルから、Camera関係のファイルを三つプロジェクトにコピーする。参照コピーではなく本体コピーである。

(5)このあと、Object-Cのソースとswiftを繋ぐための、Bridging-Headerというのを作成しないといけない。

Cameraの下のfpvフォルダにそこにあるようなヘッダーファイルが必要なのだが、これは、Newファイルで作成したものを空のままそこにおけば良い。

もう一つ、ソースフォルダの下に画像にあるようにBridging-Headerを作成しなければならない。この中身は、DEMOのソースにあるもので、中身は次のようなものである。

//

//  DJIWidget-Bridging-Header.h

//  FPVController

//

//  Created by 鷲田豊明 on 2021/06/23.

//


#ifndef DJIWidget_Bridging_Header_h

#define DJIWidget_Bridging_Header_h


#import "DJIWidget/DJIWidget.h"

#import "DJISDK/DJISDK.h"


#endif /* DJIWidget_Bridging_Header_h */

肝心なところがコメントアウトされていて違和感があるがこうするということのようだ。

さらにそれをプロジェクトに登録しなければならない。これについては、こちらを参照した。


値のところは、パスだけで良いので注意。

これで、DJIWidgetとプロジェクトが繋がれて、問題が解決する。 

2021年6月22日火曜日

DJIWidgetのフレームワークを認識しない問題(1)

 DJI SDK でFPVの動画をスマホに表示させたいと思う。というのも、MIVIC MINIのカメラで、リアルタイムに人や顔の画像認識をさせたいからだ。画像認識の部分はOpenCVを使うつもりだが、何よりも、画像が送られてこなければ話にならない。

DJI Mobile SDKのサンプルを動かすと、FPV画像がちゃんと送信され、受信してスマホに表示させる。この部分を再現しようと、関連ファイルを組み込んでみるが、DJIVideoPreviewerクラスなど、肝心なところが認識しない。単に DJISDKをimportするだけではなく、DJIWidgetの中に入っているものがダメなのだ。

これは、Podfileに

   pod 'DJIWidget', '~> 1.6.4'


の1行を加えれば解決されるはずなのだが、これでpodをインストールし直しても、どうしても解決しない。関連ファイルは組み込まれているのだが。DJIWidget.frameworkが作られていないことが原因のように思えるが、当然作られるべきで、その作り方もわからない。というか、Demoの方は、これがなくてもちゃんと動いているし、DJIVideoPreviewerクラスも組み込めているわけでから。

何が何だか色々やってもわからないので、デベロッパーページのこちらを参照して、GithubのDJIWidgetページをダウンロードして、そこからそのまま DJIWidget.framework を作成した。それの組み込み方については、こちらのページを参考にして、大体そのように組み込んだ。
(基本、ただ、DJIWidget.frameworkをpodのプロジェクトではなく、メインのプロジェクトのframeworksのフォルダに下においただけ。参照追加ではなく、リアルコピーを選択することが大事。設定は特に変更しなくても認識した。)

あとは、
import DJIWidget
とすると、widget関係のクラスをほとんど認識して、エラーは消えた。

ここまでは良かったが、コンパイル段階で、どうもこのDJIWidget.frameworkに起因したらしいエラーが起きた。やり直しだ。



2021年6月3日木曜日

Info.plistからDJISDKAppKeyの値が読み出せない問題

 これは、結局、値を入れるときにコピペしたために、最後に空白が余計に入っていたことが原因だった。Info.plistを右クリックしてOpen as souceなどによって、plistのxmlファイルそのものを見ることによって明らかになった。

悩んだ、悩んだ。次のステップに進める。

DJIのMobile SDKのサンプルデモアプリがやっと動いた話

 何よりも、サンプルアプリが動かなければ仕方がないので、この二、三日、なんとか動かそうと必死だった。サンプルアプリについては、

こちら

にある。

Swiftで書かれた、iPhone用のものである。ほぼその通りにやったつもりだったが、実行段階で、

libsystem_kernel.dylib`__abort_with_payload:

    0x1b2f8d14c <+0>:  mov    x16, #0x209

    0x1b2f8d150 <+4>:  svc    #0x80

->  0x1b2f8d154 <+8>:  b.lo   0x1b2f8d170               ; <+36>

    0x1b2f8d158 <+12>: stp    x29, x30, [sp, #-0x10]!

    0x1b2f8d15c <+16>: mov    x29, sp

    0x1b2f8d160 <+20>: bl     0x1b2f6b1fc               ; cerror_nocancel

    0x1b2f8d164 <+24>: mov    sp, x29

    0x1b2f8d168 <+28>: ldp    x29, x30, [sp], #0x10

    0x1b2f8d16c <+32>: ret    

    0x1b2f8d170 <+36>: ret    

こんなエラーが出てしまう。
色々調べたが、結局、デバッカコンソールの文章に解決策があった。
2021-06-03 19:47:53.451111+0900 DJISDKSwiftDemo[7921:667412] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaining to the user how the app uses this data.
つまり、info.plistにNSBluetoothAlwaysUsageDescriptionのキーを付け加えて、何かしなければならないということなのだ。こんなこと、ネットには何の情報もなかった。そこで、
Privacy - Bluetooth Always Usage Description
のキーを設定し、値に、Connection to controllerと書いた。値はなんでもいいようだが、アップルの審査を通そう何と考えると真面目に書く必要があるのかもしれない。
これでやったら、無事起動した。私のiPhone 7 plusで動いた画像は以下のようである。

コントローラーと繋げないと実際は動かないが、ここまできてホッとしている。



2021年6月1日火曜日

ImportSDKDemo

 先の記事で、SwiftUIとDJI SDKの接合について書いたが、それはそこまでは出来たとして、SDKを実際にどう使うのかというのが、まだ道として見えていないので、差し当たって同じページにあるImportSDKDemoというのをやってみた。アプリとコントローラーあるいはドローンと実際に繋ぐのではなく、ネットワークを通して、アプリの登録確認するだけだが、それでもSDKを使っているのは間違い無いのでやってみた。

(1)デモアプリをダウンロードする。

(2)SDKを接合する。(Podfileのアプリ名は正しく、アプリのディレクトリに一致させる必要がある。 pod installを使う )

(3)その前に、アプリのKeyをDJIディベロッパーサイトで、取っておかなければならない。この時に、プロジェクトのBundleIdentifierとkeyを撮るときのBundleIdentifierを一致させる必要がある。一致していないとエラーで、アプリが起動しない。

(4)xcodeworkspaceの方の、プロジェクトファイルをダブルクリックして立ち上げる。XcodeのプロジェクトのトップをクリックしてBundleIdentifierは登録する。

あとは、シミュレーターでもデバイスでも動くはずだ。Documentにあるように、デバイスが以下のように反応した。ただ、再度立ち上げると、一旦アプリを削除しないといけなかった。そこの理由はまだわからない。


DJI Mobile SDKとXcodeプロジェクトを接合する

 いきなりサンプルプログラムを動かすより、自分のやりたいことをコツコツと作り上げていくほうがいいという考えになったので、まず、SwiftUIのプロジェクトとDJIのMobile SDKを接合するところから始めようということになった。

それだけでも大変だった。まず、参照するSDKのドキュメントサイトは次のところだ。

Integrate SDK into Application

基本この通りやれば良いのだが、色々ある。

(1)プロジェクトを作る。XcodeのiPhone用のプロジェクトの作り方には色々ある。Object-Cのプロジェクト、これはまあ使わない。昔、これで電子書籍のiPhoneアプリを作った時は、散々この不可解な言語で苦労させられた。最新のSwiftUIを使うプロジェクトにする。

プロジェクト名は適当、Team名は、AppleIDと紐づけられていたような気がするが、記憶が消えている。問題がある場合は、Xcodeに設定する。下三つを全部Swiftにする。このTeam名が、iPhoneのキーとも連携していたような気がする。あまりに色々試行錯誤したので、最初の方でやったことの意味を忘れている。

フォルダを適当に選んで、プロジェクトを作成する。

(2)Mobile SDKのインストール。これを事前にやっておく。ダウンロードしたMobile SDKにあるReadmeファイルを読んで、cocoapodをインストールしておく。

(3)自分のプロジェクトのRootフォルダ(xcodeprojファイルのあるフォルダ)に、Podfileをエディタで作成する。

platform :ios, '14.4.2'

target 'Amenbo01' do

  pod 'DJI-SDK-iOS', '~> 4.14'

end

iOSのバージョンとDJIOSDKのバージョンを自分の環境に合わせる。
(4)pod installを実行する。すると、Podsフォルダが作成され、それがDJISDKのプロジェクトフォルダになる。
結局、二つのプロジェクトをリンクさせるということだ。
(5)xcodeprojとさフィックスのついたファイルと、xcworkspaceのついたプロジェクトファイルができるが、前者は単一プロジェクト用なので、ここでは後者をダブルクリックしてXcodeを起動する。

920MHz帯無線通信モジュールTY92SS-E2730を使う

 先にも書いたが、ドローン2号機上のコントローラーはラズパイ4で、それとのやりとりをもともとWIFI経由で予定していたが、機体がアルミパイプであるために通信が不安定で使い物にならなかった。そこで、プロポに変えた。プロポの信号取り出しもなんとか安定できるようになったが、そのシステム...