void random_test_cmd(bool &is_init)
{
	cmd_agency_data_t cmd;
	cmd.cmd_data = (unsigned char)(random()%22);
	cmd.cmd_sequence = (unsigned char)(random()%5 +1);
	if(int(random()%2) == 0)
	{
		App_Send_Data(2, 1, MY_CTRL_CMD_SET, API_CMD_REQUEST, (unsigned char*)&cmd, sizeof(cmd), random_test_ack_cmd_callback, 500, 10);
	}
	else
	{
		unsigned char req_status = cmd.cmd_sequence;
		App_Send_Data(2, 1, MY_CTRL_CMD_SET, API_CMD_STATUS_REQUEST, (unsigned char*)&req_status, sizeof(req_status),random_test_ack_cmd_callback, 500, 10);
	}
}
/*
 * @Function:   Send Contrl Command by UART
 * @Input:
 * @Output:
*/
static int Control_Cmd_Send(void)
{
    api_ctrl_without_sensor_data_t send_data;
    memset(&send_data, 0, sizeof(send_data));

#ifdef XY_SPEED_YAW_RATE
    send_data.ctrl_flag     = 0x4b;	//Vetical:velocity Horizon:velocity Yaw:angular rate
#endif

#ifdef XY_SPEED_YAW_ANGLE
    send_data.ctrl_flag 	= 0x43;	//veti_velo hori_velo yaw_angle
#endif

#ifdef XY_POS_YAW_ANGLE
    send_data.ctrl_flag 	= 0x83; //veti_velo hori_posi yaw_angle
#endif

#ifdef XY_ATTI_YAW_RATE
    send_data.ctrl_flag     = 0x0b;
#endif

    send_data.roll_or_x     = drone_ctrl_data.x;
    send_data.pitch_or_y    = drone_ctrl_data.y;
    send_data.thr_z         = drone_ctrl_data.z;
    send_data.yaw           = drone_ctrl_data.w;

    App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (unsigned char*)&send_data, sizeof(send_data), NULL, 0, 0);

	return 0;
}
예제 #3
0
    void set_velocity(dji_sdk::velocity msg)
    {

        api_ctrl_without_sensor_data_t send_data = {0};

        send_data.ctrl_flag = 68; // mode 4
        send_data.roll_or_x = msg.velx;
        send_data.pitch_or_y = msg.vely;
        send_data.thr_z = msg.velz; //m/s
        send_data.yaw = gimbal::gimbal_yaw_control_sp;

        App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (uint8_t *) &send_data, sizeof(send_data), NULL, 0, 0);
    }
void DJI_Onboard_API_Control(unsigned char arg)
{
	unsigned char send_data = arg;
	if(arg == 1 || arg == 0)
	{
	}
	else
	{
		printf("Parameter [ERROR]\n");
	}
	App_Send_Data(1,1,MY_CTRL_CMD_SET,API_OPEN_SERIAL,(unsigned char*)&send_data,
					sizeof(send_data),sdk_ack_nav_open_close_callback,1000,0);
}
void DJI_Onboard_API_Ctr(unsigned char flagmode,unsigned int n,float a,float b,float c,float d)
{
			api_ctrl_without_sensor_data_t send_data={0};
			unsigned char j;
      send_data.ctrl_flag = flagmode;
			send_data.roll_or_x = a;
			send_data.pitch_or_y = b;
			send_data.thr_z = c; //m/s
			send_data.yaw = d;
      for (j=0;j<n;j++)
		{ 
			App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (unsigned char*)&send_data, sizeof(send_data));
			delay(1);
		}
}
void DJI_Onboard_API_Ctr_drawcircle(void)
{
	api_ctrl_without_sensor_data_t send_data={0};
  unsigned int j;
     for(j=0;j<3000;j++)
    {
			send_data.ctrl_flag = 0x50;
			send_data.roll_or_x = 1*cos(C_PI*0.002*j);
			send_data.pitch_or_y = 1*sin(C_PI*0.002*j);
			send_data.thr_z = 10; //m/s
			send_data.yaw = 0;
			App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (unsigned char*)&send_data, sizeof(send_data));
			delay(1);
		}
}
//send data to ground
void send_data_air2ground(uav_data_to_ground data)
{
    uint8_t *pbuf = NULL;
    //float temp[5];

    data.x = data.x / 640.0;
    data.y = data.y / 360.0;
    data.w = data.w / 640.0;
    data.h = data.h / 360.0;


    int len = sizeof(data);
    pbuf = (uint8_t*)(&data);
    std::cout<<"send bytes to ground : "<<len<<std::endl;
    App_Send_Data(0, 0, 0x00, 0xfe, pbuf, len, NULL, 0, 1);
}
//send data to ground
void send_data_air2ground_test(int* data)//uav_data_to_ground
{
    uint8_t *pbuf = NULL;
    float temp[5];

    temp[0] = data[0] / 640.0;
    temp[1] = data[1] / 360.0;
    temp[2] = data[2] / 640.0;
    temp[3] = data[3] / 360.0;
    temp[4] = data[4];

    int len = sizeof(temp);
    pbuf = (uint8_t*)temp;
    std::cout<<"send bytes to ground : "<<len<<std::endl;
    App_Send_Data(0, 0, 0x00, 0xfe, pbuf, len, NULL, 0, 1);
}
예제 #9
0
    void fly_to_localpos(dji_sdk::local_position los,
                         bool use_height
    )
    {
        //TODO: ALT and HEIGHT
        api_ctrl_without_sensor_data_t send_data = {0};


        send_data.ctrl_flag = 0x90; // mode 4
        send_data.roll_or_x = los.x - dji_variable::local_position_ref.x;
        send_data.pitch_or_y = los.y - dji_variable::local_position_ref.y;
        send_data.thr_z = los.height; //m/s
        send_data.yaw = gimbal::gimbal_yaw_control_sp;

        printf("%f %f %f \n",
               los.x - dji_variable::local_position_ref.x,
               los.y - dji_variable::local_position_ref.y,
               los.height
        );

        App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (uint8_t *) &send_data, sizeof(send_data), NULL, 0, 0);
    }
void ros_ctrl_data_callback(float x,float y,float z,float w)
{
	api_ctrl_without_sensor_data_t send_data = {0};
	printf("mode %f yaw %f pitch %f roll %f vel %f\n", ctrl_mode, z,x,y,w);

	if(ctrl_mode == 1)
	{
	    send_data.ctrl_flag 	= 0x0a;  	//mode 2
		send_data.roll_or_x 	= y;
		send_data.pitch_or_y 	= x;
		send_data.thr_z 		= w;		//m/s
		send_data.yaw 			= z;
	}
	else if (ctrl_mode == 2)
	{
		send_data.ctrl_flag 	= 0x48; 	//mode 4
		send_data.roll_or_x 	= y;
		send_data.pitch_or_y 	= x;
		send_data.thr_z 		= w; 		//m/s
		send_data.yaw 			= z;
	}
	App_Send_Data(0, 0, MY_CTRL_CMD_SET, API_CTRL_REQUEST, (unsigned char*)&send_data, sizeof(send_data), NULL, 0, 0);
}
예제 #11
0
static void * CmdRecvThread(void * arg)
{
    arg = arg;  //For eliminating the warning messages.
    while(1)
	{
		if(cmd_unit.is_send_cmd)
		{
			printf("[DEBUG] in send\n");
			cmd_unit.is_send_cmd = 0;
			App_Send_Data(2,1,MY_CTRL_CMD_SET, API_CMD_REQUEST,(uint8_t*)&cmd_unit.cmd,sizeof(cmd_unit.cmd),sdk_ack_cmd_callback, 10, 0);
			printf("[DEBUG] send req cmd ok\n");
			sleep(2);
			if( (cmd_unit.ack_result&0xFF00) == 0xFF00 )
			{
				cmd_unit.ack_callback(&cmd_unit.ack_result);
				continue;
			}
			else if(cmd_unit.ack_result == REQ_TIME_OUT)
			{
				printf("[DEBUG] recv ack cmd time out \n");
				cmd_unit.ack_callback(&cmd_unit.ack_result);
				continue;
			}
			else if(cmd_unit.ack_result == REQ_REFUSE)
			{
				cmd_unit.ack_callback(&cmd_unit.ack_result);
				continue;
			}
			else if (cmd_unit.ack_result == CMD_RECIEVE)
			{
				printf("[DEBUG] CMD_RECIEVE \n");

				uint8_t req_status = cmd_unit.cmd.cmd_sequence; // can be anything
				sleep(7);
				App_Send_Data(2, 1,MY_CTRL_CMD_SET, API_CMD_STATUS_REQUEST,(uint8_t*)&req_status,sizeof(uint8_t),sdk_ack_cmd_callback, 10, 0);
				printf("[DEBUG] send req status ok\n");
				sleep(1);
				printf("[DEBUG] recv ack1 status ok\n");
				if( is_sys_error(cmd_unit.ack_result))
				{
					printf("SDK_SYS_ERROR!!! \n");
					continue;
				}
				else
				{
					cmd_unit.ack_callback(&cmd_unit.ack_result);
				}
				
				// for debug
				if(cmd_unit.ack_result != STATUS_CMD_EXE_SUCCESS)
				{
					printf("[DEBUG] WARNING CMD UN-SECCUSS\n");
				}
				
			}
		}
		else
		{
			usleep(100000);
		}
	}
	return NULL;
}
void DJI_Onboard_API_Control(unsigned char arg)
{
		unsigned char send_data = arg;
		App_Send_Data(1,1,MY_CTRL_CMD_SET,API_OPEN_SERIAL,(unsigned char*)&send_data,sizeof(send_data));
}
void DJI_Onboard_API_Activation(void)
{
	App_Send_Data( 2, 0, MY_ACTIVATION_SET, API_USER_ACTIVATION,(unsigned char*)&activation_msg,sizeof(activation_msg));
}
void test_version_query(void)
{
	unsigned char msg = 1;
	App_Send_Data(2, 0, MY_ACTIVATION_SET, API_VERSION_QUERY, (unsigned char*)&msg,sizeof(msg), test_version_query_ack_cmd_callback, 1000, 0);
	printf("[ACTIVATION] send version_query msg \n");
}
void Pro_API_Activation(void)
{
	App_Send_Data( 2, 0, MY_ACTIVATION_SET, API_USER_ACTIVATION,(unsigned char*)&activation_msg,sizeof(activation_msg), test_activation_ack_cmd_callback, 1000, 1);
	printf("[ACTIVATION] send acticition msg: %d %d %d %d \n", activation_msg.app_id, activation_msg.app_api_level, activation_msg.app_ver ,activation_msg.app_bundle_id[0]);
}
/*
 * test mode 4: vert velocity, hori velocity, yaw angular rate
 */
void basic_test_mode4(bool &is_init)
{
	static int cnt;
	if(!is_init)
	{
		cnt = 0;
		is_init= true;
	}
	else
	{
		api_ctrl_without_sensor_data_t send_data = {0};
		cnt++;
		if(cnt < 5*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x = 0.5;
			send_data.pitch_or_y = 0;
			send_data.thr_z = 0; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 10*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x = -0.5;
			send_data.pitch_or_y = 0;
			send_data.thr_z = 0; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 15*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = 0.5;
			send_data.thr_z = 0; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 20*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = -0.5;
			send_data.thr_z = 0; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 25*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = 0;
			send_data.thr_z = 0.5; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 30*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = 0;
			send_data.thr_z = -0.5; //m/s
			send_data.yaw = 0;
		}
		else if(cnt < 35*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = 0;
			send_data.thr_z = 0; //m/s
			send_data.yaw = 90;
		}
		else if(cnt < 40*50)
		{
			send_data.ctrl_flag = 0x48;
			send_data.roll_or_x =  0;
			send_data.pitch_or_y = 0;
			send_data.thr_z = 0; //m/s
			send_data.yaw = -90;
		}
		else
		{
			cnt = 0;
		}
		App_Send_Data(0, 0,MY_CTRL_CMD_SET, API_CTRL_REQUEST, (unsigned char*)&send_data, sizeof(send_data), NULL, 0, 0);
	}

}