Example #1
0
int ctl_Init(char *client_addr) 
{
	int rc;
       
	//----- Initialize PID controller -----//
	//some saturation for controller
	setpoint.pitch_roll_max=DEG2RAD(10); //degrees      
  	setpoint.throttle_min=0.05;//0.5
  	setpoint.throttle_max=0.95; //0.85
  			
	//init pid pitch/roll //Kp, Ki, Kd, imax
	pid_Init(&pid_roll,  0.33,0.0,0.25,1); //[0.35 0.25] with additional part [0.33 0.25] without ...
	pid_Init(&pid_pitch, 0.33,0.0,0.25,1);
  	throttle=0.000;

	//----- Initialize AHRS system -----// 
  	printf("Initialize Attitude.. \n");
	//rc = att_Init(&att);
	//if(rc) return rc;
	if(navdata_init()) printf("navdata initialized\n");
	navdata_flattrim(&ahrsdata);
	//printf("bias_after:%f\t%f\t%f\n",gyros_offset[0],gyros_offset[1],gyros_offset[2]);
        sleep(1);


	//----- Initialize UDP -----//
  	// Udp logger
  	printf("client\n");
  	udpClient_Init(&udpNavLog, "192.168.43.176", 9930); // Update the IP of ground station to send data
	//udpClient_Init(&udpNavLog, "192.168.1.4", 9930);
  	//navLog_Send();
  	printf("udpClient_Init\n", rc);
  
	//----- Start motor thread -----//
	printf("Initialize motor\n");
	rc = mot_Init();
	if(rc) return rc;
  
	//----- Start ctl thread -----//
	printf("Initialize ctl_thread_main\n"); 
	rc = pthread_create(&ctl_thread, NULL, ctl_thread_main, NULL); 
	if(rc) {
		printf("ctl_Init: Return code from pthread_create(mot_thread) is %d\n", rc);
		return 202;
	}
	else printf("rc = %d\n", rc);


}
Example #2
0
/**
  * \brief Start navdata thread
  * \return 0 if success, -1 if error
  */
int navdata_connect()
{
	if (!stopped_navdata)
		return -1;

	addr_drone_navdata.sin_family      = AF_INET;
	addr_drone_navdata.sin_addr.s_addr = inet_addr(WIFI_ARDRONE_IP);
	addr_drone_navdata.sin_port        = htons(PORT_NAVDATA);

	addr_client_navdata.sin_family      = AF_INET;
	addr_client_navdata.sin_addr.s_addr = htonl(INADDR_ANY);
	addr_client_navdata.sin_port        = htons(PORT_NAVDATA);

	sock_navdata = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

	if (sock_navdata < 0) {
		fprintf(stderr, "[~][navdata] Can't establish socket \n");
		return -1;
	}

	if (bind(sock_navdata, (struct sockaddr*)&addr_client_navdata, sizeof(addr_client_navdata)) < 0) {
		fprintf(stderr, "[~][navdata] Can't bind socket to port %d\n", PORT_NAVDATA);
		return -1;
	}

	nav_channel = jakopter_com_add_channel(CHANNEL_NAVDATA, sizeof(data));

	if (navdata_init() < 0) {
		perror("[~][navdata] Init sequence failed");
		return -1;
	}

	pthread_mutex_lock(&mutex_stopped);
	stopped_navdata = false;
	pthread_mutex_unlock(&mutex_stopped);

	if(pthread_create(&navdata_thread, NULL, navdata_routine, NULL) < 0) {
		perror("[~][navdata] Can't create thread");
		return -1;
	}

	return 0;
}
Example #3
0
void imu_impl_init(void) {
  navdata_init();
}
Example #4
0
void navdata_update()
{
  static bool_t last_checksum_wrong = FALSE;
  // Check if initialized
  if (!nav_port.isInitialized) {
    navdata_init();
    return;
  }

  // Start reading
  navdata_read();

  // while there is something interesting to do...
  while (nav_port.bytesRead >= NAVDATA_PACKET_SIZE)
  {
    if (nav_port.buffer[0] == NAVDATA_START_BYTE)
    {
      assert(sizeof navdata == NAVDATA_PACKET_SIZE);
      memcpy(&navdata, nav_port.buffer, NAVDATA_PACKET_SIZE);

      // Calculating the checksum
      uint16_t checksum = 0;
      for(int i = 2; i < NAVDATA_PACKET_SIZE-2; i += 2) {
        checksum += nav_port.buffer[i] + (nav_port.buffer[i+1] << 8);
      }

      // When checksum is incorrect
      if(navdata.chksum != checksum) {
        printf("Checksum error [calculated: %d] [packet: %d] [diff: %d]\n",checksum , navdata.chksum, checksum-navdata.chksum);
        nav_port.checksum_errors++;
      }

      // When we already dropped a packet or checksum is correct
      if(last_checksum_wrong || navdata.chksum == checksum) {
        // Invert byte order so that TELEMETRY works better
        uint8_t tmp;
        uint8_t* p = (uint8_t*) &(navdata.pressure);
        tmp = p[0];
        p[0] = p[1];
        p[1] = tmp;
        p = (uint8_t*) &(navdata.temperature_pressure);
        tmp = p[0];
        p[0] = p[1];
        p[1] = tmp;

        baro_update_logic();

#ifdef USE_SONAR
        if (navdata.ultrasound < 10000)
        {
            sonar_meas = navdata.ultrasound;
            ins_update_sonar();

        }
#endif


        navdata_imu_available = TRUE;
        last_checksum_wrong = FALSE;
        nav_port.packetsRead++;
      }

      // Crop the buffer
      navdata_cropbuffer(NAVDATA_PACKET_SIZE);
    }
    else
    {
      // find start byte, copy all data from startbyte to buffer origin, update bytesread
      uint8_t * pint;
      pint = memchr(nav_port.buffer, NAVDATA_START_BYTE, nav_port.bytesRead);

      if (pint != NULL) {
        navdata_cropbuffer(pint - nav_port.buffer);
      } else {
        // if the start byte was not found, it means there is junk in the buffer
        nav_port.bytesRead = 0;
      }
    }
  }
}