云台好了
This commit is contained in:
parent
8c44c6a274
commit
39adf0a2b6
@ -157,18 +157,34 @@
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>56</LineNumber>
|
||||
<LineNumber>0</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>134292314</Address>
|
||||
<Address>128</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename>..\User\task\ctrl_gimbal.c</Filename>
|
||||
<Filename></Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>\\CtrBoard_H7_ALL\../User/task/ctrl_gimbal.c\56</Expression>
|
||||
<Expression>0x00000080</Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>1</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>0</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>134</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename></Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>0x00000086</Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<WatchWindow1>
|
||||
@ -197,6 +213,41 @@
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>GIMBAL_IMU_Update</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>5</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>rx_msg</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>6</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>count</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>7</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>rx_msg</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>8</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>can2_debug</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>9</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>fdcan2_init_debug</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>10</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>rx_debug</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>11</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>cmd_for_gimbal</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
@ -1056,7 +1107,7 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>User/component</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
@ -1184,7 +1235,7 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>User/device</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
|
||||
@ -314,7 +314,7 @@
|
||||
</ArmAdsMisc>
|
||||
<Cads>
|
||||
<interw>1</interw>
|
||||
<Optim>4</Optim>
|
||||
<Optim>1</Optim>
|
||||
<oTime>0</oTime>
|
||||
<SplitLS>0</SplitLS>
|
||||
<OneElfS>1</OneElfS>
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -21,7 +21,7 @@
|
||||
* @param bits 位数
|
||||
* @return float 转换后的浮点数
|
||||
*/
|
||||
static float uint_to_float(uint16_t x_int, float x_min, float x_max, int bits) {
|
||||
static float uint_to_float(uint32_t x_int, float x_min, float x_max, int bits) {
|
||||
float span = x_max - x_min;
|
||||
float offset = x_min;
|
||||
return ((float)x_int) * span / ((float)((1 << bits) - 1)) + offset;
|
||||
@ -37,37 +37,34 @@ static void GIMBAL_IMU_ParseMessage(GIMBAL_IMU_t *gimbal_imu, uint32_t id, const
|
||||
|
||||
/* 判断是哪个ID的数据 */
|
||||
if (id == gimbal_imu->param.accl_id) {
|
||||
/* 解析加速度计数据 */
|
||||
uint16_t acc_x = (uint16_t)data[2] | ((uint16_t)data[3] << 8);
|
||||
uint16_t acc_y = (uint16_t)data[4] | ((uint16_t)data[5] << 8);
|
||||
uint16_t acc_z = (uint16_t)data[6] | ((uint16_t)data[7] << 8);
|
||||
/* 解析加速度计数据 - 21位精度解包 */
|
||||
uint32_t acc_x = ((uint32_t)data[0] << 13) | ((uint32_t)data[1] << 5) | ((uint32_t)data[2] >> 3);
|
||||
uint32_t acc_y = (((uint32_t)data[2] & 0x07) << 18) | ((uint32_t)data[3] << 10) | ((uint32_t)data[4] << 2) | ((uint32_t)data[5] >> 6);
|
||||
uint32_t acc_z = (((uint32_t)data[5] & 0x3F) << 15) | ((uint32_t)data[6] << 7) | ((uint32_t)data[7] >> 1);
|
||||
|
||||
gimbal_imu->data.accl.x = uint_to_float(acc_x, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 16);
|
||||
gimbal_imu->data.accl.y = uint_to_float(acc_y, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 16);
|
||||
gimbal_imu->data.accl.z = uint_to_float(acc_z, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 16);
|
||||
|
||||
/* 温度数据 */
|
||||
gimbal_imu->data.temp = (float)data[1];
|
||||
gimbal_imu->data.accl.x = uint_to_float(acc_x, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 21);
|
||||
gimbal_imu->data.accl.y = uint_to_float(acc_y, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 21);
|
||||
gimbal_imu->data.accl.z = uint_to_float(acc_z, GIMBAL_IMU_ACCEL_MIN, GIMBAL_IMU_ACCEL_MAX, 21);
|
||||
|
||||
} else if (id == gimbal_imu->param.gyro_id) {
|
||||
/* 解析陀螺仪数据 */
|
||||
uint16_t gyro_x = (uint16_t)data[2] | ((uint16_t)data[3] << 8);
|
||||
uint16_t gyro_y = (uint16_t)data[4] | ((uint16_t)data[5] << 8);
|
||||
uint16_t gyro_z = (uint16_t)data[6] | ((uint16_t)data[7] << 8);
|
||||
/* 解析陀螺仪数据 - 21位精度解包 */
|
||||
uint32_t gyro_x = ((uint32_t)data[0] << 13) | ((uint32_t)data[1] << 5) | ((uint32_t)data[2] >> 3);
|
||||
uint32_t gyro_y = (((uint32_t)data[2] & 0x07) << 18) | ((uint32_t)data[3] << 10) | ((uint32_t)data[4] << 2) | ((uint32_t)data[5] >> 6);
|
||||
uint32_t gyro_z = (((uint32_t)data[5] & 0x3F) << 15) | ((uint32_t)data[6] << 7) | ((uint32_t)data[7] >> 1);
|
||||
|
||||
gimbal_imu->data.gyro.x = uint_to_float(gyro_x, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 16);
|
||||
gimbal_imu->data.gyro.y = uint_to_float(gyro_y, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 16);
|
||||
gimbal_imu->data.gyro.z = uint_to_float(gyro_z, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 16);
|
||||
gimbal_imu->data.gyro.x = uint_to_float(gyro_x, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 21);
|
||||
gimbal_imu->data.gyro.y = uint_to_float(gyro_y, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 21);
|
||||
gimbal_imu->data.gyro.z = uint_to_float(gyro_z, GIMBAL_IMU_GYRO_MIN, GIMBAL_IMU_GYRO_MAX, 21);
|
||||
|
||||
} else if (id == gimbal_imu->param.eulr_id) {
|
||||
/* 解析欧拉角数据 */
|
||||
uint16_t pit = (uint16_t)data[2] | ((uint16_t)data[3] << 8);
|
||||
uint16_t yaw = (uint16_t)data[4] | ((uint16_t)data[5] << 8);
|
||||
uint16_t rol = (uint16_t)data[6] | ((uint16_t)data[7] << 8);
|
||||
/* 解析欧拉角数据 - 21位精度解包 */
|
||||
uint32_t pit = ((uint32_t)data[0] << 13) | ((uint32_t)data[1] << 5) | ((uint32_t)data[2] >> 3);
|
||||
uint32_t yaw = (((uint32_t)data[2] & 0x07) << 18) | ((uint32_t)data[3] << 10) | ((uint32_t)data[4] << 2) | ((uint32_t)data[5] >> 6);
|
||||
uint32_t rol = (((uint32_t)data[5] & 0x3F) << 15) | ((uint32_t)data[6] << 7) | ((uint32_t)data[7] >> 1);
|
||||
|
||||
gimbal_imu->data.eulr.pit = uint_to_float(pit, GIMBAL_IMU_PITCH_MIN, GIMBAL_IMU_PITCH_MAX, 16);
|
||||
gimbal_imu->data.eulr.yaw = uint_to_float(yaw, GIMBAL_IMU_YAW_MIN, GIMBAL_IMU_YAW_MAX, 16);
|
||||
gimbal_imu->data.eulr.rol = uint_to_float(rol, GIMBAL_IMU_ROLL_MIN, GIMBAL_IMU_ROLL_MAX, 16);
|
||||
gimbal_imu->data.eulr.pit = uint_to_float(pit, GIMBAL_IMU_PITCH_MIN, GIMBAL_IMU_PITCH_MAX, 21);
|
||||
gimbal_imu->data.eulr.yaw = uint_to_float(yaw, GIMBAL_IMU_YAW_MIN, GIMBAL_IMU_YAW_MAX, 21);
|
||||
gimbal_imu->data.eulr.rol = uint_to_float(rol, GIMBAL_IMU_ROLL_MIN, GIMBAL_IMU_ROLL_MAX, 21);
|
||||
|
||||
} else if (id == gimbal_imu->param.quat_id) {
|
||||
/* 解析四元数数据 - 使用14位精度解包 */
|
||||
|
||||
@ -66,11 +66,11 @@ Config_RobotParam_t robot_config = {
|
||||
},
|
||||
.mech_zero = {
|
||||
.yaw = 0.0f,
|
||||
.pit = 1.77f,
|
||||
.pit = 2.12f,
|
||||
},
|
||||
.travel = {
|
||||
.yaw = -1.0f,
|
||||
.pit = 0.8f,
|
||||
.pit = 0.9f,
|
||||
},
|
||||
.low_pass_cutoff_freq = {
|
||||
.out = -1.0f,
|
||||
@ -92,10 +92,10 @@ Config_RobotParam_t robot_config = {
|
||||
},
|
||||
.imu = {
|
||||
.can = BSP_CAN_2,
|
||||
.accl_id = 0x64, // 100
|
||||
.gyro_id = 0x65, // 101
|
||||
.eulr_id = 0x66, // 102
|
||||
.quat_id = 0x67 // 103
|
||||
.accl_id = 0x100, // 加速度计 (十进制256)
|
||||
.gyro_id = 0x101, // 陀螺仪 (十进制257)
|
||||
.eulr_id = 0x102, // 欧拉角 (十进制258)
|
||||
.quat_id = 0x103 // 四元数 (十进制259)
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
/* USER STRUCT BEGIN */
|
||||
Gimbal_t gimbal;
|
||||
Gimbal_CMD_t gimbal_cmd;
|
||||
BSP_FDCAN_StdDataFrame_t can_frame;
|
||||
// BSP_FDCAN_StdDataFrame_t can_frame;
|
||||
/* USER STRUCT END */
|
||||
|
||||
/* Private function --------------------------------------------------------- */
|
||||
@ -42,9 +42,9 @@ void Task_ctrl_gimbal(void *argument) {
|
||||
tick += delay_tick; /* 计算下一个唤醒时刻 */
|
||||
/* USER CODE BEGIN */
|
||||
|
||||
can_frame.id = 0x200;
|
||||
can_frame.dlc = 8;
|
||||
BSP_CAN_TransmitStdDataFrame(BSP_CAN_2, &can_frame);
|
||||
// can_frame.id = 0x200;
|
||||
// can_frame.dlc = 8;
|
||||
// BSP_CAN_TransmitStdDataFrame(BSP_CAN_2, &can_frame);
|
||||
|
||||
Gimbal_UpdateIMU(&gimbal);
|
||||
osMessageQueueGet(task_runtime.msgq.gimbal.cmd, &gimbal_cmd, NULL, 0);
|
||||
@ -53,7 +53,7 @@ void Task_ctrl_gimbal(void *argument) {
|
||||
Gimbal_UpdateFeedback(&gimbal);
|
||||
|
||||
// osMessageQueueReset(task_runtime.msgq.chassis_yaw);
|
||||
osMessageQueuePut(task_runtime.msgq.chassis.yaw, &gimbal.feedback.motor.yaw, 0, 0);
|
||||
// osMessageQueuePut(task_runtime.msgq.chassis.yaw, &gimbal.feedback.motor.yaw, 0, 0);
|
||||
|
||||
Gimbal_Control(&gimbal, &gimbal_cmd);
|
||||
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
/* USER INCLUDE BEGIN */
|
||||
#include "module/shoot.h"
|
||||
#include "module/balance_chassis.h"
|
||||
#include "module/gimbal.h"
|
||||
/* USER INCLUDE END */
|
||||
|
||||
/* Private typedef ---------------------------------------------------------- */
|
||||
@ -33,7 +34,7 @@ void Task_Init(void *argument) {
|
||||
/* 创建任务线程 */
|
||||
task_runtime.thread.rc = osThreadNew(Task_rc, NULL, &attr_rc);
|
||||
task_runtime.thread.atti_esit = osThreadNew(Task_atti_esit, NULL, &attr_atti_esit);
|
||||
task_runtime.thread.ctrl_chassis = osThreadNew(Task_ctrl_chassis, NULL, &attr_ctrl_chassis);
|
||||
// task_runtime.thread.ctrl_chassis = osThreadNew(Task_ctrl_chassis, NULL, &attr_ctrl_chassis);
|
||||
task_runtime.thread.ctrl_gimbal = osThreadNew(Task_ctrl_gimbal, NULL, &attr_ctrl_gimbal);
|
||||
task_runtime.thread.monitor = osThreadNew(Task_monitor, NULL, &attr_monitor);
|
||||
task_runtime.thread.blink = osThreadNew(Task_blink, NULL, &attr_blink);
|
||||
@ -46,6 +47,7 @@ void Task_Init(void *argument) {
|
||||
task_runtime.msgq.chassis.imu = osMessageQueueNew(2u, sizeof(Chassis_IMU_t), NULL);
|
||||
task_runtime.msgq.chassis.cmd = osMessageQueueNew(2u, sizeof(Chassis_CMD_t), NULL);
|
||||
task_runtime.msgq.chassis.yaw = osMessageQueueNew(2u, sizeof(MOTOR_Feedback_t), NULL);
|
||||
task_runtime.msgq.gimbal.cmd = osMessageQueueNew(2u, sizeof(Gimbal_CMD_t), NULL);
|
||||
/* USER MESSAGE END */
|
||||
|
||||
osKernelUnlock(); // 解锁内核
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "device/dr16.h"
|
||||
#include "module/shoot.h"
|
||||
#include "module/balance_chassis.h"
|
||||
#include "module/gimbal.h"
|
||||
/* USER INCLUDE END */
|
||||
|
||||
/* Private typedef ---------------------------------------------------------- */
|
||||
@ -19,6 +20,7 @@
|
||||
DR16_t dr16;
|
||||
Shoot_CMD_t for_shoot;
|
||||
Chassis_CMD_t cmd_for_chassis;
|
||||
Gimbal_CMD_t cmd_for_gimbal;
|
||||
/* USER STRUCT END */
|
||||
|
||||
/* Private function --------------------------------------------------------- */
|
||||
@ -74,32 +76,34 @@ void Task_rc(void *argument) {
|
||||
// task_runtime.msgq.chassis.cmd); // 重置消息队列,防止阻塞
|
||||
// osMessageQueuePut(task_runtime.msgq.chassis.cmd, &cmd_for_chassis, 0,
|
||||
// 0); // 非阻塞发送底盘控制命令
|
||||
/************************* 云台命令 **************************************/
|
||||
switch (dr16.data.sw_l) {
|
||||
case DR16_SW_UP:
|
||||
cmd_for_gimbal.mode = GIMBAL_MODE_RELAX;
|
||||
cmd_for_gimbal.delta_yaw = 0.0f;
|
||||
cmd_for_gimbal.delta_pit = 0.0f;
|
||||
break;
|
||||
case DR16_SW_MID:
|
||||
cmd_for_gimbal.mode = GIMBAL_MODE_ABSOLUTE;
|
||||
cmd_for_gimbal.delta_yaw = -dr16.data.ch_r_x * 5.0f;
|
||||
cmd_for_gimbal.delta_pit = dr16.data.ch_r_y * 5.0f;
|
||||
break;
|
||||
case DR16_SW_DOWN:
|
||||
cmd_for_gimbal.mode = GIMBAL_MODE_ABSOLUTE;
|
||||
cmd_for_gimbal.delta_yaw = -dr16.data.ch_r_x * 5.0f;
|
||||
cmd_for_gimbal.delta_pit = dr16.data.ch_r_y * 5.0f;
|
||||
break;
|
||||
default:
|
||||
cmd_for_gimbal.mode = GIMBAL_MODE_RELAX;
|
||||
cmd_for_gimbal.delta_yaw = 0.0f;
|
||||
cmd_for_gimbal.delta_pit = 0.0f;
|
||||
break;
|
||||
}
|
||||
|
||||
// switch (dr16.data.sw_l) {
|
||||
// case DR16_SW_UP:
|
||||
// cmd_for_gimbal.mode = GIMBAL_MODE_RELAX;
|
||||
// cmd_for_gimbal.delta_yaw = 0.0f;
|
||||
// cmd_for_gimbal.delta_pit = 0.0f;
|
||||
// break;
|
||||
// case DR16_SW_MID:
|
||||
// cmd_for_gimbal.mode = GIMBAL_MODE_ABSOLUTE;
|
||||
// cmd_for_gimbal.delta_yaw = -dr16.data.ch_r_x * 5.0f;
|
||||
// cmd_for_gimbal.delta_pit = dr16.data.ch_r_y * 5.0f;
|
||||
// break;
|
||||
// case DR16_SW_DOWN:
|
||||
// cmd_for_gimbal.mode = GIMBAL_MODE_ABSOLUTE;
|
||||
// cmd_for_gimbal.delta_yaw = -dr16.data.ch_r_x * 5.0f;
|
||||
// cmd_for_gimbal.delta_pit = dr16.data.ch_r_y * 5.0f;
|
||||
// break;
|
||||
// default:
|
||||
// cmd_for_gimbal.mode = GIMBAL_MODE_RELAX;
|
||||
// cmd_for_gimbal.delta_yaw = 0.0f;
|
||||
// cmd_for_gimbal.delta_pit = 0.0f;
|
||||
// break;
|
||||
// }
|
||||
osMessageQueueReset(task_runtime.msgq.gimbal.cmd);
|
||||
osMessageQueuePut(task_runtime.msgq.gimbal.cmd, &cmd_for_gimbal, 0, 0);
|
||||
|
||||
// osMessageQueueReset(task_runtime.msgq.gimbal.cmd);
|
||||
// osMessageQueuePut(task_runtime.msgq.gimbal.cmd, &cmd_for_gimbal, 0, 0);
|
||||
/************************* 底盘命令 **************************************/
|
||||
switch (dr16.data.sw_l) {
|
||||
case DR16_SW_UP:
|
||||
cmd_for_chassis.mode = CHASSIS_MODE_RELAX;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user