Closed tongtybj closed 5 years ago
追記:
3つのサーボ(関節x2 + ジンバルx1)は問題ない。
訂正: 3つのサーボ(関節x2 + ジンバルx1)もフリーズする
いまはこちらのテストセットで試しています。 やはり2個で大丈夫だけど,3個以上だとCANが止まる模様です。
neuronが一個でサーボが多数あるとパケットが多すぎてneuronが死にます 対策はまだ考えてないです
これはF4バージョンのコードの特有の問題? 前のF1はなかったけど、F4だとこうなるということ?つまり、F1とF4でサーボ通信の実装が違うという理解であっている?
F1でもなると思います
なるほど・・・
今まで、dragonのF1のneuronに4つのサーボを繋げても大丈夫だったのは、奇跡ということになるのかな。 あと、ちょうど今同じテストセットでF1のneuronに変えてテストしているけど、フリーズはしないね・・・
メモ1: F4のtruestudioプロジェクトに
を差し替えて、焼き込み、同じテストを行っています。 20分近く経つけど、フリーズしない。
次は、 neuron/neuron_f1/Servo
だけ差し替えてテストしてみる。
F4のfirmwareだけで起こるというのは把握してませんでした
F4のfirmwareだけで起こるというのは把握してませんでした
まだ憶測だけど、neuron/neuron_f4/neuronlib以下のなにかが悪さをしているような気がする。 今は、F1のfirmwareを差し替えた状態で、4つサーボをつなげて、半日ぐらい様子を見ようとおもう。時間があるときにウェブカメラを覗いてみてみて。
いろいろやって、今のところたどりついた解決案は、send_data_flag == false
のサーボは、能動的に角度等のデータ読み取りをしないようにする: #329
例: https://github.com/tongtybj/aerial_robot/blob/396496b1e085c06034e48400d66bb941f0a8bec2/aerial_robot_nerve/neuron/neuronlib/Servo/Dynamixel/dynamixel_serial.cpp#L194 https://github.com/tongtybj/aerial_robot/blob/396496b1e085c06034e48400d66bb941f0a8bec2/aerial_robot_nerve/neuron/neuronlib/Servo/Dynamixel/dynamixel_serial.cpp#L316
また、角度オフセットの更新など必要な時だけ、一時的に読み取る: https://github.com/tongtybj/aerial_robot/blob/396496b1e085c06034e48400d66bb941f0a8bec2/aerial_robot_nerve/neuron/neuronlib/Servo/Dynamixel/dynamixel_serial.cpp#L77-L95
ステップ1:
1個のneuron(#329 を焼き込んだ)で4つサーボつないで、うち2つがsend_data_flag = true
。
一日放置しても大丈夫だった。また、ttl_rs485_mixed_
がtrue/false、両方で試した。
これはneuronが1個なので、spinalからサーボへの目標角度指令の送信レートが500Hzで、最大負荷とみなせる。
ステップ2: dragonの4つのneuronのうち、半分が #329、半分が最新のmasterを焼き込んだ。最新のmasterを焼き込んでサーボを4つ繋げたものは数十秒でフリーズしてしまう(最大負荷ではないのに、なぜフリーズするのだろう・・・)。一方、#329 を焼き込んだものは、今のところ大丈夫そう(数時間経過)。
補足: neuronのインジケータをサーボ通信に合わせて(点滅=正常接続)評価してみた結果、わかったことが、いわゆるフリーズという現象時では、CANだけ死んで(spinalの点滅が止まった)、neuronの方のサーボに関するインジケータは正常に点滅している。つまり、どういうことなんだろう・・・CAN1とUASRT2が同じバスを使っていて、CANの方が圧迫されたから?
F1で大丈夫だった理由はなんですか?
理由ははっきりわかっていない・・・ 推測だけど、CAN1とUASRT2(RS485)のデータ転送のタイミングが奇跡的にズレているからだとおもう。 ちなみに、データシートみると、F1とF4のCAN1とUASRT2はともにAPB2のバスを共有している。そういう意味で違いはないけど、バスの速度に関しては、F1だと32MhzでF4は50Mhz.
今ちょうど、移動机でF1にtag1.0.4を焼きこんで、サーボを4つ繋げてテストしています。もう2時間は過ぎているけど、まだ大丈夫そう。
send_data_flag=trueのサーボを4つつなげると死にますか?
昼間のF1のテストは2/4 (4つの内、2つがsend_data_flag=true)でやってて、大丈夫だった。 さっき, 4/4でやってみたら、見事フリーズした。
いままでの結果をまとめると
F4: 2/4(×)は #329 で改善したんですよね?
あと,これらはspinalに対してneuronをいくつつなげていますか? F4:2/4以外は1対1ですか?
テストべットでのneuronの数は1で、1:1
と記し、
ドラゴンはneuronの数が4で、1:4
と記す。
今までの#329 なしでのテストをまとめると、
F1:
F4:
Solved by #329
@chibi314
dragonで、neuron F4に4つのサーボ(関節x2 + ジンバルx2)を接続して、 spinalとCAN通信させたところ、 十数秒ぐらいで、spinal,neuronともに点滅が止まる。 2つのサーボ(関節x2 or ジンバルx2)では、ずっと点滅する。 これは、現masterブランチ, v1.0.4両方で起きる現象です。
つぎはどうデバッグすべきでしょうか。