実現したいこと
whileを使用した無限ループ中にトピックを受信したい
前提
UnityとROSの通信について勉強中です。
元々ROSのTkinterで出来ていたことをUnityで操作したくなり、結果苦戦しております。
Unityで送信したトピックをROSで受信する、というものを書きたいです。
発生している問題・エラーメッセージ
始めはUnityから送信した動作させるトピックでwhileに入り、
それをUnityから送信した停止させるトピックでwhileを抜け出したいのですが、
無限ループ中だとトピックが受信しませんでした。
UnityとROSの間で起きている問題なのかと思ったのですが、rostopic echoで確認するとトピックは受信しているようでして、無限ループが問題だとしてもROSで実行している/tfや/cmd_velは常に受信できているので無限ループが原因なのかもはっきりせず、ROSで実行しているトピックは無限ループ中でも受信できるのに対し、Unityで送信すると受信しないのはどうしてなのかわかりませんでした。
無限ループ中のUnityからのトピックを受信するためにはどうしたらいいのか、そしてなぜUnityからのトピックは無限ループ中受信しないのか教えてください。
#ROS# class Test(): def __init__(self): rospy.Subscriber('/cnd_vel', Twist, self.callback) rospy.Subscriber('/chatter', String, self.sub) rospy.spin() def callback(self, msg): print(msg.linear.x) #常に出力される def sub(self, s): if s.data == "Move": loop = "move" elif s.data == "Stop": loop = "stop" print(loop) #無限ループ中は出力されない self.test(loop) def test(self, t) while t == "move": print("move") rospy.sleep(1) if t == "stop": #無限ループ中は受信されないため、入らない break print("stop!") if __name__ == '__main__': Test()
#Unity# using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.Robotics.ROSTCPConnector; using RosMessageTypes.Std; public class publisher : MonoBehaviour { ROSConnection ros; void Start() { ros = ROSConnection.GetOrCreateInstance(); ros.RegisterPublisher<StringMsg>(“chatter”); } public void StartButtonClick() { StringMsg s = new StringMsg(“Move”); ros.Publish(“chatter”, s); } public void StopButtonClick() { StringMsg s = new StringMsg(“Stop”); ros.Publish(“chatter”, s); } }
試したこと
無限ループを数回実行して抜け出してみましたら、抜け出した後にトピックを受信してました。
Tkinterをそのまま使用してトピックでTkinterを操作してみましたが、無限ループ中は受信しませんでした。
しかし、Tkinterのボタンを押すと停止して抜け出せて、抜け出した後にトピックを受信してました。
補足情報(FW/ツールのバージョンなど)
ubuntu18
python2

回答2件
あなたの回答
tips
プレビュー