teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

回答追記

2020/12/01 12:08

投稿

yuki23
yuki23

スコア1459

answer CHANGED
@@ -17,4 +17,21 @@
17
17
  roll = math.atan(ay/az) * 57.324
18
18
 
19
19
  roll = math.atan2(ay, az) * 57.324
20
- ```
20
+ ```
21
+
22
+ ---
23
+ 追記2
24
+
25
+ やっと証拠が揃いましたね。
26
+ 実際に Roll に値を当てはめてみると、
27
+ 16 < Roll で `20-round(75*math.cos(math.radians(90-Roll)))` < 0
28
+ となります。
29
+ `img_src[20:60, 20-round(75*math.cos(math.radians(90-Roll))):140-round(75*math.cos(math.radians(90-Roll)))]` の部分に具体的に値の例を当てはめると、`img_src[20:60, -1:119]` のようなことになります。
30
+
31
+ ここで、python の配列の範囲指定の文法では、負の数`-x`を指定すると「後ろからx番目」という意味になります。
32
+ `img_src`の第2次元のサイズは180なので、`-1:119`ならば`179:119`と同じです。
33
+ ところが左のインデックスが右のインデックスより大きいとき、python ではエラーにならずに大きさ0の範囲となります。よって`img_src`は空の配列となります。これが問題の直接の原因です。
34
+
35
+ より根本的な原因としては、上のコードで、Rollの値によっては範囲指定が画像サイズをはみ出してしまうことを設計で考慮していないことが原因です。
36
+ はみ出した時にどうすればいいのかは、`Value.Get_MotorParameter` のあたりを含めたアルゴリズムの設計の問題なので、私からはなんとも言えません。
37
+ 既にやったように、try-exceptなどで単にスキップするというのも一つの手ではあるかもしれません。

1

atanについて

2020/12/01 12:08

投稿

yuki23
yuki23

スコア1459

answer CHANGED
@@ -6,4 +6,15 @@
6
6
  return
7
7
  ```
8
8
  おそらく `cv2.warpAffine` で失敗しているんじゃないかと思いますが、特定はできないので、ログを全部取り、失敗するときとそうでないときの条件を調べるべきです。
9
- 当てずっぽうですが、ジャイロセンサーの値が不正なのではと思います。
9
+ 当てずっぽうですが、ジャイロセンサーの値が不正なのではと思います。
10
+
11
+ ---
12
+ 追記
13
+
14
+ 数値計算プログラミングでは極めて初歩的なことですが、atan 関数は分母が0になると計算できないので、基本的にプログラミングでは使いません。atan2 関数を使います。
15
+ 次のようにしてみてください。
16
+ ```
17
+ roll = math.atan(ay/az) * 57.324
18
+
19
+ roll = math.atan2(ay, az) * 57.324
20
+ ```