#きっかけ
高専ロボコンも近代化してきてそろそろROS使わないと開発に時間がかかりすぎることが考えられるため導入を決定.
主力として使ってるSTM32シリーズでROSを楽に使いたかったのでGoogle先生に聞いた結果「rosserial_stm32」なるものを発見,とりあえず使ってみることにした.
筆者はROS初心者なので拙いところは許してください
#使用機材
- Nucleo L476
- Ubuntu16.04(kinetic)
- CubeMX
- SW4STM32
#使い方
ここにほぼ書いてある通りにやってみる.
$ sudo apt install ros-kinetic-rosserial
$ cd ~/catkin_ws/src
$ git clone https://github.com/yoneken/rosserial_stm32.git
$ cd ./rosserial_stm32/src/ros_lib/examples/chatter
ここでchatter.ioc
をあらかじめ作っておいたL476用のiocファイルにすり替えておく.(CubeMXで適当に作っておく)それに加え手前のsrcのSTM32Hardware.h
で
#include "stm32f3xx_hal.h"
#include "stm32f3xx_hal_uart.h"
#include "stm32f3xx_hal_tim.h"
を
#include "stm32l4xx_hal.h"
#include "stm32l4xx_hal_uart.h"
#include "stm32l4xx_hal_tim.h"
に変更.
$ cd ~/catkin_ws
$ catkin_make
$ cd ./src/rosserial_stm32/src/ros_lib/examples
$ cp -r chatter ~/workspace
$ cd ~/workspace/rosserial_stm32
$ rosrun rosserial_stm32 make_libraries.py .
CubeMXを起動してchatter.ioc
を読み込み,Project Maneger
でツールチェインをSW4STM32に変更しGENERATE CODEを押しHALを生成.
そのままSW4STM32を起動しCubeMXで生成したプロジェクトを読み込む.
プロジェクトを右クリックしてConvertC++を選択.
main.c
の中身がCubeMXに上書きされてしまっているので元のところからコピペしてやり過ごす.
で,Buildする.
失敗しました
エラーは
mainpp.cpp:41: undefined reference to `htim2`
mainpp.cpp:41: undefined reference to `huart2`
STM32Hardwear.h:71: undefined reference to `HAL_TIM_Base_Start`
でした.
誰か助けて…
もしかしてここ見るとPeripheralの設定してなかった説が濃厚?
CubeMXの使い方がよくわからんので元のchatter.ioc
からそれっぽいところをコピペして再度生成した.
ビルド成功しました
その後,Debugしてみると
$rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=57600
[INFO] [1553585723.997853]: ROS Serial Python Node
[INFO] [1553585724.007428]: Connecting to /dev/ttyACM0 at 57600 baud
[INFO] [1553585726.113745]: Requesting topics...
[ERROR] [1553585741.116108]: Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino
のようなエラーが出て通信できない…
通信エラーかソフトウェアのバージョンがあってないと言われている.
gtktermで通信を見てみたところ何も送信されていなかった.
DMAの設定周りが怪しいけど自分ではどうしようもなくなったのでROS Answersに投げました.
Duff checkerで元のchatter.ioc
との差分を確認していると気になる箇所がいくつかあった.
結果から言うと犯人はGPIO_Labelみたいだ.こいつにCubeMXでUSART2のGPIO SettingsのUserLabelからVCP_RXなりVCP_TXなりを設定してやると見事動いた.
あと,この記事結構汚いのでいつか試行錯誤の部分抜いてきれいにf3からの移植について書きます.