RosのTopic通信を利用してロボットの動作状況を表示するGUIを作成しています。
(写真がGUIのイメージです。)
Subscriber側で受け取ったメッセージによって表示文字と背景色を変えるという形で作っています。
現在は通信部分はRosの参考書・表示の仕組みはいろいろなWebサイトを参考に作ってはいますが、以下のエラーが出ていてこのエラーを解決できていません。助けていただけないでしょうか。お願いいたします。
参考書
「ROSではじめる ロボットプログラミング」著者 小倉崇
主な参考サイト
時刻部分
https://qiita.com/The-town/items/be391ff799f95dab8b96
状況表示部分
https://www.geeksforgeeks.org/python-tkinter-text-widget/
使用言語
Python
使用OS
Ubuntu16.04
イメージ
エラー文
CTraceback (most recent call last): File "/home/tomatoko/catkin_ws/src/ros_start/scripts/listener.py", line 98, in <module> tk.mainloop() File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 417, in mainloop _default_root.tk.mainloop(n) AttributeError: 'NoneType' object has no attribute 'tk' Exception in thread Thread-7: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 754, in run self.__target(*self.__args, **self.__kwargs) File "/home/tomatoko/catkin_ws/src/ros_start/scripts/listener.py", line 38, in changeLabelText self.label1["text"] = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1336, in __setitem__ self.configure({key: value}) File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1329, in configure return self._configure('configure', cnf, kw) File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1320, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) RuntimeError: main thread is not in main loop
Publisher側
#!/usr/bin/env python # -*- coding:utf-8 -*- import rospy from std_msgs.msg import String rospy.init_node('talker') pub = rospy.Publisher('chatter',String, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): hello_str = String() hello_str.data = "b" pub.publish(hello_str) rate.sleep()
Subscriber側
#!/usr/bin/env python # -*- coding:utf-8 -*- import rospy from std_msgs.msg import String import Tkinter as tk import datetime import time import threading status = "今は" color = "#ff69b4" class Start: def __init__(self): self.root = tk.Tk() self.root.attributes("-zoomed", "1") self.label = tk.Label(self.root) self.label1 = tk.Label(self.root) self.label["font"] = ("Helvetica", 170) self.label1["font"] = ("Helvetica", 78) self.label["bg"] = color self.label1["bg"] = "white" self.label["fg"] = "black" self.label1["fg"] = "black" self.label ["text"] = status self.label.place(x=0,y=20,width=1000,height=430) self.label1.place(x=0, y=450) def changeLabelText(self): while True: self.label1["text"] = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") time.sleep(1) def calc(Rosmsg): if(Rosmsg == "a"): status = "停 止 中" color = "#87cefa" #lightskyblue elif(Rosmsg == "b"): status = "移 動 中" color = "#ffd700" #orange elif(Rosmsg == "c"): status = "認 識 中" color = "#9932cc" #darkchid elif(Rosmsg == "d"): status = "収 穫 中" color = "#9acd32" #yellowgreen elif(Rosmsg == "e"): status = "収 納 中" color = "#ff69b4" #hotpink else: status = "Error!!" color = "#dc143c" #crimson #label["text"] = status # ラベル内テキスト変更 #label["bg"] = color # ラベル背景色変更 def callback(message): Rosmsg= str(message.data) calc(Rosmsg) rospy.init_node('listener') sub = rospy.Subscriber('chatter', String, callback) rospy.spin() if __name__ == "__main__": start = Start() start.root.title(u"status") thread = threading.Thread(target=start.changeLabelText) thread.start() start.root.mainloop() tk.mainloop()
回答1件
あなたの回答
tips
プレビュー