Esta é uma breve história da criação de um robô autônomo subaquático por um gerente muito intermediário. O objetivo atual é criar um mapa atualizado do fairway do rio Moscou. Ao pesquisar, não há problemas em encontrar esse mapa , mas sua relevância levanta a questão. O leito do rio está mudando constantemente. A erosão das margens do rio ocorre e o mapa do canal muda. Esses processos são especialmente visíveis, dada a nutrição da neve do rio Moscou (61%), do solo (27%) e da chuva (12%). O objetivo final é criar um robô subaquático multifuncional para o estudo do fundo do mar. Os oceanos, cobrindo 2/3 da superfície da Terra, são estudados apenas 5%. Para criar um robô autônomo, você precisa de um simples "piloto automático".Como fazer um piloto automático acessível e fácil para projetos de bricolage e navegar ao longo do rio Moscou?
O rio Moscou é a principal via navegável da cidade de Moscou, o comprimento dentro da cidade é de 80 km. A largura do rio dentro da cidade varia de 120 a 200 m, da parte mais estreita perto do Kremlin à mais larga perto de Luzhniki. É geralmente aceito que a vazão do rio é de 0,5 m / s. Condições bastante favoráveis para testar o robô.Pode ser mais eficiente e fácil criar um barco, mas a tarefa de criar um robô subaquático parece muito mais interessante.Construção civil
Submarino robô para explorar as águas do rio Moscou.
A disposição aproximada dos elementos que eu vi da seguinte maneira.
Instalando o motor coletor
Direção
servo-acionada Profundidade da direção servo-acionada
Como brincadeira, posso dizer que estou me preparando para a competição do X-Prize .Resta economizar US $ 2000. :)
The registration deadline is 30 June, 2016 (11:59 PM UTC/4:59 PM PST). The registration fee is $2,000.00 USD.
O objetivo é desenvolver um robô subaquático autônomo, não ROV . (Veículo subaquático operado remotamente).A parte eletrônica não se distingue pela complexidade e qualidade de construção doArduino nano + L293D + Bluetooth + 3 servo + banco de potência (Agradecimentos especiais à loja online que a vendeu por 3 centavos). Conectado separadamente ao banco de potência do smartphone Samsung Galaxy S3 para manter a carga. O smartphone se comunica com o Arduino via Bluetooth.Software de Gerenciamento
“Estamos alcançando nosso destino no caminho que escolhemos deixar dele”
Jean de LafontaineEu sempre tentei evitar a programação no Android. Quando se tornou possível desenvolver um aplicativo leve, com a capacidade de conhecer o Android em ação, eu cedi.Mas chegou a hora! De fato, pare de desperdiçar dinheiro em placas de identificação para o Arduino. Tudo que você precisa já está em seus smartphones antigos. Na mão estava o Samsung Galaxy S3 e um pouco de mágica.Como um nerd decente, fiz uma pergunta na torradeira . Talvez eu tenha perguntado muito. Talvez seja uma pergunta mal formulada. E parecia mais provável que isso não fosse uma pergunta. Mas, em resposta, não recebi o que esperava.Yandex para mim na baía! Todos os pedidos "GPS Android", "Programação GPS Android" e assim por diante deram respostas que definitivamente não funcionaram no Android Studio.Que alívio para mim foi encontrar o SL4A. Acontece que você pode criar protótipos e programar no Android usando Python. Afinal, eles controlam até foguetes .SL4A Python
Se você tem um telefone Android, mas você tem um. Você é um nerd, não um fã de frutas açucaradas.Instalamos a opção de um programa para reconhecer códigos QR .Para usar o SL4A, você deve instalar o aplicativo no seu telefone.
O intérprete Python está aqui.
Ou QPython3É possível escrever programas no telefone, mas você não pode chamá-lo de divertido.Existe uma saída:
http://habrahabr.ru/post/134184/, 9999 Android- (, 46136):
$ adb forward tcp:9999 tcp:46136
:
$ AP_PORT=9999
android.py Python', , , , . helloWorld Android- Python:
>>>import android
>>>droid = android.Android()
>>>droid.makeToast(«Hello, world!»)
android, droid, API Android'a. «Hello, World!» .
, API, SL4A.
Construindo um caminho. Seleção de ponto
Usando Yandex.maps ou Google.maps, selecione pontos no centro do rio. Esta é uma rota difícil. Para testes e configuração, uso uma versão truncada dos pontos.[55.671110, 37.686625], [55.668448, 37.675467], [55.660847, 37.671776], [55.654649, 37.671175]Como criar um piloto automático fácil e acessível para projetos de bricolage a partir de um telefone andóide e 70 linhas de código?

Código do piloto automáticoimport math,android,time
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)
def getgps():
locs = droid.getLastKnownLocation()
gpspos = locs.result["gps"]
return gpspos
def distazim(llat1,llong1,llat2,llong2):
rad=6372795
lat1=llat1*math.pi/180.
lat2=llat2*math.pi/180.
long1=llong1*math.pi/180.
long2=llong2*math.pi/180.
cl1=math.cos(lat1)
cl2=math.cos(lat2)
sl1=math.sin(lat1)
sl2=math.sin(lat2)
delta=long2-long1
cdelta=math.cos(delta)
sdelta=math.sin(delta)
y=math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2))
x=sl1*sl2+cl1*cl2*cdelta
ad=math.atan2(y,x)
dist=ad*rad
x=(cl1*sl2)-(sl1*cl2*cdelta)
y=sdelta*cl2
z=math.degrees(math.atan(-y/x))
if(x<0):
z=z+180.
z2=(z+180.)%360.-180.
z2=-math.radians(z2)
anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
angledeg=(anglerad2*180.)/math.pi
return [dist,angledeg]
def servoangle(azdiff):
if azdiff>10 or azdiff<-10:
deg=azdiff
if deg>90:
deg=90
if deg<-90:
deg=-90
return deg
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]
for c in range(len(coordmas)):
curcoord=coordmas[c]
targetlat=curcoord[0]
targetlon=curcoord[1]
darange=11;
while darange>10:
gpspos=getgps()
curlat = gpspos["latitude"]
curlon = gpspos["longitude"]
time.sleep(0.5)
da=distazim(curlat,curlon,targetlat,targetlon)
darange = da[0]
dazimut = round(da[1])
pol=droid.sensorsReadOrientation()
pol2=pol.result
turn = round(pol2[0])
turn = (-turn) *180/ 3.2
azdiff=turn-dazimut
deg=servoangle(azdiff)
oldlat = curlat
oldlon = curlon
Código com comentáriosimport math,android,time
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)
def getgps():
locs = droid.getLastKnownLocation()
gpspos = locs.result["gps"]
return gpspos
def distazim(llat1,llong1,llat2,llong2):
rad=6372795
lat1=llat1*math.pi/180.
lat2=llat2*math.pi/180.
long1=llong1*math.pi/180.
long2=llong2*math.pi/180.
cl1=math.cos(lat1)
cl2=math.cos(lat2)
sl1=math.sin(lat1)
sl2=math.sin(lat2)
delta=long2-long1
cdelta=math.cos(delta)
sdelta=math.sin(delta)
y=math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2))
x=sl1*sl2+cl1*cl2*cdelta
ad=math.atan2(y,x)
dist=ad*rad
x=(cl1*sl2)-(sl1*cl2*cdelta)
y=sdelta*cl2
z=math.degrees(math.atan(-y/x))
if(x<0):
z=z+180.
z2=(z+180.)%360.-180.
z2=-math.radians(z2)
anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
angledeg=(anglerad2*180.)/math.pi
return [dist,angledeg]
def servoangle(azdiff):
if azdiff>10 or azdiff<-10:
deg=azdiff
if deg>90:
deg=90
if deg<-90:
deg=-90
return deg
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]
for c in range(len(coordmas)):
curcoord=coordmas[c]
targetlat=curcoord[0]
targetlon=curcoord[1]
darange=11;
while darange>10:
gpspos=getgps()
curlat = gpspos["latitude"]
curlon = gpspos["longitude"]
time.sleep(0.5)
da=distazim(curlat,curlon,targetlat,targetlon)
darange = da[0]
dazimut = round(da[1])
pol=droid.sensorsReadOrientation()
pol2=pol.result
turn = round(pol2[0])
turn = (-turn) *180/ 3.2
azdiff=turn-dazimut
deg=servoangle(azdiff)
oldlat = curlat
oldlon = curlon
Python para Android. Recursos que estou procurando há muito tempo:
droid.batteryStartMonitoring() — o .
droid.batteryStopMonitoring()
droid.batteryGetHealth() — (1-, 2-, 3 — , 4 — , 5 — , 6 — )
droid.batteryGetStatus() — (1 — , 2 — , 3 — , 4 — , 5 — )
droid.batteryGetTechnology()
droid.readBatteryData() — .
droid.batteryGetTemperature()
droid.batteryGetVoltage()
droid.batteryGetLevel()
Bluetooth:
droid.checkBluetoothState() — Bluetooth
droid.toggleBluetoothState() — True , False
droid.bluetoothAccept() —
droid.bluetoothActiveConnections() — ,
droid.bluetoothGetConnectedDeviceName()
droid.bluetoothMakeDiscoverable() —
droid.bluetoothStop()
Wi-Fi:
droid.checkWifiState() — Wi-Fi
droid.toggleWifiState() — True , False
droid.wifiStartScan()
droid.wifiGetScanResults()
droid.wifiGetConnectionInfo()
:
droid.checkAirplaneMode() — « »
droid.checkRingerSilentMode() —
droid.checkScreenOn() —
droid.toggleRingerSilentMode() —
droid.toggleAirplaneMode()
droid.toggleVibrateMode()
:
droid.getMaxMediaVolume()
droid.getMaxRingerVolume()
droid.getMediaVolume()
droid.getRingerVolume()
droid.getScreenBrightness()
droid.getScreenTimeout()
droid.getVibrateMode()
:
droid.setMediaVolume()
droid.setRingerVolume()
droid.setScreenBrightness()
droid.setScreenTimeOut()
Os planos:- Configure o envio de dados Bluetooth para o arduino.
- Obtendo dados detalhados do arduino. Vou medir a profundidade com um sensor ultrassônico.
- Enviar dados sobre a posição atual e medições de profundidade para o servidor.
- . , . .
- , ,
PS: Por que eu decidi escrever um post antes do lançamento do robô? Eu quero encontrar pessoas com a mesma opinião. Se você deseja, faça seu robô. Uma ótima ocasião para se reunir nas férias de maio para um passeio aquático no rio Moscou em robôs! Para todas as perguntas que você pode me escrever VK . Repost, talvez um de seus amigos queira participar da maratona aquática.Deixe-me lembrá-lo: oconcurso de cortadores de grama robóticos será realizado em Skolkovo em 3 de junho. Todos podem tentar a robótica. Após os resultados da competição, queremos selecionar uma equipe para uma startup. Faremos o primeiro triturador de robôs comercial russo. Prêmios e brindes valiosos para todos os participantes.