ROSはロボット小車に配備され、下部モータの制御を実現する過程で発生した問題

5214 ワード

タスク:実験室の元のcanバス制御に基づく移動ロボットプラットフォームにROSステップを適用する:1.ROS推奨システムはubuntuで、まずロボットのオペレーティングシステムを再インストールする必要があります.           2.ROSをダウンロードしてインストールします.           3.元のcanカードはlinuxシステムをサポートしていません.ロボットのusbcan設備を交換する必要があります.           4.購入した製品に付属するテストコード(c言語)を使用して、ハードウェア接続およびドライバと共有ライブラリのインストールが正常であるかどうかをテストします(すなわち、usbcanデバイスが正常に使用できるかどうか).           5.c++方式でテストコードを再コンパイルし、発生した問題を解決します.           6.元ロボットプラットフォームで採用されていたc#プログラミング言語ですが、ROSはc#をサポートしておらず、下位の制御コードをc++またはpythonに移植する必要があります.           7.ROSを適用する目的は,下位層の動き制御を人為的な操作を必要とせずに独立して動作するノードとし,操作インタフェースを必要としないため,コンソールプログラムに書き換えることである.
 
システムのインストールおよびハードウェアの交換手順(略)
 
新しく交換したcanカードのドライバとインタフェースライブラリをインストールします
Linuxのusbcanドライバはlibusbベースで実装されます.まず、次のコマンドで依存ライブラリをインストールします.
sudo apt-get install libusb-1.0-0

次に、canカードメーカーが提供する駆動共有ライブラリlibusbcan.so, libusbcan.so.1/libディレクトリにコピーし、テストコードtestディレクトリの下で端末を開いてmakeコマンドを実行するとコンパイルできます.コンパイル完了後に実行./test、パラメータ呼び出しの例を参照してテストします.
問題と注意事項:
1、ドライバとダイナミックリンクライブラリがインストールされていない場合、canカードのLEDが赤に表示されます.
必要に応じてlibusbcan.so,libusbcan.so.1/libディレクトリにコピーします(ドライバとダイナミックインタフェースライブラリを同時に解決します).成功するとcanカードのLEDが緑に変わります.
 
2、テストプログラムの実行中にエラーが発生しました:ret=-3.
ret=-3とは、プログラムの実行中に権限の問題が発生したことを意味し、root権限を使用してプログラムを実行する必要がある.
sudo ./test

プログラムを実行すると、前述の呼び出し例に従ってパラメータを追加できます.eg:sudo./test 4 0 1 0x1400 2 3 10 1000
 
3、自分で書いたc++コードでcanカードインタフェースライブラリ関数を呼び出すと、常に未定義の参照が提示されます.
1)、メーカーが提供するインタフェースライブラリ関数はc言語で書かれているので、c++ファイルでインタフェースライブラリ関数(すなわちc++でcダイナミックリンクライブラリを呼び出す)を呼び出すには、ヘッダファイルの関数宣言文の先頭にextern「C」を追加する必要があります.
C++が登場する以前は、多くのコードがC言語で書かれていたし、下位のライブラリもC言語で書かれていたので、元のCコードとすでに書かれたC言語ライブラリをよりよくサポートするために、C++にはextern「C」というマクロが提供されていました.extern「C」の主な役割は,C++コード呼び出しC言語コードを正しく実現することである.extern「C」を加えると、コンパイラにC++ではなくC言語でコンパイルおよび接続するように指示されます.(C++は関数リロードをサポートするため、コンパイラが関数をコンパイルする過程で関数の戻りタイプもコンパイルされたコードに加えられる.関数名だけではない.C言語は関数リロードをサポートしないため、C言語コードの関数をコンパイルする際に関数の戻りタイプを持たず、一般的に関数名のみを含む.したがって、同じヘッダファイルはcとc++でコンパイルされる翻訳後の関数名が異なるため、相互呼び出しができない)
2)、extern"C"構文はCコンパイル環境では許されないため、ヘッダファイルに宣言されたライブラリ関数をcファイルとc++ファイルで同時にコンパイルできるようにするには(メーカーが提供するテストプログラムはcファイルで、私たちが書くのはc++ファイル)、extern"C"を
#ifdef __cplusplus    
#endif
条件コンパイル中.次のようになります.
#ifdef __cplusplus
extern "C" {
#endif
//      
#ifdef __cplusplus
}
#endif

このコードの意味は、C++ファイルであればextern"C"を使用することであり、このヘッダファイルがCファイルコンパイルに使用される場合、C++構造、すなわちCとC++共通のヘッダファイルが構築されることを保証するために使用される.
 
4、自分で作成したros機能パッケージにc++を使用してusbcan接続プログラムを作成する場合は、ヘッダファイルを追加するだけでなく、ダイナミックリンクライブラリとヘッダファイルを同じフォルダ(include)に配置し、次の手順でCMakeListsファイルを変更するようインストールします.定義されていない参照もエラーで報告されます.
まず、ダイナミックリンクライブラリの絶対パスを追加します.
    include_directories(
      include ${catkin_INCLUDE_DIRS}
    # include
      ${catkin_INCLUDE_DIRS}    /home/ldz/TEST/src/test1/include/test1 #####            
    )

リンクライブラリの名前を追加するには、次の手順に従います.
    target_link_libraries(testcan
      ${catkin_LIBRARIES}   usbcan  #####      
    )

を選択します.
 
5、cプログラムをc++プログラムに移植する時、mallocの不正なフォーマット変換の問題が発生する:
Cの場合、int p=malloc(len sizeof(int))C++の場合、int p=(int)malloc(len*sizeof(int))を推奨します.強制タイプ変換を使用するには、C++の場合、より厳格なタイプチェックがあるため、cはvoid*ポインタと通常ポインタの相互付与を許可しますが、c++はvoid*ポインタに通常ポインタを付与することを許可しません.強制変換を経なければなりません.
 
6、canカードの設備は繰り返し開くことができなくて、さもなくば間違いを報告します:
device opened: Type=4, Card=0
   

 
7、usbcan共有ライブラリ関数VCIを呼び出すTransmitは、単一のデータを送信する際に発生する可能性のあるエラーをテストします.
1)、ハードウェア接続時に高低電位が反転し、エラー:request=1、transferred=0;
2)、送信データの入力パラメータフォーマットが整数の場合、c++のうち08は8進数を表し、表示範囲を超えているため、コンパイルエラー:invalid digit"8"in octal constant
3)、パラメータの数値の大きさは必ず進数によって変換しなければならなくて、例えば10進数の144、16進数の下で90であるべきで、もし数字が間違っているならば:request=1、transferred=0
 
8、「sudo+ノード名」を使用してROSノードを起動することはできません.sudo suを利用してrootユーザー権限に入り、ノードディレクトリの下で起動するかrosrunを使用して起動するしかありません.そうしないと、エラーが発生します.
[FATAL] [1531025487.718466473]: ROS_MASTER_URI is not defined in the environment. Either t
ype the following or (preferrably) add this to your ~/.bashrc file in order set up your lo
cal machine as a ROS master:

export ROS_MASTER_URI=http://localhost:11311

then, type 'roscore' in another shell to actually launch the master program.
   

また、rootユーザーの~/を修正することも忘れないように注意してください.bashrcファイルは、ROS環境変数を~/に追加する.bashrcファイル、すなわちsource/opt/ros/kinetic/setup.bash、そうしないと同じようにエラーが発生します
このほかrosrunで起動するには、機能パッケージの環境変数構成スクリプトを~/に追加する必要がある.bashrcファイル、すなわち、source/home/ldz/New 1/devel/setup.bash(一般ユーザー下:source~/New 1/devel/setup.bash、「~」は現在のユーザーディレクトリを表し、rootユーザー下で「~」を絶対パスに変更しないと機能パッケージが見つからない)、そうでないとエラーが表示されます:package「new 1」not found
 
9、root権限が必要なノードをコンパイルして起動する方法rootを免除する方法
1)、rootユーザーの下、gccまたはcatkin_に入るmakeはソースファイルを再コンパイルして実行可能ファイルを得る(一般ユーザーがコンパイルした場合、元の実行可能ファイルを削除し、再コンパイルして実行可能ファイルを生成しなければならない.そうしないと、第2ステップの操作で実行権限を変更できない)
2)、rootユーザーの下でコマンド「chmod u+s実行可能ファイル」を入力し続けるとroot実行プログラムが正常に免除されるか、一般ユーザーの下に戻ってコマンド「sudo chmod u+s実行可能ファイル」を入力する
 
【番外】現在のユーザーがsudo権限を秘密裏に使用しないようにするテクニック:
sudo cp/etc/sudoers .#バックアップ/etc/sours sudo visudo#開く/etc/sours ldz ALL=NOPASWD:ALL#ファイルの最後に現在のユーザー権限を追加