STM32 + makefile環境でROSSerialに対応させてみる
STM32マイコンのペリフェラル関連記事を一覧にまとめました。
こんにちは。そらです。先日、STM32をmakefileの環境でc++に対応させるという記事を公開しました。今回は、c++に対応させることになったきっかけであるROSSerialに対応するということをやっていきたいと思います。
GithubのyonekenさんのリポジトリのREADMEを読みながら進めていきたいと思います。makefileに対応させるにあたって、少し変更点がありました。GitHubのリポジトリはこちら。
ROSの環境を整えたPCでやること
Githubのリポジトリからクローンをして、READMEの通り進めていこうとすると、ROSSerialに必要なヘッダファイルやC++のファイルを取得するためのPythonのスクリプトを動かすためには、ROSの環境が必要になります。
ROSの環境は、Windowsにはインストールするのが大変だと思われるので使用するROSのバージョンに合わせたUbuntuのバージョンをインストールしたPCを使用するか、VMWare等の仮想環境を作ることのできるソフトウェア等を使用して入れましょう。ROSの環境構築はROSの公式サイトを見ながらやるのが簡単なので公式サイトを見ながらやることをお勧めします。
Pythonのスクリプトを使用する
READMEのGenerate codeの通りにやっていきたいと思います。
- rosserial_stm32をGithubからROSのワークスペース内にクローンする。
- catkin_makeでコンパイルする
- ~/home/user/target_ws/Inc(Src)のようにディレクトリを作成
- roscoreを起動する
- rosrun rosserial_stm32 make_libraries.py .とスクリプトを実行する
- roslibというディレクトリがInc直下に作られる(各種ヘッダファイルも入っている)
roslibをSTM32CubeMXの出力したディレクトリにコピーする
roslibをmakefileのプロジェクトディレクトリのIncディレクトリの中にコピーしましょう。STM32CubeMXの最小設定はusartのDMAを送信、受信ともに設定する、usartの割り込みを有効にしておく、serial_nodeの初期の通信速度が57600なので57600にセットしておくといったところが必要になります。詳しくは、rosserial_stm32のリポジトリにあるCubeMXのファイルを参考にするといいと思います。
makefileのプロジェクトでやること
makefileを改造する
roslib内にあるファイル内にc++のファイルがあるため、c++のファイルはSrc直下にc++のファイルがあるディレクトリごと移動させておくことをお勧めします。makefileの改造をするときに楽になると思います。
さて、makefileの改造をしていきたいと思います。まずは、c++に対応させましょう。c++への対応のさせかたは下に紹介してある記事を参考にしていただければと思います。
ROSSerialに必要なヘッダファイルやソースファイルをコンパイルできるようにする必要があります。ソースファイルの設定は以下のようにしました。ros_srcに先程説明したcppファイルを置いています。
CPP_SOURCES =
$(wildcard Src/*.cpp)
$(wildcard Src/ros_src/*.cpp)
c++のインクルードディレクトリにroslibを追加
CXX_INCLUDES =
-IInc/ros_lib
これで、コンパイルするときにヘッダファイルとソースファイルを読み取ってくれるようになりました。
動作確認をする
rosserial_stm32のchatterをやってみたいと思います。Srcにmainpp.cpp、Incにmainpp.hをそれぞれコピーしてコンパイルを行い、無事コンパイルが通ったらマイコンに書き込んでROSと通信をしてみてください。やり方は、ROSの公式サイトのArudinoと同じ方法でできます。
補足事項
ROSSerialで通信を失敗したときに再度通信を行う場合には、rosserialを再接続したいを参考にソースコードを変更するといいと思います。ここまでできれば、あとはROS公式サイトのarudinoの紹介と同じようにHALAPIを使用したり、レジスタをたたけばOKです。
さいごに
STM32でROSSerialの対応の仕方を書きました。makefile環境でc++に対応させることができれば想像よりも簡単に対応させることができました。ROSSerialを使用してROSから指令値を送る等のことをやっていければPCで上位レイヤーの処理をしてマイコンで制御を回しておくみたいなことが簡単にできるようになりそうですね。いろいろと挑戦をしていきたいところです。