Closed kochigami closed 9 years ago
うまく表示できないのでもう一度書きます。
<node name="nao_speaking" pkg="object_learn_using_sift" type="play_voice_text_subscriber.py" args="$(arg nao_ip)"/>
上のはどうしてもうまく表示されませんでした。
http://wiki.ros.org/ja/roslaunch/XML を見て、argsはroslaunchにしか使えないことが分かりました。 play_voice_text_subscriber.pyをまずlaunchファイルにして、 それを読み込む形にしてargsでnao_ipを読もうとしましたが、やはりノードは死んでしまいました。 pythonのコードに、そもそもnao_ipという引数名がない(そもそも引数名がない)ので、引数名なしでコマンドライン入力するための方法を調べる必要があります。
https://github.com/ahornung/nao_robot.git のnao_driver/nao_driver.launchを参考に書いてみたけれど、やはりノードは死んでしまいました。 これによると、roslaunchでなくてもargsは使えています。
どうしてダメなのか、明日また考えます。 [nao_speaking-6] process has died [pid 8604, exit code 1, cmd /home/kochigami/ros/groovy/object_learn_using_sift/scripts/play_voice_text_subscriber.py 169.254.20.238 __name:=nao_speaking __log:=/home/kochigami/.ros/log/a899330c-520f-11e4-b2c6-28d2444a1522/nao_speaking-6.log]. log file: /home/kochigami/.ros/log/a899330c-520f-11e4-b2c6-28d2444a1522/nao_speaking-6*.log
最悪、このプログラムだけ別に立ち上げます。
そのプログラムを省いたlaunchファイルを実行したところ、 もうひとつのpythonのプログラムもうまく動いていませんでした。 htmlファイルのpathをトピックで受け取り、firefoxで表示するプログラムで、 launchファイルに組み込むと、何故か正しいpathが渡せなくなるようです。
pythonのプログラムを別に動かし、launchファイルを実行すると動くようになりました。
引数云々なら、パラメーターサーバーを使ってパラメータ―を与える手もありますが・・・ http://wiki.ros.org/rospy/Overview/Parameter%20Server 普通にできるようになったほうがよさそうですね。 パスの問題は、とりあえず絶対パス(/home/kochigami/ros/groovy/object_learn_using_sift/diary/diary%04d.html など)をメッセージで与えればうまく行くかもしれません。
相対パスで書いていたのを忘れていました。ご指摘ありがとうございます。
PYTHONPATHを通す必要があるのか、など色々試してみましたが一旦引数を取って実行したいプログラムだけ個別に立ち上げることにしようと思います。 どうしてnao_driver.launchは動くのか考えることがヒントになりそうなので、先に作業を進めてから戻ってこようと思います。
@YuOhara さんのアドバイスに従い、play_subscriber.pyの中でコマンドライン引数を表示させてみました。 argvs=sys.argv print argvs
IPはargvs[1]から、 PORTはコマンドライン引数の数が2より大きければargvs[2]から、 そうでなければデフォルト値を取ります。
そこで、launchファイルの中を
<node name="nao_speaking" pkg="cultural_festival" type="play_voice_text_subscriber.py" args="--pi\ p=$(arg nao_ip) /> とし実行すると、
roslaunch cultural_festival cultural_festival_cp.launch ... logging to /home/kochigami/.ros/log/bc6f25fc-5413-11e4-b4b8-28d2444a1522/roslaunch-kochigami-ThinkPad-T440p-5541.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://127.0.0.1:43109/
PARAMETERS
NODES / nao_speaking (cultural_festival/play_voice_text_subscriber.py)
auto-starting new master process[master]: started with pid [5555] ROS_MASTER_URI=http://127.0.0.1:11311
setting /run_id to bc6f25fc-5413-11e4-b4b8-28d2444a1522 process[rosout-1]: started with pid [5568] started core service [/rosout] process[nao_speaking-2]: started with pid [5580] [nao_speaking-2] process has died [pid 5580, exit code 1, cmd /home/kochigami/ros/groovy/cultural_festival/scripts/play_voice_text_subscriber.py 127.0.0.1 __name:=nao_speaking __log:=/home/kochigami/.ros/log/bc6f25fc-5413-11e4-b4b8-28d2444a1522/nao_speaking-2.log]. log file: /home/kochigami/.ros/log/bc6f25fc-5413-11e4-b4b8-28d2444a1522/nao_speaking-2*.log
この一番下にあるcmd を見ると、logファイルつきで実行されることが分かりました。今の場合、argvs[2]のlogファイル名がPORTに代入されているようです。
しかし、launchファイルにPORTの記述を付け足しても、
roslaunch cultural_festival cultural_festival_cp.launch nao_ip:=169.254.20.238 ... logging to /home/kochigami/.ros/log/8edee444-5416-11e4-a9e7-28d2444a1522/roslaunch-kochigami-ThinkPad-T440p-6816.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://127.0.0.1:35420/
PARAMETERS
NODES / nao_speaking (cultural_festival/play_voice_text_subscriber.py)
auto-starting new master process[master]: started with pid [6830] ROS_MASTER_URI=http://127.0.0.1:11311
setting /run_id to 8edee444-5416-11e4-a9e7-28d2444a1522 process[rosout-1]: started with pid [6843] started core service [/rosout] process[nao_speaking-2]: started with pid [6855] [nao_speaking-2] process has died [pid 6855, exit code 1, cmd /home/kochigami/ros/groovy/cultural_festival/scripts/play_voice_text_subscriber.py 169.254.20.238 9559 __name:=nao_speaking __log:=/home/kochigami/.ros/log/8edee444-5416-11e4-a9e7-28d2444a1522/nao_speaking-2.log]. log file: /home/kochigami/.ros/log/8edee444-5416-11e4-a9e7-28d2444a1522/nao_speaking-2*.log
となりノードが死んでしまいました。 そもそも、 rosrun cultural_festival play_voice_text_subscriber.py 169.254.20.238 は実行できますが、
rosrun cultural_festival play_voice_text_subscriber.py 169.254.20.238 9559 は実行できません。 169.254.20.238 9559 Could not create proxy to ALAudioPlayer Error was: Wrong number or type of arguments for overloaded function 'new_proxy'. Possible C/C++ prototypes are: AL::proxy::proxy(char ) AL::proxy::proxy(char ,bool) AL::proxy::proxy(char ,char ,int,bool) AL::proxy::proxy(char ,char ,int) となってしまいました。
play_voice_text_subscriber.pyの中のPORTは9559で固定してlaunchファイルも動くようになりました。 理由は何故かわかりませんが・・・
PORT = 9559
これだけ残し、
if (len(sys.argv) > 2):
PORT = sys.argv[2]
print IP
print PORT
の部分を消しました。
今まで書いたプログラムを全てlaunchファイルにまとめました。 args="$(find object_learn_using_sift)/...の中のfindを忘れてエラーが出ましたが、動くようにはなりました。 しかし、プログラムの実行時に引数(NaoのIP)を与えたいもので、ノードが1つ死んでしまいます。 実行時に、rosrun object_learn_using_sift play_voice_text_subscriber.py **(NaoのIP) となってほしいものです。 引数がうまく渡せていないと思うので、正しいやり方を調べる必要があります。 死んでしまっているのはこのノードです。