|
|
|
@ -211,13 +211,14 @@ void AC_ZR_Serial_API::get_vehicle_flight_data(Vector3l pos,Vector3l vel,Vector3
@@ -211,13 +211,14 @@ void AC_ZR_Serial_API::get_vehicle_flight_data(Vector3l pos,Vector3l vel,Vector3
|
|
|
|
|
/**
|
|
|
|
|
* @brief 获取串口接收到的控制数据 |
|
|
|
|
*
|
|
|
|
|
* @param mode 飞行模式,如果不是guide则false |
|
|
|
|
* @param type 控制模式,速度模式,位置模式 |
|
|
|
|
* @param data 控制的数据,根据type决定是速度还是位置 |
|
|
|
|
* @param yaw_deg 偏航角 |
|
|
|
|
* @return true
|
|
|
|
|
* @return false
|
|
|
|
|
*/ |
|
|
|
|
bool AC_ZR_Serial_API::get_control_data(ZR_Msg_Type &type,Vector3l &data,float &yaw_deg) |
|
|
|
|
bool AC_ZR_Serial_API::get_control_data(uint8_t mode, ZR_Msg_Type &type,Vector3l &data,float &yaw_deg) |
|
|
|
|
{ |
|
|
|
|
static uint32_t last_time = 0; |
|
|
|
|
uint8_t crc_sum = 0; |
|
|
|
@ -235,22 +236,30 @@ bool AC_ZR_Serial_API::get_control_data(ZR_Msg_Type &type,Vector3l &data,float &
@@ -235,22 +236,30 @@ bool AC_ZR_Serial_API::get_control_data(ZR_Msg_Type &type,Vector3l &data,float &
|
|
|
|
|
|
|
|
|
|
if(crc_sum != flight_control_parser.data[CONTROL_DATA_LEN - 1]){ |
|
|
|
|
Debug("crc error clc: %02x ,rece: %02x",crc_sum,flight_control_parser.msg.crc); |
|
|
|
|
set_control_ask(flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRCRC); // 应答CRC错误
|
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRCRC); // 应答CRC错误
|
|
|
|
|
return false; // 校验失败
|
|
|
|
|
} |
|
|
|
|
type = flight_control_parser.msg.type; |
|
|
|
|
if(type < ZR_Msg_Type::MSG_CONTROL_TKOFF || type > ZR_Msg_Type::MSG_CONTROL_VEL ){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRTYPE); // 应答CRC错误
|
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRTYPE); // 应答控制类型错误
|
|
|
|
|
return false; // 控制类型错误
|
|
|
|
|
} |
|
|
|
|
set_control_ask(flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_OK); // 应答成功
|
|
|
|
|
// 速度或者位置,3个float
|
|
|
|
|
memcpy(&data,flight_control_parser.data + 3,12); // 第三位开始是控制数据,长度3*4
|
|
|
|
|
if(type != ZR_Msg_Type::MSG_CONTROL_TKOFF && mode != 4){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRMODE);
|
|
|
|
|
return false; // 飞行模式错误
|
|
|
|
|
} |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_OK); // 应答成功
|
|
|
|
|
// 速度或者位置,3个int32
|
|
|
|
|
// memcpy(&data,flight_control_parser.data + 4,12); // 第4位开始是控制数据,长度3*4
|
|
|
|
|
data.x = flight_control_parser.msg.x; |
|
|
|
|
data.y = flight_control_parser.msg.y; |
|
|
|
|
data.z = flight_control_parser.msg.z; |
|
|
|
|
yaw_deg = flight_control_parser.msg.yaw; |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
void AC_ZR_Serial_API::set_control_ask(ZR_Msg_Type receive_type,ZR_Msg_ASK ask) |
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::set_control_ask(uint8_t msg_id,ZR_Msg_Type receive_type,ZR_Msg_ASK ask) |
|
|
|
|
{ |
|
|
|
|
uint8_t crc_sum = 0; |
|
|
|
|
|
|
|
|
@ -258,14 +267,10 @@ void AC_ZR_Serial_API::set_control_ask(ZR_Msg_Type receive_type,ZR_Msg_ASK ask)
@@ -258,14 +267,10 @@ void AC_ZR_Serial_API::set_control_ask(ZR_Msg_Type receive_type,ZR_Msg_ASK ask)
|
|
|
|
|
flight_control_ask.msg.msg_type = ZR_Msg_Type::MSG_ASK; |
|
|
|
|
flight_control_ask.msg.length = CONTROL_ASK_LEN - 4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flight_control_ask.msg.msg_id = msg_id; |
|
|
|
|
flight_control_ask.msg.receive_type = receive_type; |
|
|
|
|
flight_control_ask.msg.msg_ask = ask; |
|
|
|
|
// crc_clc += flight_control_ask.msg.msg_head;
|
|
|
|
|
// crc_clc += (int)flight_control_ask.msg.msg_type;
|
|
|
|
|
// crc_clc += (int)flight_control_ask.msg.receive_type;
|
|
|
|
|
// crc_clc += (int)flight_control_ask.msg.msg_ask;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
crc_sum = crc_crc8(flight_control_ask.data,CONTROL_ASK_LEN-1); |
|
|
|
|
|
|
|
|
|
flight_control_ask.msg.crc = crc_sum; |
|
|
|
|