ROSでパッケージを作成する時に他のサービスが発行するトピックに依存している時など、他のサービスが立ち上がるまで待つ必要がある時があります。

その場合、wait_for_service()関数を使用することで実現できます。この関数は、指定したサービスが提供されるまでPythonスクリプトをブロックし、指定されたタイムアウトが経過すると例外を投げます。

コード例

#!/usr/bin/env python
import rospy
from std_srvs.srv import Empty

rospy.init_node('wait_for_service')

# サービスが提供されるまで待機
rospy.wait_for_service('/my_service')

try:
    # サービスを使用する
    my_service = rospy.ServiceProxy('/my_service', Empty)
    response = my_service()
    rospy.loginfo(response)
except rospy.ServiceException as e:
    rospy.logerr("Service call failed: %s" % e)

この例では、/my_serviceサービスが提供されるまでPythonスクリプトがブロックされます。サービスが提供されると、tryブロック内でmy_service()関数を使用してサービスを呼び出します。もしサービスの呼び出しが失敗した場合は、rospy.logerr()を使用してエラーログを出力します。

Ros

Related Posts

roslaunchでrospy.loginfoでの出力が表示されない場合の対応策
roslaunchでrospy.loginfoでの出力が表示されない場合の対応策
roslaunchで起動したときに、rospy.loginfoで出力しても表示されない場合は下記のように--screenオプションをつけましょう。 コマンドラインで実行する場合 roslaunch your_package your_...
Read More
ArduinoのpulseInで割り込み処理ができるようにする
ArduinoのpulseInで割り込み処理ができるようにする
概要 超音波センサーHC-SR04等を用いてArduinoで距離計測を行いたいときに、Trigピンで超音波を発生させた後にEchoピンで、超音波が反射されてくるまでの時間を計測することで距離を計測できます。その際、pulseInという...
Read More
DCモータ制御で配線が複雑になる場合はDCモータコントローラシールドMD04を使うと便利!
DCモータ制御で配線が複雑になる場合はDCモータコントローラシールドMD04を使うと便利!
概要 DCモータを動作させる際は、モータコントローラを用いると便利ですが、それでも複数のモータを動作させようとしたときには配線がごちゃごちゃになってしまいがちです。そのような時は、シールドタイプのDCモータコントローラを使えば、マイコ...
Read More