1

私は、Java プログラムを介して 2 つの異なるロボット シミュレーション環境をリンクするアプリケーションに取り組んでいます。1 つのシミュレーション環境 (A と呼びましょう) は、ロボットの現在の状態を Java アプリケーションに送信します。Java アプリケーションはいくつかの計算を行い、この現在の状態に関するデータとその他の情報を他のシミュレーション環境 (A と呼びましょう) に送信します。それ B)。次に、シミュレーション B は、シミュレーション A のバージョンと一致するようにロボットの状態を更新します。

問題は、プログラムを実行し続けると、シミュレーション B がシミュレーション A の動作よりも遅れ始めることです。この遅延は継続的に増加するため、1 分ほど後にシミュレーション B は数秒遅れます。

これらの環境と Java プログラムの間でデータを送信するために TCP ソケットを使用しています。ソケット プログラミングに関する背景知識から、ソケットを頻繁に開いたり閉じたりするのは悪い習慣であることがわかりました。Sim A からデータを取得し、いくつかの計算を行い、位置データを Sim B に送信するループを実行しています。次に、スレッドを 100 ミリ秒待機させ、ループを繰り返します。明確にするために、B に送信される位置データは、A から受信したものから変更されていません。

ラグの問題を調査した際に、誰かが私に、データのストリームに対してソケットを開いたり閉じたりするのは実際には良い考えだと提案しました。最新のデータを読み取る代わりに、位置データがバッファに積み上げられ、順次読み取られることになります。これは本当ですか?100 ミリ秒ごとにソケットを開閉するようにコードを書き直すと、遅延が解消される可能性がありますか? それとも、これはソケットが実際に機能する方法ではありませんか?

明確化のために編集: すべての位置データが送信されるよりも、シミュレーションが同期を維持することがより重要です。つまり、同期を維持するためにすべてのデータ ポイントを渡さなくてもかまいません。

ソケットを開いたままにしておくと問題が発生するだけでなく、ラグの問題の原因について考えている人はいますか?

洞察/提案/ヒントを事前にありがとう!

4

1 に答える 1

0

単一の接続を使用することについては正しいです。データは確かにバックアップできますが、複数の接続を使用してもそれは変わりません.

ここでの基本的な問題は、Java プログラムがロボットがデータを送信できる速度で計算できるかどうかです。それができない場合は、遅れます。ネットワークを高速化するためにさまざまなことを行うことができますが、計算が追いつかない場合は無駄です。したがって、タイミングを調査する必要があります。

于 2013-01-29T23:56:46.570 に答える