1

ラップトップを使用して複数のロボットを制御したい。ロボットには知能がなく、センサー値を計算して結果をロボットに送り返すPCにセンサー値を送信します(PCを使用したロボットの集中制御)。

ロボットは、Zigbeemuduleを使用したシリアル通信を介してPCと通信しています。

問題:{sen1、sen2、sen3 ..、robot id}のような(ロボットからの)構造を作成して送信する方法。ここで、sen1、sen2 ..はセンサー値であり、robotidは特定のロボットを認識します。編集後.....センサーの送信に使用していたコードは次のようになりました。

 void TxData(unsigned char tx_data)

{   SBUF = tx_data; //Transmit data that is passed to this function
     while(TI == 0); //wait while data is being transmitted
}

センサー値を1つずつ送信します

 TxData(left_whiteline_sensor);
 TI=0; // resetting transmit interrupt after each character
 TxData(middle_whiteline_sensor);
 TI=0;
 TxData(right_whiteline_sensor);
 TI=0;
 TxData(front_sharp_sensor);
 TI=0;

PC側で、バッファ内のこれらの値を読み取ります

read(fd, buf1, sizeof(buf1));
.....
options.c_cc[VMIN]=4; // wait till not getting 4 values 

これは、ロボットが1つしかない場合は正常に機能していましたが、現在は複数のロボットがあり、各ロボットが上記の機能を使用してデータを送信しているため、PC側のすべてのロボットのセンサー値が混在しています。一つの解決策は、私が上で述べた構造を作り、それをPCに送ることです。これが私が聞きたいことです。「このような構造を作成して送信する方法」以前は質問を正しくフレーミングできなかったことをお詫びします。

ありがとう...

4

5 に答える 5

1

可能であれば RS-485 を見てください。PC の観点からはまだシリアルであり、マルチドロップをサポートしています。私は、ほとんどの処理が PC 側で行われ、他のすべてのボードが 1 つの RS-485 バスにデイジー チェーンで接続されたロボットを開発しました。

于 2010-10-05T16:38:19.980 に答える
0

ボットとPCの間で通信するためのプロトコルを作成する必要があるようです。次のようになります。

バイト値の説明
 10xAA最初の同期バイト
 20x552番目の同期バイト
 3 seqメッセージシーケンス番号、送信される新しいメッセージごとの増分
 4 1メッセージタイプ(1 =ホイールエンコーダレポート)
 55従うデータバイト数
 6IDボットID
 7FLフロント左ホイールエンコーダ
 8FRフロント右ホイールエンコーダ
 9RLリア左ホイールエンコーダ
 10RR右後輪エンコーダ
 11バイトのCSチェックサム1〜10

これで、メッセージが個別のパケット(つまり、UDP)で送信されず、シリアルポートを介して非同期に送信される場合、異なるボットからのメッセージバイトが混ざり合う可能性があります。上記のプロトコルは、少なくとも受信したメッセージの整合性を検証しますが、PCに同時に送信するボットの数が増えると、有効なメッセージを受信する可能性は低くなります。

非同期の問題を解決する方法には、送信される各バイトにボットIDを埋め込むことが含まれます。ボットの数が16を超えない場合、それらのIDは送信バイトの上位ニブルに配置され、下位ニブルには4ビットのデータが配置される可能性があります。次に、1つのデータバイトを送信するために2つの送信バイトが必要になります:ボット#1から0x1F + 0x13=0x3F。これにより、メッセージのサイズが2倍になり、受信側で受信データをボットごとに個別の受信キューに分割するためのコードが必要になります。

于 2010-10-01T13:54:03.217 に答える
0

シリアル プロトコル RS232 は point2point です。

私の解決策は、マスター/スレーブ アーキテクチャを使用することです。

理由: アクセス通信チャネルの問題を回避するため。

アーキテクチャ: PC がマスターであり、スレーブに対してクエリを実行します。保存は、マスター要求の後にのみ情報を送信します。メッセージには、フィールド to、from、および data が必要です。すべてのメッセージは通信チャネルにブロードキャストされます。

私はすでにこのソリューションを実装しており、正常に動作しています。

于 2010-11-20T12:42:57.100 に答える
0

RS-232 はバスラインではないため、アドレス空間がないため、これは目的に反します。RS-232 ラインを、モーターなどのバスを実行するコントローラーに接続する必要があります。基本的に、コントローラーからコンピューター上で実行されているソフトウェアへのデータをカプセル化します。

于 2010-09-11T06:15:48.683 に答える
0

PC からエンドポイント (ロボット) と通信するためにどの API を使用しているかはわかりませんが、データを送信するときに、短いアドレス、長いアドレス (MAC)、またはソケット/長いアドレスまたは短いアドレスのいずれかを使用して開いたファイル ID。また、ロボット ID は短縮アドレスと同じであると推測しています。そうでない場合は、ロボット ID と短縮アドレスの間を行き来するためのコードを作成する必要があります。selectまた、システムコールのようなものを使用してロボットからのデータを待機しているか、各ロボットから読み取ろうとしていると推測しています。

この場合、ロボットごとにステート マシンを作成し、そのロボットからデータを取得するたびに、そのロボットのステート マシンにフィードし、それを処理してそのロボットへの応答を生成します (またはデータを他のロボットに送信することさえできます)。ロボットのステートマシン)。ステート マシンは、ロボットからデータを取得するイベント ループに依存することを除いて、単一のロボット プログラムとほとんど同じです。イベント ループがステート マシンのタイマー アラームを提供できるようにすることもできます。これは、一度に複数のクライアントを処理できる http サーバーを作成する方法に似ています。

私があなたのAPIについて完全に間違っていて、ワイヤーなしでシリアルポートとして機能するだけのZigbee無線を持っている場合、あなたは混乱しています。時間 -- ロボットとの通信に使用する API を変更する必要があります。

于 2010-09-10T18:39:17.607 に答える