#include "wifi_sensor_emulator.hpp" int main (int argc, char *argv

Anuncio
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
#include "wifi_sensor_emulator.hpp"
int main (int argc, char *argv[])
{
ros::init(argc,argv,"wifi_sensor_emulator");
wifi mi_wifi;
while (ros::ok())
{
ros::spinOnce();
mi_wifi.publicadora();
}
return 0;
}
wifi::wifi()
{
std::string ficheros;
double a;
n_robot=0;
ros::NodeHandle manejador_priv("~");
if(manejador_priv.hasParam("high"))
manejador_priv.getParam("high",a);
else
a = 100.0;
high=(float) a;
manejador_priv.getParam("weigh",a);
weigh=(float) a;
manejador_priv.getParam("resolution",a);
resolution=(float) a;
n=high/resolution;
m=weigh/resolution;
char *ptr;
char frase[2500];
manejador_priv.getParam("ficheros",ficheros);
strcpy(frase,ficheros.c_str());
ptr=strtok(frase," ");
while(ptr != NULL)
{
std::string fichero_a_leer(ptr);
if(cargar_fichero(fichero_a_leer))
{
//mensaje de error al leer el fichero
}
ptr = strtok(NULL, " ");
}
-1-
domingo, 20 de septiembre de 2015 17:41
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
domingo, 20 de septiembre de 2015 17:41
for(int i=0; i<red_wifi.size(); i++)
{
std::string aux4=red_wifi[i];
for(int j=0; j<m ; j++)
{
for(int k=0; k<n ; k++)
{
if(all_RssiMap[aux4].n_medidas[j][k] != 0)
{
all_RssiMap[aux4].level[j][k]=all_RssiMap[aux4].level[j][k]/all_RssiMap[
aux4].n_medidas[j][k];
all_RssiMap[aux4].varianza[j][k]=sqrt(all_RssiMap[aux4].varianza[j][k]/
all_RssiMap[aux4].n_medidas[j][k]);
}
}
}
}
flooding();
numero_robot=manejador.subscribe("/namespaces",1, &wifi::cuantosrobots,this);
}
bool wifi::cargar_fichero(std::string nombre_fichero)
{
std::ifstream input(nombre_fichero.c_str());
float clock, pose_age, x, y, z, roll, pitch, yaw;
std::string sensor_id, mac, essid, line;
int level, quality, existe;
std::vector <int> aux;
std::vector <float> aux2;
std::vector <float> aux3;
for(int i=0;i<n;i++)
{
aux.push_back(0);
aux2.push_back(100);
aux3.push_back(0);
}
for(int i=1; i<=8 ; i++)
{
getline(input,line);
}
while(!input.eof())
{
existe=0;
input >> clock >> pose_age >> x >> y >> z >> roll >> pitch >> yaw >> sensor_id >> mac
>> essid >> level >> quality;
for(int a=0; a<red_wifi.size(); a++)
{
if(mac==red_wifi[a])
{
-2-
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
domingo, 20 de septiembre de 2015 17:41
existe=1;
}
}
if(existe==0)
{
red_wifi.push_back(mac);
mac_essid[mac]=essid;
for(int a=0;a<m;a++)
{
all_RssiMap[mac].resolution=resolution;
all_RssiMap[mac].n_medidas.push_back(aux);
all_RssiMap[mac].level.push_back(aux2);
all_RssiMap[mac].varianza.push_back(aux3);
}
}
int i = (x+weigh/2)/resolution;
int j = (-y+high/2)/resolution;
if(i>=0 && i<weigh/resolution-1 && j>=0 && j<high/resolution-1)
{
all_RssiMap[mac].level[i][j] = all_RssiMap[mac].level[i][j] + level;
all_RssiMap[mac].varianza[i][j] = all_RssiMap[mac].varianza[i][j]+level*level;
all_RssiMap[mac].n_medidas[i][j]++;
}
}
return true;
}
void wifi::flooding()
{
std::vector <std::vector <float> > flood;
for(int i=0; i<m; i++)
{
flood.push_back(std::vector <float>(n));
}
float numerador, denominador;
for(int p=0; p<red_wifi.size(); p++)
{
std::string aux4=red_wifi[p];
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
numerador=0.0;
denominador=0.0;
for(int k=-1; k<=1; k++)
{
for(int b=-1; b<=1; b++)
{
if(i+k>=0 && i+k<m && j+b>=0 && j+b<n)
{
if(all_RssiMap[aux4].level[i+k][j+b] != EMPTY)
{
-3-
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
domingo, 20 de septiembre de 2015 17:41
numerador=numerador+all_RssiMap[aux4].level[i+k][j+b]*
all_RssiMap[aux4].n_medidas[i+k][j+b];
denominador=denominador+all_RssiMap[aux4].n_medidas[i+k][j+b];
}
}
}
}
if(numerador!=0 && denominador!=0)
{
flood[i][j]=numerador/denominador;
}
}
}
for(int i=0; i<m ; i++)
{
for(int j=0; j<n ; j++)
{
if(flood[i][j]!=0)
all_RssiMap[aux4].level[i][j]=flood[i][j];
}
}
}
}
void wifi::publicadora()
{
wifi_sensor::WifiScan msg;
for(int i=0;i<sensores.size();i++)
{
sensores[i].actualiza();
for(int j=0; j<red_wifi.size(); j++)
{
std::string aux4=red_wifi[j];
msg.essid.clear();
msg.level.clear();
msg.mac.clear();
msg.mac.push_back(aux4);
msg.essid.push_back(mac_essid[aux4]);
if(!sensores[i].datos.level.empty())
{
msg.level.push_back(sensores[i].datos.level[j]);
if(sensores[i].datos.level[j] != EMPTY)
{
sensores[i].publica_wifi.publish(msg);
}
}
}
}
}
void wifi::cuantosrobots(const multirobot_simulator_nes::robotsNamespaces nombres)
{
if (!sensores.empty())
-4-
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
domingo, 20 de septiembre de 2015 17:41
{
if(nombres.NRobots != n_robot)
{
sensores.clear();
sensores.reserve(nombres.NRobots);
for (unsigned i=0; i<nombres.NRobots; i++)
{
sensores.push_back(sensor_wifi(nombres.Namespace[i],&all_RssiMap,red_wifi,
weigh,high));
sensores[i].posicion=sensores[i].manejador.subscribe(nombres.Namespace[i]+
"base_pose_ground_truth",1000, &sensor_wifi::posiciones,&sensores[i]);
}
}
}
else
{
sensores.reserve(nombres.NRobots);
for (unsigned i=0; i<nombres.NRobots; i++)
{
sensores.push_back(sensor_wifi(nombres.Namespace[i],&all_RssiMap,red_wifi,weigh,
high));
sensores[i].posicion=sensores[i].manejador.subscribe(nombres.Namespace[i]+
"base_pose_ground_truth",1000, &sensor_wifi::posiciones,&sensores[i]);
}
}
}
sensor_wifi::sensor_wifi(const std::string nombre,std::map <std::string, RssiMap> *
map_recibed,std::vector <std::string> redes, float w, float h)
{
all_RssiMap=map_recibed;
red_wifi=redes;
std::string aux4=red_wifi[0];
high=h;
weigh=w;
int resolution=(*all_RssiMap)[aux4].resolution;
int n=high/resolution;
int m=weigh/resolution;
publica_wifi=manejador.advertise<wifi_sensor::WifiScan>(nombre+"wifi",1,true);
}
void sensor_wifi::posiciones(const nav_msgs::OdometryConstPtr& msj_posicion)
{
datos.z=msj_posicion->pose.pose.position.z;
probando(msj_posicion->pose.pose.position.x,msj_posicion->pose.pose.position.y);
}
void sensor_wifi::probando(float x, float y)
{
datos.x=x;
datos.y=y;
}
void sensor_wifi::actualiza()
{
-5-
C:\Users\Jaime\Desktop\Proyecto\tfg\src\multirobot_simulator_nes\src\wifi_sensor_emulator\wifi_sensor_emulator.cpp
std::string aux4=red_wifi[0];
int i=(datos.x+weigh/2)/(*all_RssiMap)[aux4].resolution;
int j=(-datos.y+high/2)/(*all_RssiMap)[aux4].resolution;
if(i>0 && i<weigh-1 && j>0 && j<high-1)
{
datos.level.clear();
for(int p=0; p<red_wifi.size(); p++)
{
aux4=red_wifi[p];
datos.level.push_back((*all_RssiMap)[aux4].level[i][j]);
}
}
}
-6-
domingo, 20 de septiembre de 2015 17:41
Descargar