Arquivos
2013-10-02 23:33:52 +01:00

135 linhas
3.3 KiB
JavaScript

var express = require('express')
, app = express()
, server = require('http').createServer(app)
app.use(express.static(__dirname + '/public'));
app.use(app.router);
app.get('/', function(req, res) {
res.sendfile(__dirname + '/index.html');
});
app.get('/phone', function(req, res) {
res.sendfile(__dirname + '/phone.html');
});
server.listen(8080);
require("dronestream").listen(server);
var io = require('socket.io').listen(server)
io.set('destroy upgrade', false)
io.sockets.on('connection', function(socket) {
console.log('connection')
socket.on('control', function(ev) {
console.log('[control]', JSON.stringify(ev));
if(ev.action == 'animate'){
client.animate(ev.animation, ev.duration)
} else {
client[ev.action].call(client, ev.speed);
}
})
socket.on('takeoff', function(data){
console.log('takeoff', data)
client.takeoff()
})
socket.on('land', function(data){
console.log('land', data)
client.land()
})
socket.on('reset', function(data){
console.log('reset', data)
client.disableEmergency()
})
socket.on('phone', function(data){
console.log('phone', data)
targetLat = data.lat
targetLon = data.lon
phoneAccuracy = data.accuracy
})
socket.on('stop', function(data){
stop()
})
setInterval(function(){
io.sockets.emit('drone', {lat: currentLat, lon: currentLon, yaw: currentYaw, distance: currentDistance, battery: battery})
io.sockets.emit('phone', {lat: targetLat, lon: targetLon, accuracy: phoneAccuracy})
},1000)
});
var arDrone = require('ar-drone');
var PID = require('./PID');
var vincenty = require('node-vincenty');
var yawPID = new PID(1.0, 0, 0.30);
var client = arDrone.createClient();
client.config('general:navdata_demo', 'FALSE');
var targetLat, targetLon, targetYaw, cyaw, currentLat, currentLon,currentDistance, currentYaw, phoneAccuracy;
var battery = 0;
var stop = function(){
console.log('stop', data)
targetYaw = null
targetLat = null
targetLon = null
client.stop()
}
var handleNavData = function(data){
if ( data.demo == null || data.gps == null) return;
battery = data.demo.batteryPercentage
currentLat = data.gps.latitude
currentLon = data.gps.longitude
currentYaw = data.demo.rotation.yaw;
if (targetLat == null || targetLon == null || currentYaw == null || currentLat == null || currentLon == null) return;
var bearing = vincenty.distVincenty(currentLat, currentLon, targetLat, targetLon)
if(bearing.distance > 1){
currentDistance = bearing.distance
console.log('distance', bearing.distance)
console.log('bearing:', bearing.initialBearing)
targetYaw = bearing.initialBearing
console.log('currentYaw:', currentYaw);
var eyaw = targetYaw - currentYaw;
console.log('eyaw:', eyaw);
var uyaw = yawPID.getCommand(eyaw);
console.log('uyaw:', uyaw);
var cyaw = within(uyaw, -1, 1);
console.log('cyaw:', cyaw);
client.clockwise(cyaw)
client.front(0.05)
} else {
targetYaw = null
io.sockets.emit('waypointReached', {lat: targetLat, lon: targetLon})
console.log('Reached ', targetLat, targetLon)
stop()
}
}
client.on('navdata', handleNavData);
function within(x, min, max) {
if (x < min) {
return min;
} else if (x > max) {
return max;
} else {
return x;
}
}