久しぶりにTurtleBotを動かそうと、接続しているマシンのubuntuをアップデートした。
イヤな予感がした通り、アップデート後にTurtleBotが動かなくなってしまった。
他と問題を切り分けるために、turtlebot_bringupではなく、create_nodeだけで起動してみたら、以下のような結果となった。
$ rosrun create_node turtlebot_node.py [INFO] [WallTime: 1409911201.387855] serial port: /dev/ttyUSB0 [INFO] [WallTime: 1409911201.389007] update_rate: 30.0 [INFO] [WallTime: 1409911201.391291] drive mode: twist [INFO] [WallTime: 1409911201.392122] has gyro: True [INFO] [WallTime: 1409911201.559079] self.gyro_measurement_range 150.000000 [INFO] [WallTime: 1409911201.560099] self.gyro_scale_correction 1.350000 [ERROR] [WallTime: 1409911204.652150] Failed to open port /dev/ttyUSB0. Please make sure the Create cable is plugged into the computer. Failed to open port /dev/ttyUSB0. Please make sure the Create cable is plugged into the computer.
ソースを追いかけながらテストしてみると、どうやら誰かがポート(/dev/ttyUSB0)を先にオープンしていて(Port is already open.)、重複オープンとなってしまったらしい。
追えどもその場所がわからないため、素のPythonで試してみた。
$ python Python 2.7.3 (default, Feb 27 2014, 20:00:17) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> x = serial.Serial("/dev/ttyUSB0", baudrate=57600, timeout=2) >>> x.open() Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 285, in open raise SerialException("Port is already open.") serial.serialutil.SerialException: Port is already open. >>>
何と起動後のopenで既に失敗している。調べてみたら、最近のPySerialではオブジェクトの生成時にopenするため、明示的にopenする必要がなくなったらしい。
(そういう変更やめて欲しい…)
ということで、シリアルポートを明示的にopenしている場所をコメントアウトするだけでよかった。
$ roscd create_driver/src/ $ diff create_driver.py create_driver.py.org 213c213 < #self.ser.open() --- > self.ser.open()
これで半日つぶれてしまった。