Example #1
0
void doFlightControl(int16_t*  IMUData,double*  angle,int16_t*  PPMIn,int16_t*  PPMOut){
	updateYaw(PPMIn[3]*_constants[0][3]/15);
	if (_isEngeinsOnFlag){
		// lets define four control signals:
		// u0 to control the colective 
		// u1 to control the roll
		// u2 to control the pitch
		// u3 to conrol the yaw.
		int16_t u[4];
		u[0] = (PPMIn[2]+145)*_constants[0][0];  //colective
		u[1] = PPMIn[1]*_constants[0][1]+(_constants[1][1]*angle[0]+_constants[2][1]*angle[3]); //roll
		u[2] = PPMIn[0]*_constants[0][2]+(_constants[1][2]*angle[1]+_constants[2][2]*angle[4]); //pitch
		u[3] =                            (_constants[1][3]*angle[2]+_constants[2][3]*angle[5]); //yaw
			
			
			
		setOutputsData(u,20,23);
		////////////////////////////////////////////
		for (int i=0;i<4;i++){
			PPMOut[i] = 0;
			for (int j=0;j<4;j++){
				PPMOut[i] += mixer[j][i]*u[j];
			}
			PPMOut[i] = PPMOut[i]/10;
			SPEED_LIMITER(PPMOut[i]);
		}
	} else {
		for (int i=0;i<4;i++)
			PPMOut[i] = 0;
	}
	setOutputsData(PPMIn,12,15);
	setOutputData(_control,32);
	setOutputData(_isEngeinsOnFlag,33);
}
Example #2
0
void Estimator(int16_t *IMUDataInt,double *angle)
{

	int16_t * imuBiases;
	double IMUData[6];
	imuBiases = GetIMUBiases();
	// subtract the bias from acc and gyro:
	for (int j=0; j<6; j++)
		IMUData[j]=IMUDataInt[j] - imuBiases[j]/20.0;
		
	IMUData[2] +=256; //need to feal the gravity
	
	double accPhi = atan2(IMUData[1],IMUData[2]);
	double accTeta = atan2(IMUData[0],sqrt(IMUData[1]*IMUData[1]+IMUData[2]*IMUData[2]));
	double magPsi = atan2(IMUDataInt[7],-IMUDataInt[6]);

	double p= IMUData[3]*GYRO_FACTOR;
	double q= IMUData[4]*GYRO_FACTOR;
	double r= IMUData[5]*GYRO_FACTOR;
	
	double sinphi  = sin(phi );
	double cosphi  = cos(phi );
	double sinteta = sin(teta);
	double costeta = cos(teta);
	
	double dphi  = (p+((q*sinphi)+(r*cosphi))*(sinteta/costeta) );
	double dteta = -((q*cosphi)-(r*sinphi));
	double dpsi  = -(q*sinphi+r*cosphi)/costeta;
	
	double AccNorm = IMUData[0]*IMUData[0] + IMUData[1]*IMUData[1]+IMUData[2]*IMUData[2];
	double AccFactor = sqrt( (62500.0 - AccNorm)*(62500.0 - AccNorm));
	AccFactor = (AccFactor > 1500) ? 0 : (1500 - AccFactor)/1500;
	
	phi  = (phi + dphi*SYNC_PERIOD)* (1 - AccFactor*0.1) + AccFactor*0.1*accPhi;		// int type
	teta = (teta +dteta*SYNC_PERIOD)*(1 - AccFactor*0.1) + AccFactor*0.1*accTeta;		// int type
	psi  = (psi + dpsi*SYNC_PERIOD)*0.9999 + 0.0001*magPsi; //psi ;								
	
	ANGLELIMITER(phi);
	ANGLELIMITER(teta);
	ANGLELIMITER(psi );
	
	angle[0] = phi;
	angle[1] = teta;
	angle[2] = psi;
	angle[3] = dphi;
	angle[4] = dteta;
	angle[5] = dpsi;

	for(uint8_t i=0;i<3;i++){
		setOutputData((angle[i]*180)/3.14,i+9);
	}
}
int itkFiltersComponentSizeThresholdProcess::updateProcess(medAbstractData* inputData)
{
    dtkSmartPointer<medAbstractData> adjustedInputData = inputData;

    if (std::is_floating_point<typename InputImageType::PixelType>::value)
    {
        adjustedInputData = castToOutputType<InputImageType>(inputData);;
    }

    typename InputImageType::Pointer inputImage = static_cast<InputImageType*>(inputData->data());

    typedef itk::ConnectedComponentImageFilter <InputImageType, OutputImageType> ConnectedComponentFilterType;
    typename ConnectedComponentFilterType::Pointer connectedComponentFilter = ConnectedComponentFilterType::New();
    connectedComponentFilter->SetInput(inputImage);
    connectedComponentFilter->Update();

    // RELABEL COMPONENTS according to their sizes (0:largest(background))
    typedef itk::RelabelComponentImageFilter<OutputImageType, OutputImageType> FilterType;
    typename FilterType::Pointer relabelFilter = FilterType::New();
    relabelFilter->SetInput(connectedComponentFilter->GetOutput());
    relabelFilter->SetMinimumObjectSize(d->minimumSize);
    relabelFilter->Update();

    // BINARY FILTER
    typedef itk::BinaryThresholdImageFilter <OutputImageType, OutputImageType> BinaryThresholdImageFilterType;
    typename BinaryThresholdImageFilterType::Pointer thresholdFilter
            = BinaryThresholdImageFilterType::New();
    thresholdFilter->SetInput(relabelFilter->GetOutput());
    thresholdFilter->SetUpperThreshold(0);
    thresholdFilter->SetInsideValue(0);
    thresholdFilter->SetOutsideValue(1);

    thresholdFilter->Update();

    itk::CStyleCommand::Pointer callback = itk::CStyleCommand::New();
    callback->SetClientData ( ( void * ) this );
    callback->SetCallback ( itkFiltersProcessBase::eventCallback );
    connectedComponentFilter->AddObserver ( itk::ProgressEvent(), callback );

    setOutputData(medAbstractDataFactory::instance()->createSmartPointer(medUtilitiesITK::itkDataImageId<OutputImageType>()));
    getOutputData()->setData ( thresholdFilter->GetOutput() );

    QString newSeriesDescription = "connectedComponent " + QString::number(d->minimumSize);
    medUtilities::setDerivedMetaData(getOutputData(), inputData, newSeriesDescription);

    return DTK_SUCCEED;
}
Example #4
0
void Estimator2(int16_t *IMUDataInt,double *angle)
{

	int16_t * imuBiases;
	int16_t IMUData[6];
	imuBiases = GetIMUBiases();
	// subtract the bias from acc and gyro:
	for (int j=0; j<6; j++)
		IMUData[j]=IMUDataInt[j] - imuBiases[j]/20.0;
		
	IMUData[2] +=256; //need to feal the gravity
	
	int16_t accPhi = fixATan2(IMUData[1],IMUData[2]);
	int16_t accTeta = fixATan2(IMUData[0],intSqrt((int32_t)IMUData[1]*IMUData[1]+(int32_t)IMUData[2]*IMUData[2]));

	
	angle[0] = accPhi;
	angle[1] = accTeta;

	for(uint8_t i=0;i<2;i++){
		setOutputData(angle[i]*180 / PI,i+9);
	}
}