悪いタイトルで申し訳ありませんが、それを簡単に説明する方法が本当にわかりません...
私のシナリオでは、ロボット アプリケーションの場合、1 ミリ秒ごとにモーターを制御するリアルタイム ループが必要です。同時に、パス プランニング、画像処理、オブジェクト認識など、リアルタイムの要件を持たないことを実行したい場合もあります。さらに、非リアルタイム タスクの結果の一部は、リアルタイム モーター制御に送信されます。ロボットを制御するためのループ。
リアルタイム部分については、Ubuntu と RT-Preempt Patch を使用しています。したがって、こちらのサンプル コードのように while ループでリアルタイム制御ループを実行できます。
ただし、非リアルタイム部分についてはわかりません。私の謙虚な意見では、同じプロセスで新しいスレッドを作成し、そのスレッドで非リアルタイム タスクを実行します。
私はリアルタイム プログラミングに非常に慣れていないので、自分の設計で何が問題になるのかわかりません。また、そのようなプログラムを設計するためのパラダイムがあるのだろうか?
- -編集 - -
私のアプリケーションに関するいくつかの詳細。
ロボットは、具体的にはロボットアームです。
リアルタイム部分については、順運動学、逆運動学、およびヤコビアンを計算します。次に、単純な PID コントローラーを使用して適切な出力コマンドを計算します。最後に、EtherCAT を使用して各モーターにモーター コマンドを送信します。
たとえば、非リアルタイム部分については、kinect から PointCloud ストリームを取得し、いくつかの前処理を行い、シーン内のオブジェクトのポーズを計算し、ロボット アームの適切な把握ポーズを決定し、最後にそれぞれのゴールを送信します。ロボットアームが実際にゴールに移動して物体をつかむように、モーターをリアルタイム部分に接続します。全体のプロセスには 10 秒ほどかかる場合があります。ただし、同時にリアルタイム ループを実行し続け、適切な力コマンドまたは位置コマンドを送信して、ロボット アームが元のポーズを保持して静止するようにする必要があります。
この 2 つの部分の間の通信に関しては、多くの場合、非リアルタイム部分から新しいアルゴリズムによってコマンドが生成され、それがリアルタイム部分に送られ、ロボット アームが動かされます。ただし、非リアルタイム部分のアルゴリズムは、エンド エフェクタの現在のポーズなどを知る必要がある場合があります。したがって、非リアルタイム パーツは、リアルタイム パーツに存在するフォワード キネマティクスから情報を取得する必要があります。