Implement GUI tracing pen position in XY plane

This commit is contained in:
2022-11-09 11:29:40 +02:00
parent fefd115678
commit c77a2732d9
2 changed files with 72 additions and 6 deletions

View File

@@ -13,7 +13,8 @@
<depend>rclcpp</depend> <depend>rclcpp</depend>
<depend>geometry_msgs</depend> <depend>geometry_msgs</depend>
<depend>tf2_ros</depend> <depend>tf2_ros</depend>
<depend>python-lxml</depend> <depend>python3-lxml</depend>
<depend>python3-tk</depend>
<depend>xarm_description</depend> <depend>xarm_description</depend>
<depend>xarm_moveit_config</depend> <depend>xarm_moveit_config</depend>
<!-- <depend>moveit_ros_planning_interface</depend> --> <!-- <depend>moveit_ros_planning_interface</depend> -->

75
src/draw_svg/src/py/drawing_surface.py Normal file → Executable file
View File

@@ -2,7 +2,7 @@
"""Example that uses MoveIt 2 to follow a target inside Ignition Gazebo""" """Example that uses MoveIt 2 to follow a target inside Ignition Gazebo"""
import rclpy import rclpy
from geometry_msgs.msg import Pose, PoseWithCovariance from geometry_msgs.msg import Pose, PoseWithCovariance, Point
from nav_msgs.msg import Odometry from nav_msgs.msg import Odometry
from pymoveit2 import MoveIt2 from pymoveit2 import MoveIt2
from robots import lite6 from robots import lite6
@@ -10,10 +10,49 @@ from rclpy.callback_groups import ReentrantCallbackGroup
from rclpy.node import Node from rclpy.node import Node
from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy
from queue import Queue
import tkinter as tk
import math
import threading
def translate(val, lmin, lmax, rmin, rmax):
lspan = lmax - lmin
rspan = rmax - rmin
val = float(val - lmin) / float(lspan)
return rmin + (val * rspan)
class DrawingApp(tk.Tk):
def __init__(self, queue):
tk.Tk.__init__(self)
self.queue = queue
self.canvas = tk.Canvas(self, width=400, height=400)
self.canvas.pack(side="top", fill="both", expand=True)
#self.canvas.create_line(200,200, 200,200, tags=("line",), arrow="last")
self.read_queue()
def create_circle(self, x, y, r, **kwargs):
self.canvas.create_oval(x-r, y-r, x+r, y+r, **kwargs)
def read_queue(self):
'''Read queue and draw circle every 100 ms'''
if self.queue.empty():
self.after(10, lambda: self.read_queue())
return
p = self.queue.get()
print("last_point->x:{} y:{} z:{}".format(p.x, p.y, p.z))
r = 5
x = translate(p.x, -1.0, 0.5, 0, 400)
y = translate(p.y, -1.0, 0.5, 0, 400)
self.create_circle(x,y,r, fill="red")
self.after(10, lambda: self.read_queue())
class LogPen(Node): class LogPen(Node):
def __init__(self): def __init__(self, queue=Queue()):
self.queue = queue
super().__init__("log_pen") super().__init__("log_pen")
# Create callback group that allows execution of callbacks in parallel without restrictions # Create callback group that allows execution of callbacks in parallel without restrictions
@@ -35,8 +74,8 @@ class LogPen(Node):
Log position of pen Log position of pen
""" """
p = msg.pose.pose.position p = msg.pose.pose.position
#self.get_logger().info("x:{}, y:{}, z:{}".format(p[0], p[1], p[2])) #self.get_logger().info("x:{} y:{} z:{}".format(p.x, p.y, p.z))
self.get_logger().info("x:{} y:{} z:{}".format(p.x, p.y, p.z)) self.queue.put(p)
def main(args=None): def main(args=None):
@@ -51,6 +90,32 @@ def main(args=None):
rclpy.shutdown() rclpy.shutdown()
exit(0) exit(0)
def log_thread(queue=Queue()):
rclpy.init()
log_pen = LogPen(queue)
executor = rclpy.executors.MultiThreadedExecutor(2)
executor.add_node(log_pen)
executor.spin()
rclpy.shutdown()
exit(0)
if __name__ == "__main__": if __name__ == "__main__":
main() #main()
q = Queue()
thread0 = threading.Thread(target=log_thread, args=[q])
thread0.start()
#thread0.join()
#thread1 = threading.Thread(target=DrawingApp().mainloop)
#thread1.start()
#thread1.join()
app = DrawingApp(q)
app.mainloop()