Skip to content

Instantly share code, notes, and snippets.

@jones2126
Last active May 16, 2021 16:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jones2126/151f91359931d1334fc606f9df185299 to your computer and use it in GitHub Desktop.
Save jones2126/151f91359931d1334fc606f9df185299 to your computer and use it in GitHub Desktop.
Tkinter GUI to help start ROS launch files - WIP
#!/usr/bin/env python
#
#ROS_GUI_v5.py
# modelled after: https://raw.githubusercontent.com/ablarry91/quadcopter_IR_control/e782f49390d5527ed86678acda727f5d698c0c07/monocular_pose_estimator/src/Tkinter_GUI.py
# inspired by: https://raw.githubusercontent.com/mturktest123/rosGUI/master/ROS_GUI.py
import subprocess
import time
from Tkinter import *
import rospy
from std_msgs.msg import Int16
from sensor_msgs.msg import NavSatFix, NavSatStatus, TimeReference
from geometry_msgs.msg import Twist
#from std_msgs.msg import NavSatFix
windowid1 = ''
cmd_RPi_login = "plink RPI_on_ZeroTier -pw ubuntu" # command to login to RPi
working_directory1 = "--working-directory=/home/al"
def LaunchCommand():
global windowid1
global cmd_RPi_login
global working_directory1
print("tbd")
title1 = "login to RPi via VPN" # title shows on the button - it can be any helpful text
cmd_RPi_start = "bash ros_start.sh" # bash file on RPi which has the main start launch file
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+1"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
subprocess.call(["xdotool", "windowfocus", windowid1])
subprocess.check_output(["xdotool", "type", cmd_RPi_start + "\n"])
def JoystickCommand():
global windowid1
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+2"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
# this starts the joystick/gamepad process for the gamepad connected to the RPi on input js0
# the 2.4 GHz gamepad should have been connected
subprocess.check_output(["xdotool", "type", "roslaunch tractor_teleop drive.launch" + "\n"])
def NMEACommand():
global windowid1
global cmd_RPi_login
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+3"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
subprocess.check_output(["xdotool", "type", "cd /home/ubuntu/catkin_ws/src/nmea_navsat_driver/launch" + "\n"])
time.sleep(.5)
# this starts the node to access the GPS signal connected to the udev port "<arg name="port" default="/dev/gps" />"
# the package will also parse the sentence and publish the data
subprocess.check_output(["xdotool", "type", "roslaunch nmea_serial_driver.launch" + "\n"])
def OdomControl():
global windowid1
global cmd_RPi_login
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+4"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
subprocess.check_output(["xdotool", "type", "cd ~/catkin_ws" + "\n"])
time.sleep(.5)
subprocess.check_output(["xdotool", "type", "rosrun beginner_tutorials gps_odom.py" + "\n"])
def MoveBaseCommand():
global windowid1
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+5"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
subprocess.check_output(["xdotool", "type", "cd ~/catkin_ws" + "\n"])
time.sleep(.5)
subprocess.check_output(["xdotool", "type", "roslaunch lawn_tractor_sim lawn_tractor.launch" + "\n"])
def RosbagCommand():
global windowid1
global cmd_RPi_login
subprocess.call(["xdotool", "windowfocus", windowid1])
time.sleep(.1)
subprocess.call(["xdotool", "key", "alt+6"])
time.sleep(.1)
subprocess.check_output(["xdotool", "type", cmd_RPi_login + "\n"])
time.sleep(5) # delay for the login process to the RPi
subprocess.check_output(["xdotool", "type", "bash ros_bagfile.sh" + "\n"])
def callback(data):
global low_res_angle_tk
low_res_angle_tk.set(data.data)
def callback_gps(data):
global gps_status_tk
gps_status_tk.set(data.status.status)
def callback_cmd_vel(msg):
global cmd_vel_angle
global cmd_vel_speed
cmd_vel_angle.set(msg.angular.z)
cmd_vel_speed.set(msg.linear.x)
#create the GUI window
root = Tk()
root.geometry("600x150+30+30")
root.title('ROS GUI')
low_res_angle_tk = IntVar()
gps_status_tk = IntVar()
cmd_vel_angle = DoubleVar()
cmd_vel_speed = DoubleVar()
counter2 = IntVar()
counter3 = IntVar()
counter4 = IntVar()
frame = Frame(root)
frame.pack()
#build subframes into the main GUI frame
frame0 = Frame(frame)
frame01 = Frame(frame,borderwidth=2,relief=RAISED)
frame1 = Frame(frame)
frame2 = Frame(frame)
frame3 = Frame(frame)
frame4 = Frame(frame)
#indicate where you want the frames to be oriented
frame0.pack(side = TOP)
frame01.pack(side = TOP)
frame1.pack(side = TOP)
frame2.pack(side = TOP)
frame3.pack(side = TOP)
frame4.pack(side = TOP)
#create buttons
b0 = Button(frame0, text="Launch sensors", command=LaunchCommand)
b0.pack(side=LEFT)
b1 = Button(frame0, text="Start joystick", command=JoystickCommand)
b1.pack(side=LEFT)
b2 = Button(frame0, text="NMEA Driver",command=NMEACommand)
b2.pack(side=LEFT)
b3 = Button(frame0, text="GPS Odom",command=OdomControl)
b3.pack(side=LEFT)
b4 = Button(frame0, text="MoveBase",command=MoveBaseCommand)
b4.pack(side=LEFT)
b5 = Button(frame0, text="Rosbag",command=RosbagCommand)
b5.pack(side=LEFT)
#create text entries
frameE1 = Frame(frame01)
frameE2 = Frame(frame01)
frameE3 = Frame(frame01)
frameE4 = Frame(frame01)
frameE5 = Frame(frame01)
frameE6 = Frame(frame01)
frameE1.pack(side = LEFT)
frameE2.pack(side = LEFT)
frameE3.pack(side = LEFT)
frameE4.pack(side = LEFT)
frameE5.pack(side = LEFT)
frameE6.pack(side = LEFT)
#labels
label1 = Label(frameE1,text="low res angle")
label2 = Label(frameE2,text="gps_status")
label3 = Label(frameE3,text="heading")
label4 = Label(frameE4,text="volts")
label5 = Label(frameE5,text="cmd_speed")
label6 = Label(frameE6,text="cmd_angle")
label1.pack(side=TOP)
label2.pack(side=TOP)
label3.pack(side=TOP)
label4.pack(side=TOP)
label5.pack(side=TOP)
label6.pack(side=TOP)
#values for the labels
e1 = Label(frameE1, textvariable=low_res_angle_tk ,width = 10,justify=CENTER)
e1.pack(side=RIGHT)
e2 = Label(frameE2, textvariable=gps_status_tk ,width = 10,justify=CENTER)
e2.pack(side=RIGHT)
e3 = Label(frameE3, textvariable=counter3, width = 10,justify=CENTER)
e3.pack(side=RIGHT)
e4 = Label(frameE4, textvariable=counter4, width = 10,justify=CENTER)
e4.pack(side=RIGHT)
e5 = Label(frameE5, textvariable=cmd_vel_speed, width = 10,justify=RIGHT)
e5.pack(side=RIGHT)
e6 = Label(frameE6, textvariable=cmd_vel_angle, width = 10,justify=RIGHT)
e6.pack(side=RIGHT)
# open the initial terminal windows
subprocess.call(["xdotool", "windowmove", windowid1.decode(), "20", "20"])
time.sleep(.1)
working_directory1 = "--working-directory=/home/al"
subprocess.call(["xdotool", "exec", "gnome-terminal", "--geometry=100x20+450+20", working_directory1])
time.sleep(.5)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
subprocess.call(["xdotool", "key", "ctrl+shift+t"])
time.sleep(.1)
windowid1 = subprocess.check_output(["xdotool", "getactivewindow"])
print("windowid1", windowid1.decode(), windowid1)
subprocess.call(["xdotool", "windowmove", windowid1.decode(), "50", "575"])
time.sleep(.1)
subprocess.call(["xdotool", "exec", "gnome-terminal", "--geometry=50x20+450+200", working_directory1])
time.sleep(.5)
windowid2 = subprocess.check_output(["xdotool", "getactivewindow"])
subprocess.call(["xdotool", "windowmove", windowid2.decode(), "1000", "575"])
print("windowid2", windowid2.decode())
rospy.Subscriber("/front_angle_low_res", Int16, callback)
rospy.Subscriber("/fix", NavSatFix, callback_gps)
rospy.Subscriber("/cmd_vel", Twist, callback_cmd_vel)
rospy.init_node('tkinterGUI', anonymous=True)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment