TurtleBot(CREATE)が動かなくなった

久しぶりに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()

これで半日つぶれてしまった。