parent
5f98f0d582
commit
794aed33dd
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
29
control.py
29
control.py
|
@ -1,13 +1,26 @@
|
||||||
import struct
|
|
||||||
from remote_control_unit import RemoteControlUnit
|
|
||||||
|
|
||||||
|
|
||||||
class Control:
|
class Control:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.mode = ['lock', 'manual']
|
self.mode = ['lock', 'manual', 'line']
|
||||||
self.data = {'mode': self.mode[1], 'thrust': 0, 'rudder': 0, }
|
self.data = {'mode': 'lock', 'thrust': 0, 'rudder': 0, }
|
||||||
|
|
||||||
def run(self, usv):
|
def c_run(self, usv):
|
||||||
if self.data['mode'] == self.mode[1]:
|
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['rudder'] = int(1.4881 * (usv.futaba.receive_data['channel1'] - 1024))
|
||||||
self.data['thrust'] = int(-1.4881 * (usv.futaba.receive_data['channel3'] - 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]
|
||||||
|
|
|
@ -16,12 +16,24 @@ class RemoteControlUnit:
|
||||||
self.buffer = []
|
self.buffer = []
|
||||||
self.packet = array.array('B')
|
self.packet = array.array('B')
|
||||||
|
|
||||||
def run(self, usv):
|
def rcu_run(self, usv):
|
||||||
self.buffer += self.sbus.read()
|
self.decode()
|
||||||
self.decode(usv)
|
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:
|
while len(self.buffer) >= 25:
|
||||||
if self.buffer[0] != 0x0f:
|
if self.buffer[0] != 0x0f:
|
||||||
del self.buffer[0]
|
del self.buffer[0]
|
||||||
|
@ -56,16 +68,6 @@ class RemoteControlUnit:
|
||||||
self.receive_data['flag'] = self.buffer[23]
|
self.receive_data['flag'] = self.buffer[23]
|
||||||
|
|
||||||
del self.buffer[:25]
|
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
|
break
|
||||||
|
|
||||||
def encode(self):
|
def encode(self):
|
||||||
|
|
15
usv.py
15
usv.py
|
@ -1,3 +1,5 @@
|
||||||
|
import threading
|
||||||
|
|
||||||
from remote_control_unit import RemoteControlUnit
|
from remote_control_unit import RemoteControlUnit
|
||||||
from control import Control
|
from control import Control
|
||||||
from settings import Settings
|
from settings import Settings
|
||||||
|
@ -8,16 +10,17 @@ class UsvControl:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.settings = Settings()
|
self.settings = Settings()
|
||||||
self.futaba = RemoteControlUnit(self.settings.sbus_com)
|
self.futaba = RemoteControlUnit(self.settings.sbus_com, )
|
||||||
self.control = Control()
|
self.control = Control()
|
||||||
|
|
||||||
def run(self):
|
def main_run(self):
|
||||||
while True:
|
self.futaba.rcu_run(self)
|
||||||
self.futaba.run(self)
|
self.control.c_run(self)
|
||||||
self.control.run(self)
|
timer_10 = threading.Timer(0.005, self.main_run, )
|
||||||
|
timer_10.start()
|
||||||
|
|
||||||
|
|
||||||
# 按间距中的绿色按钮以运行脚本。
|
# 按间距中的绿色按钮以运行脚本。
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
usv1 = UsvControl()
|
usv1 = UsvControl()
|
||||||
usv1.run()
|
usv1.main_run()
|
||||||
|
|
Loading…
Reference in New Issue