ロスシリアル&STM32

ROSロボットオペレーティングシステムは、ロボットシステムを作成するための非常に強力なプラットフォームです。これには、「ノード」と呼ばれる最も単純なソフトウェアコンポーネントから、実際のGazeboロボットプラットフォームのシミュレーション環境までのプロジェクトの開発に必要なすべてが含まれます。 ほとんどの場合、ROSはArduinoプラットフォーム上のこのようなマイクロコントローラーと組み合わせて使用​​されます。 インターネットには、ROSとArduinoの束に関するあらゆる種類のチュートリアルがたくさんあります。



現在、ROSロボットオペレーティングシステムとSTM32マイクロコントローラーの使用に関する情報はありません。 インターネットには疑問がたくさんあります。







始めましょう



STM32を使用するには、STM32CubeMXとSystemworkbenchforSTM32が必要です。 それらをネットワークにインストールすることについては十分な情報がありますが、これについては詳しく説明しません。



コントローラーを構成するには、STM32CubeMXに移動します



新しいプロジェクトを作成します。







マイクロコントローラを選択します。STM32f103c8t6があります。







周辺では、外部水晶振動子が接続されていることを示します。







コントローラーのデバッグを有効にできる結論を構成します(プロジェクトがC ++の場合、デバッグが機能しない場合があります)







13出力ポートCを設定し、内蔵LEDに接続します。







UARTピンをセットアップします。







Lock_configurationに移動し、図のように設定を行います。







周辺のより詳細な構成に移りましょう



UART



データ交換レートの設定。







DMAセットアップ。











割り込みを設定します。UARTによるグローバル割り込みを指定する必要があります







GPIOセットアップ







プロジェクトビルドのセットアップ







あなたが集まるのを待っています







プロジェクトを開き、







STM32のSystem Workbenchのプロジェクトの作成



SW4STM32でこのプロジェクトを開き、周辺機器の制御を追加し、それを組み立て、コントローラーをフラッシュしても、結果は得られませんでした。



したがって、次の指示に従って新しいプロジェクトを作成し、STM32CubeMXによって取得された構成を転送します。



STM32のSystem Workbenchのプロジェクトの作成



1)ファイル>新規> Cプロジェクトをクリックします



2)Cプロジェクト

1)プロジェクトの名前を入力してください

2)プロジェクトの種類を選択します:実行可能> Ac6 STM32 MCUプロジェクト

3)ツールチェーンの選択:Ac6 STM32 MCU GCC

4)「次へ」をクリックします







3)マイクロコントローラーを選択する

1)[新しいカスタムボードの作成]をクリックします

1)新しいボードの定義を保存

2)新しいボードの名前を入力します:STM32F103

3)チップボードの選択:STM32F1

4)MSUの選択:STM32F103RCTx

5)[OK]をクリックします。

2)作成したばかりのボードを選択してください!

1)シリーズを選択:STM32F1

2)ボードを選択:STM32F103

3)「次へ」をクリックします







4)ライブラリHALを接続します







5)[完了]をクリックします



ファイルを追加する



キューブによって作成されたsrcおよびincファイルの内容をファイルにコピーし、STM32F103C8Tx_FLASH.ldもコピーします







STM32自体の状態とwhileループのコードをテストするには、次の行を記述します



HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100);
      
      





ここでは、LEDを点滅させます。



アセンブリ中に、stm32f1xx_hal_msp.cファイルで問題が発生する場合があります



void関数HAL_MspInit(void)に関連するエラーは、次のように修正されました。

HAL_Driverライブラリでフォルダーを開き、/ srcに移動し、ファイルstm32f1xx_hal_msp_template.cを開いて、同じ関数をコメントアウトします。







再組み立て(エラーなしで組み立てる必要があります)



コントローラファームウェア用のst-flashユーティリティについて言及するのを忘れました。



 $ sudo apt-get install cmake $ sudo apt-get install libusb-1.0.0 $ git clone github.com/texane/stlink.git $ cd stlink $ make release $ cd build/Release; sudo make install $ sudo ldconfig
      
      





STリンクを使用する



STリンク検出チェック:



 $ st-info —probe
      
      





応答として、次のようなものが表示されるはずです。



 Found 1 stlink programmers serial: 563f7206513f52504832153f openocd: "\x56\x3f\x72\x06\x51\x3f\x52\x50\x48\x32\x15\x3f" flash: 262144 (pagesize: 2048) sram: 65536 chipid: 0x0414 descr: F1 High-density device
      
      





コントローラーをフラッシュするには、プロジェクトのフォルダーに移動し、次のコマンドを使用してコントローラーをフラッシュします。



 cd workspace/ros_stm32_2/ st-flash write Debug/ros_stm32_2.bin 0x8000000
      
      





確認済み。 すべてが機能します。 先に進みます。



ROSライブラリはC ++で記述されているため、プロジェクトをC ++プロジェクトに変換し、.cppのmain.c、stm32f1xx_hal_msp.c、stm32f1xx_it.cファイルの形式を変更します。



ライブラリを成長させ、STM32でrosserialを動作させるために必要なファイルを含むリポジトリを複製しています。



 git clone https://gitlab.com/ivliev123/ros_lib
      
      





複製されたフォルダーをプロジェクトに挿入します











プロジェクト設定(プロパティ)に行きましょう。まず、ライブラリを接続して、行きます...















レイアウトを変更する











最適化を実施します











さて、main.cppはほとんど空であるため、ここでいくつかの変更を行います。最初に行うことは、ROSライブラリと、ROSトピックまたはこれらのトピックのデータ型とやり取りするためのライブラリを接続することです。



 #include <ros.h> #include <std_msgs/String.h> #include <std_msgs/UInt16.h>
      
      





このトピックを公開して受け入れるノードを作成しましょう



 void led_cb( const std_msgs::UInt16& cmd_msg){ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); ros::Subscriber<std_msgs::UInt16> sub("led", led_cb);
      
      





mainでノードとトピックを初期化します。



  nh.initNode(); nh.advertise(chatter); nh.subscribe(sub);
      
      





また、変数を追加して、時間と公開する内容を処理します。



 const char * hello = "Hello World!!"; int chatter_interval = 1000.0 / 2; int chatter_last = HAL_GetTick();
      
      





whileループでは、次のものがあります。 しばらくしてからフレーズを公開します。



  if (nh.connected()) { if(HAL_GetTick() - chatter_last > chatter_interval) { str_msg.data = hello; chatter.publish(&str_msg); chatter_last = HAL_GetTick(); } } nh.spinOnce();
      
      





プロジェクトをまとめる。



次のエラーが表示される場合があります。















再組み立てしてフラッシュします。



ROSと直接対話するようになりました。

1つの端末でROSを実行します。



 roscore
      
      





次にノードを実行します。



 rosrun rosserial_python serial_node.py /dev/ttyUSB0
      
      





以下を取得します



 [INFO] [1551788593.109252]: ROS Serial Python Node [INFO] [1551788593.124198]: Connecting to /dev/ttyUSB0 at 57600 baud [INFO] [1551788595.233498]: Requesting topics... [INFO] [1551788595.258554]: Note: publish buffer size is 2048 bytes [INFO] [1551788595.259532]: Setup publisher on chatter [std_msgs/String] [INFO] [1551788595.275572]: Note: subscribe buffer size is 2048 bytes [INFO] [1551788595.276682]: Setup subscriber on led [std_msgs/UInt16]
      
      





次に、新しいターミナルウィンドウでトピックを確認します



 rostopic list
      
      





次のトピックがあります。



 /chatter /diagnostics /led /rosout /rosout_agg
      
      





おしゃべりのトピックでは、コントローラーがフレーズを公開します。



チームで聞くことができます



 rostopic echo /chatter
      
      









次に、データをトピックledに送信します。



 rostopic pub /led std_msgs/UInt16 "data: 0"
      
      





そして、LEDの状態を変更する必要があります。



All Articles