rospyを使うときに、
普通のやり方ではソースコードを分割できない。
ROSの機能を十分に使うためには役に立つTipsだと思うので、まとめておく。
参考記事
大体以下の通りであるが、
ざっくりしすぎているので、もう少し丁寧にまとめる
手順
フォルダ構成の確認
catkin_makeをした後の構成の確認。
例えば、
+ beuato_monitor_test
- setup.py /// 新しく作る
- CMakeLists.txt
- package.xml
+ scripts
- beuato_server.py
+ common_driver
- beuato_errorcode.py
と言った構成とし、
beuato_server.pyからデバイスのエラーコードを吐き出すための
共通の処理がcommon_driverのbeuato_errorcode.pyに書かれているものとする。
beuato_errorcode.pyは単なるEnum型で次のように記述した。
from enum import Enum
class BeuatoErrorCode(Enum):
OK = 0
DEVICE_NOT_FOUND = -100
DEVICE_ACCESIBILITY_ERROR = -101
beuato_server.pyについては、beuato_errorcode.pyの実装をまだしていないものとする。
setup.py
新しく作る。
ここは正直パターン化されているコードのようだ。
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
d = generate_distutils_setup(
packages=['common_driver'],
package_dir={'': 'scripts'},
requires=['std_msgs', 'rospy']
)
setup(**d)
packagesのcommon_driverがscripts以下に記述される共通モジュールのパッケージ名、
package_dirのscriptsが格納されているソースファイルの名前、
requiresに必要なパッケージを連ねる形式となる。
CMakeLists.txt
/**
省略
**/
catkin_python_setup()
/**
省略
**/
基本的には次のようにcatkin_python_setupを入れるだけ。
ただし、入れる位置には注意が必要。
私が確認した限りでは、
- catkin_install_pythonの前に入れる
- generate_messagesの前に入れる
- catkin_packageの前に入れる
と言った内容は守らないといけないようだ。
インポート側のコード
大体こんな感じで書きます
### (省略) ###
from common_driver.beuato_errorcode import BeuatoErrorCode
### (省略) ###
ビルド
$ source devel/setup.bash
$ catkin_make
ここで、よく注意書きに「python setup.py」と書いちゃダメ、というのがある。
setuptoolsにインストールするわけではなく、
ROSのwork folderに出来上がるためだ。
この後に
$ rosrun beuato_monitor_test beuato_server.py
を実行すれば動いてくれる。