前提・実現したいこと
ドローンに対し、iphoneの加速度センサーから取得した値を使って計算した単位時間当たりの速度を送信して、制御したいと考えています。
センサーからの速度は取得出来ています。
またデータの送信自体は送受信できているのを確認しています。
1。アプリ起動
2。接続
3。加速度センサーからのデータ取得、単位時間当たりの速度へ変換
4。周期的にTCP/IPでデータ送信
ループ3、4
しかし、データの取得と送信を同時に行おうとすると、データがアップデートされず、同じ値を送り続けてしまっています。
whileとOperationQueueの使い方が誤っているのだろうと推測しますが、どのように変えたらいいのかわかりません。
該当のソースコード
Xcode 11.6 Swift 5.2.4
ソースコード
var myMotionManager = CMMotionManager()
@IBAction func StartButton() { while(self.stopButtonPressed == false){ self.myMotionManager.deviceMotionUpdateInterval = 0.1 self.myMotionManager.startDeviceMotionUpdates(to:OperationQueue.main,withHandler:{(motion:CMDeviceMotion?, error:Error?) in self.getMotionData(deviceMotion: motion!)}) var command = "speed((self.speed))\n" print("speed\n") self.client.connection.send(data: (command.data(using: .utf8))!) usleep(100) } } func getMotionData(deviceMotion:CMDeviceMotion) { //加速度取得 self.Accel[0] = deviceMotion.userAcceleration.x self.Accel[1] = deviceMotion.userAcceleration.y self.Accel[2] = deviceMotion.userAcceleration.z self.Accel[3] = deviceMotion.rotationRate.x self.Accel[4] = deviceMotion.rotationRate.y self.Accel[5] = deviceMotion.rotationRate.z //速度計算 self.speed[0]=getVelocity(num: 0) self.speed[1]=getVelocity(num: 1) self.speed[2]=getVelocity(num: 2) self.speed[3]=getVelocity(num: 3) self.speed[4]=getVelocity(num: 4) self.speed[5]=getVelocity(num: 5) }
試したこと
overrideで先に加速度センサーのデータを取るようにし、データは周期的に更新されているのを確認しましたが、結局スタートボタンを押すと、アップデートがされなくなってしまいます。
データの取得と送信を並列処理も試みたのですが、うまくコーディングできていません。
ご教授いただければ幸いです。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー