diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/control.py b/control.py index d90358b..320049b 100644 --- a/control.py +++ b/control.py @@ -1,13 +1,26 @@ -import struct -from remote_control_unit import RemoteControlUnit - - class Control: def __init__(self): - self.mode = ['lock', 'manual'] - self.data = {'mode': self.mode[1], 'thrust': 0, 'rudder': 0, } + self.mode = ['lock', 'manual', 'line'] + self.data = {'mode': 'lock', 'thrust': 0, 'rudder': 0, } - def run(self, usv): - if self.data['mode'] == self.mode[1]: + def c_run(self, usv): + self.choose_mode(usv) + self.control(usv) + + def control(self, usv): + # 锁定 + if self.data['mode'] == 'lock': + self.data['thrust'] = 0 + self.data['rudder'] = 0 + # 手动 + elif self.data['mode'] == 'manual': self.data['rudder'] = int(1.4881 * (usv.futaba.receive_data['channel1'] - 1024)) self.data['thrust'] = int(-1.4881 * (usv.futaba.receive_data['channel3'] - 1024)) + + def choose_mode(self, usv): + if usv.futaba.receive_data['channel5'] > 1360: + self.data['mode'] = self.mode[1] + elif usv.futaba.receive_data['channel5'] < 688: + self.data['mode'] = self.mode[2] + else: + self.data['mode'] = self.mode[0] diff --git a/remote_control_unit.py b/remote_control_unit.py index 3eaded6..021476f 100644 --- a/remote_control_unit.py +++ b/remote_control_unit.py @@ -16,12 +16,24 @@ class RemoteControlUnit: self.buffer = [] self.packet = array.array('B') - def run(self, usv): - self.buffer += self.sbus.read() - self.decode(usv) + def rcu_run(self, usv): + self.decode() + self.send_command(usv) + + def send_command(self, usv): + self.send_data = self.receive_data.copy() + self.send_data['channel1'] = int( + 1024 + ((usv.control.data['rudder'] + usv.control.data['thrust']) * 0.672)) # 左电机 + self.send_data['channel3'] = int( + 1024 + ((usv.control.data['thrust'] - usv.control.data['rudder']) * 0.672)) # 右电机 + + self.encode() + self.sbus.write(self.packet.tobytes()) + + def decode(self, ): + """读取数据并解包数据""" + self.buffer += self.sbus.read(25) - def decode(self, usv): - """解包数据""" while len(self.buffer) >= 25: if self.buffer[0] != 0x0f: del self.buffer[0] @@ -56,16 +68,6 @@ class RemoteControlUnit: self.receive_data['flag'] = self.buffer[23] del self.buffer[:25] - - self.send_data = self.receive_data.copy() - self.send_data['channel1'] = int( - 1024 + ((usv.control.data['rudder'] + usv.control.data['thrust']) * 0.672)) # 左电机 - self.send_data['channel3'] = int( - 1024 + ((usv.control.data['thrust'] - usv.control.data['rudder']) * 0.672)) # 右电机 - - self.encode() - self.sbus.write(self.packet.tobytes()) - break def encode(self): diff --git a/usv.py b/usv.py index 344de24..15a6f2b 100644 --- a/usv.py +++ b/usv.py @@ -1,3 +1,5 @@ +import threading + from remote_control_unit import RemoteControlUnit from control import Control from settings import Settings @@ -8,16 +10,17 @@ class UsvControl: def __init__(self): self.settings = Settings() - self.futaba = RemoteControlUnit(self.settings.sbus_com) + self.futaba = RemoteControlUnit(self.settings.sbus_com, ) self.control = Control() - def run(self): - while True: - self.futaba.run(self) - self.control.run(self) + def main_run(self): + self.futaba.rcu_run(self) + self.control.c_run(self) + timer_10 = threading.Timer(0.005, self.main_run, ) + timer_10.start() # 按间距中的绿色按钮以运行脚本。 if __name__ == '__main__': usv1 = UsvControl() - usv1.run() + usv1.main_run()