Add ugv_to_ground.py
This commit is contained in:
parent
15f4080482
commit
ee0ff57484
@ -0,0 +1,2 @@
|
|||||||
|
python-socketio==4.0.1
|
||||||
|
PyYAML==5.1
|
@ -19,8 +19,9 @@ class UGVComms:
|
|||||||
MAX_WRITE_RETRY = 5
|
MAX_WRITE_RETRY = 5
|
||||||
RETRY_TIME = 3.0
|
RETRY_TIME = 3.0
|
||||||
|
|
||||||
def __init__(self, serial_port: serial.Serial):
|
def __init__(self, serial_port: serial.Serial, on_msg_received=None):
|
||||||
self.ser = serial_port
|
self.ser = serial_port
|
||||||
|
self.on_msg_received = on_msg_received
|
||||||
self.msg_acks = []
|
self.msg_acks = []
|
||||||
self.ack_cv = threading.Condition()
|
self.ack_cv = threading.Condition()
|
||||||
self.next_command_id = 1
|
self.next_command_id = 1
|
||||||
@ -84,6 +85,8 @@ class UGVComms:
|
|||||||
if msg is None:
|
if msg is None:
|
||||||
return
|
return
|
||||||
log.debug("received UGV message: %s", msg)
|
log.debug("received UGV message: %s", msg)
|
||||||
|
if self.on_msg_received:
|
||||||
|
self.on_msg_received(msg)
|
||||||
if msg.HasField("command_ack"):
|
if msg.HasField("command_ack"):
|
||||||
with self.ack_cv:
|
with self.ack_cv:
|
||||||
self.msg_acks.append(msg.command_ack)
|
self.msg_acks.append(msg.command_ack)
|
||||||
|
@ -48,7 +48,8 @@ def cli_cmd(names=None, description=""):
|
|||||||
|
|
||||||
|
|
||||||
class UGV_CLI:
|
class UGV_CLI:
|
||||||
def __init__(self):
|
def __init__(self, on_msg_received=None):
|
||||||
|
self.on_msg_received = on_msg_received
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
self.last_state = messages.STATE_IDLE
|
self.last_state = messages.STATE_IDLE
|
||||||
self.commands = {
|
self.commands = {
|
||||||
@ -137,7 +138,7 @@ class UGV_CLI:
|
|||||||
self.last_status()
|
self.last_status()
|
||||||
|
|
||||||
@cli_cmd(names=["ping", "p"], description="Ping the UGV")
|
@cli_cmd(names=["ping", "p"], description="Ping the UGV")
|
||||||
def get_status(self):
|
def ping(self):
|
||||||
cmd = messages.GroundCommand()
|
cmd = messages.GroundCommand()
|
||||||
cmd.type = messages.CMD_PING
|
cmd.type = messages.CMD_PING
|
||||||
self.ugv.write_command(cmd)
|
self.ugv.write_command(cmd)
|
||||||
@ -172,7 +173,7 @@ class UGV_CLI:
|
|||||||
readline.parse_and_bind("tab: complete")
|
readline.parse_and_bind("tab: complete")
|
||||||
readline.set_completer(self.complete_command)
|
readline.set_completer(self.complete_command)
|
||||||
|
|
||||||
self.ugv = UGVComms(ser)
|
self.ugv = UGVComms(ser, self.on_msg_received)
|
||||||
self.ugv.start()
|
self.ugv.start()
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
last_line = None
|
last_line = None
|
||||||
|
54
tools/ugv_to_ground.py
Executable file
54
tools/ugv_to_ground.py
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import socketio
|
||||||
|
import signal
|
||||||
|
import logging
|
||||||
|
from base64 import b64decode, b64encode
|
||||||
|
|
||||||
|
from ugv_cmd import UGV_CLI
|
||||||
|
import messages_pb2 as messages
|
||||||
|
from google.protobuf.message import Message
|
||||||
|
|
||||||
|
def encode_msg(msg: Message):
|
||||||
|
data = msg.SerializeToString()
|
||||||
|
return b64encode(data)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
server_ip = 'localhost'
|
||||||
|
|
||||||
|
sio = socketio.Client()
|
||||||
|
|
||||||
|
def on_msg_received(msg: messages.UGV_Message):
|
||||||
|
sio.emit('UGV_MESSAGE', encode_msg(msg), namespace='/ugv')
|
||||||
|
|
||||||
|
ugv_cli = UGV_CLI(on_msg_received)
|
||||||
|
|
||||||
|
@sio.on('connect', namespace='/ugv')
|
||||||
|
def on_connect():
|
||||||
|
print("connected to ground server")
|
||||||
|
|
||||||
|
@sio.on('disconnect', namespace='/ugv')
|
||||||
|
def on_disconnect():
|
||||||
|
print("disconnected from ground server!")
|
||||||
|
|
||||||
|
@sio.on('SET_TARGET', namespace='/ugv')
|
||||||
|
def set_target(msg):
|
||||||
|
print("Setting UGV target")
|
||||||
|
ugv_cli.set_target(msg['lat'], msg['lng'])
|
||||||
|
|
||||||
|
@sio.on('DRIVE_TO_TARGET', namespace='/ugv')
|
||||||
|
def drive_to_target():
|
||||||
|
print("Driving to target!")
|
||||||
|
ugv_cli.drive_to_target()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
sio.connect('http://'+server_ip+':8081', namespaces=['/ugv'], transports='websocket')
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
print("Can't connect to ground server. Retrying in 2 seconds...")
|
||||||
|
sio.sleep(2)
|
||||||
|
|
||||||
|
logging.basicConfig(format='%(asctime)s [%(name)s] %(levelname)s: %(message)s', datefmt='%Y-%b-%d %H:%M:%S')
|
||||||
|
logging.getLogger().setLevel(logging.INFO)
|
||||||
|
|
||||||
|
ugv_cli.start()
|
Loading…
x
Reference in New Issue
Block a user