質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

640閲覧

unityからトピックを送信してrosでwhile文の無限ループ中にトピック受信して抜け出せなくて困っています

xtx

総合スコア1

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/02/08 00:52

編集2023/02/08 02:31

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2023/02/08 02:06

- 「トピック」って何ですか? (UnityとROSの両方を知っている人は限られるので、出来る限りそれ用の用語は避けていただけると助かります) - 文章だけでは具体的なコードが分からないので、実際のコードを記載してください。
fiveHundred

2023/02/08 02:19

Unity側のコードも記載してください。
xtx

2023/02/08 02:20

ROSの方で使用される用語でして、送受信(ノード間の通信)を行うものです コードを忘れていたので追記しました
fiveHundred

2023/02/08 02:52

Unity側のコードの「“」が全角になってます。 あと、そもそも無限ループしていること自体、やっていいことなのですか? 今回とは全く関係ないですが、Unityではメインの関数内で無限ループを行うと、Unityのメインエンジンがシングルスレッドであるという都合上、他の全てのコードも動かなくなってしまうので、やってはいけないことになっています。 「ROSで実行しているトピックは無限ループ中でも受信できる」のが謎ですが、たまたま動いただけかもしれません。 提示のコードのような内容だと、無限ループを行わなくても、状態を保持した変数を用意すれば解決すると思いますし、一度無限ループを使わない方針でやるとどうなりますか?
xtx

2023/02/08 03:53

無限ループ中はトピック受信する方法はないのですね。 無限ループ使わないやり方に変えてみます。 ありがとうございました!
guest

回答2

0

自己解決

無限ループ中はトピック受信する方法はないみたいなので無限ループ使わないやり方に変えてみます。
ありがとうございました!

投稿2023/02/08 03:59

xtx

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのwhileループの中でトピックを受信して、あなたの言う停止させるトピックが受信されたら、ループを抜けるようなコードを書く必要があります

投稿2023/02/08 01:47

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xtx

2023/02/08 02:14

回答ありがとうございます! 書いているのですが、なぜかUnityからの受信されたというprintが表示されないのでトピックが受信していないようなので、tが"stop"に変わらず抜け出せないのです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問