Pololu Romi ロボットカーをROSで動かしてみました
Pololu RomiでROSにチャレンジ
Pololu RomiをROSで動かしてみます。以下の記事を参考にしました。
ソースはGitHubに登録されています。
ソースをみた感じではかなり完成系に近いように見えます。これは期待できそうです。
ROS Melodicのインストール
Raspberry Pi 3B+にROS Melodicをインストールします。これまでRaspberry OSで動いているのでこの環境にROS Melodicをインストールしてみました。
しかし、こちらはソースからすべてをビルドしなくてはならず、Raspberry Pi 3B+にはちと荷が重いようです。また今後のメンテナンスも大変になりそうです。
やむなくこちらは一度中断し、別のSDカードにRaspberry Pi用のUbuntu 18.04 Serverをインストールし、パッケージ版のROSをインストールすることにしました。以下の記事を参考にしています。
さらにI2Cのバス速度を設定します。/boot/firmware/config.txtをエディタで開いて、dtparam=i2c... の1文を追記しました。
[all]
device_tree_address=0x03000000
dtparam=i2c_baudrate=400000
これで400000Hzになります。
RomiPiのインストール
作成したcatkin_ws/srcにRomiPiのソースを展開します。私の場合はcatkin buildでまとめてビルドを行い、特に問題はなくビルドが完了しました。
Romi32U4にスレーブプログラムを書き込む
RomiPiのArduinoのディレクトリにRomi32U4用のスレーブプログラムがあります。これをRomi32U4にArduino IDEで書き込みます。
RomiでROSを動かす
RomiPiにはたくさんのROSパッケージがありますが、以下のように動かせば良さそうです。
1.新しいターミナルを起動して以下のように入力する。
roslaunch romipi_astar romipi_astar.launch
2.新しいターミナルを起動して以下のように入力する。
roslaunch romipi_teleop romipi_teleop_key.launch
ここまでは問題ないように見えたのですが、 romipi_teleop を動かした途端に次のエラーが赤い文字で連続して表示され、正常に動きませんでした。
[ERROR] [1642828616.621967]: bad callback: <bound method RomiPi.cmd_vel_callback of <__main__.RomiPi instance at 0xb47e9968>>
Traceback (most recent call last):
File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
cb(msg)
File "/home/ubuntu/catkin_ws/src/romipi_astar/nodes/romipi_astar_node.py", line 49, in cmd_vel_callback
self.romi.twist(linear_x, angular_z)
File "/home/ubuntu/catkin_ws/src/romipi_astar/src/romipi_astar/romipi_driver.py", line 78, in twist
self.write_pack(53, 'ff', linear_x_m_s, angular_z_rad_s)
File "/home/ubuntu/catkin_ws/src/romipi_astar/src/romipi_astar/romipi_driver.py", line 58, in write_pack
self.bus.write_i2c_block_data(20, address, data_array)
TypeError: Third argument must be a list of at least one, but not more than 32 integers
エラーメッセージからみると、romipi_driver.pyの58行目にあるself.bus.write_i2c_block_data(20, address, data_array)の三番目の引数の型が一致していないようです。そこで、data_arrayの型をみたところ、stringのリストのようでした。本来はintegerのリストでないといけないので、これでは動きません。
そのため、以下のように修正しました。
data_array = list(struct.pack(format, *data))
data_array_int = [ord(s) for s in data_array]
self.bus.write_i2c_block_data(20, address, data_array_int)
これでintegerのリストになり、修正後はエラーがでることはなくなりました。
romipi_teleopのターミナルでキーボードを操作すると、車輪が回り始めました。前進・後進・左右回転ができることを確認しました。
こちらの動画をYouTubeに入れておきました。
ROSトピックを確認する
ここでどのようなROSトピックが出ているのかを確認してみます。
ubuntu@ubuntu:~$ rostopic list
/battery_state
/clicked_point
/cmd_vel
/initialpose
/joint_states
/move_base_simple/goal
/odom
/rosout
/rosout_agg
/tf
/tf_static
ubuntu@ubuntu:~$
各種トピックが流れているのがわかります。内容も見てみます。
/battery_state - バッテリ電圧の情報が刻々と送られています。この時点ではバッテリーは8.2Vのようです。
---
header:
seq: 23
stamp:
secs: 1642909891
nsecs: 552347898
frame_id: ''
voltage: 8.27299976349
current: 0.0
charge: 0.0
capacity: 0.0
design_capacity: 1.89999997616
percentage: 0.757666647434
power_supply_status: 0
power_supply_health: 0
power_supply_technology: 0
present: True
cell_voltage: []
location: ''
serial_number: ''
---
/odom - オドメトリ情報です。
---
header:
seq: 4392
stamp:
secs: 1642915136
nsecs: 684336900
frame_id: "odom"
child_frame_id: "base_footprint"
pose:
pose:
position:
x: -3.00028014183
y: -2.05812335014
z: 0.0
orientation:
x: 0.0
y: 0.0
z: -0.706350826574
w: 0.707861928485
covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
twist:
twist:
linear:
x: -0.0534507110715
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -0.109083071351
covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---
/tf - transforms情報です。
---
transforms:
-
header:
seq: 0
stamp:
secs: 1642917933
nsecs: 387064933
frame_id: "odom"
child_frame_id: "base_footprint"
transform:
translation:
x: 0.0
y: 0.0
z: 0.0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
---
これらの情報をRvizで可視化してみます。
Rvizで可視化する
RvizはROS MelodicがインストールされているノートPC(192.168.100.34)で動かすことにします。Raspberry Pi(192.168.100.110)で動いているROSのmasterに接続することで、ノートPCにも同じトピックが流れてきます。
具体的には以下の手順で環境変数の設定を行い、ノードが見えることを確認し、Rvizを起動します。
export ROS_MASTER_URI=http://192.168.100.110:11311
export ROS_IP=192.168.100.34
rosnode list
rosrun rviz rviz
この状態でRvizを立ち上げてトピックを可視化することができました。
ただし、しばらくすると次のようなエラーでRvizが落ちてしまいました。トピックの情報に例外情報が含まれてしまうことがあるようです。
ocha@ocha-ThinkPad-X270:~$ rosrun rviz rviz
[ INFO] [1642911637.938122479]: rviz version 1.13.23
[ INFO] [1642911637.938159628]: compiled against Qt version 5.9.5
[ INFO] [1642911637.938171625]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1642911637.985052066]: Forcing OpenGl version 0.
[ INFO] [1642911638.262330237]: Stereo is NOT SUPPORTED
[ INFO] [1642911638.262413103]: OpenGL device: Mesa DRI Intel(R) HD Graphics 620 (KBL GT2)
[ INFO] [1642911638.262468532]: OpenGl version: 3.0 (GLSL 1.3).
rviz: /build/ogre-1.9-B6QkmW/ogre-1.9-1.9.0+dfsg1/OgreMain/include/OgreAxisAlignedBox.h:252:
void Ogre::AxisAlignedBox::setExtents(const Ogre::Vector3&, const Ogre::Vector3&):
アサーション `(min.x <= max.x && min.y <= max.y && min.z <= max.z) &&
"The minimum corner of the box must be less than or equal to maximum corner"' に失敗しました。
中止 (コアダンプ)
ocha@ocha-ThinkPad-X270:~$
これについてはもう少し調査が必要そうです。