关于px4 1.15.0电机控制有效矩阵的更新

下面这段代码是PX4飞控根据_handled_motor_failure_bitmask的值, 更新无人机的有效性矩阵的代码。

bash 复制代码
// Handle failed actuators
		if (_handled_motor_failure_bitmask) {
			actuator_idx = 0;
			memset(&actuator_idx_matrix, 0, sizeof(actuator_idx_matrix));

			for (int motors_idx = 0; motors_idx < _num_actuators[0] && motors_idx < actuator_motors_s::NUM_CONTROLS; motors_idx++) {
				int selected_matrix = _control_allocation_selection_indexes[actuator_idx];

				if (_handled_motor_failure_bitmask & (1 << motors_idx)) {
					ActuatorEffectiveness::EffectivenessMatrix &matrix = config.effectiveness_matrices[selected_matrix];

					for (int i = 0; i < NUM_AXES; i++) {
						matrix(i, actuator_idx_matrix[selected_matrix]) = 0.0f;
					}
				}

				++actuator_idx_matrix[selected_matrix];
				++actuator_idx;
			}
		}

假设我们停的是5号电机。 那么_handled_motor_failure_bitmask = 0x10

那么如果六旋翼的原始矩阵是

bash 复制代码
Row 0: [-6.500  6.500  3.250 -3.250 -3.250  3.250 ]
Row 1: [ 0.000  0.000  5.629 -5.629  5.629 -5.629 ]
Row 2: [-0.325  0.325 -0.325  0.325  0.325 -0.325 ]
Row 3: [ 0.000  0.000  0.000  0.000  0.000  0.000 ]
Row 4: [ 0.000  0.000  0.000  0.000  0.000  0.000 ]
Row 5: [-6.500 -6.500 -6.500 -6.500 -6.500 -6.500 ]

那么经过上面的一段代码之后

最新的矩阵就是这个

bash 复制代码
Row 0: [-6.500  6.500  3.250 -3.250  0.000  3.250 ]
Row 1: [ 0.000  0.000  5.629 -5.629  0.000 -5.629 ]
Row 2: [-0.325  0.325 -0.325  0.325  0.000 -0.325 ]
Row 3: [ 0.000  0.000  0.000  0.000  0.000  0.000 ]
Row 4: [ 0.000  0.000  0.000  0.000  0.000  0.000 ]
Row 5: [-6.500 -6.500 -6.500 -6.500  0.000 -6.500 ]

过程是这样的

bash 复制代码
电机失效处理逻辑:  
1. 电机编号对应: 
 • motors_idx = 0 → 第1列 (电机0) 
  • motors_idx = 1 → 第2列 (电机1) 
 • motors_idx = 2 → 第3列 (电机2) 
  • motors_idx = 3 → 第4列 (电机3)  
• motors_idx = 4 → 第5列 (电机4) ← 失效 
 • motors_idx = 5 → 第6列 (电机5)  
 2. 失效处理:  
 3. • 当 motors_idx = 4 时,_handled_motor_failure_bitmask & (1 <<4) = 0x10 & 0x10 = 0x10 (非零,条件成立)

有效矩阵怎么在飞控代码中打印出来呢?

bash 复制代码
--- a/src/modules/control_allocator/ActuatorEffectiveness/ActuatorEffectivenessRotors.cpp
+++ b/src/modules/control_allocator/ActuatorEffectiveness/ActuatorEffectivenessRotors.cpp
@@ -221,6 +221,22 @@ ActuatorEffectivenessRotors::computeEffectivenessMatrix(const Geometry &geometry
                }
        }
 
+
+
+       // 打印根据机体结构计算的初始有效矩阵
+       PX4_INFO("=== Initial Effectiveness Matrix (from Geometry) ===");
+       PX4_INFO("Actuator start index: %d, Num actuators: %d", actuator_start_index, num_actuators);
+       for (int row = 0; row < 6; row++) {
+               char row_str[200] = "";
+               for (int col = 0; col < num_actuators; col++) {
+                       char temp[20];
+                       snprintf(temp, sizeof(temp), "%.3f ", (double)effectiveness(row, col + actuator_start_index));
+                       strcat(row_str, temp);
+               }
+               PX4_INFO("Row %d: [%s]", row, row_str);
+       }
+
+
        return num_actuators;
 }
 

更新后的矩阵,应该在下面的函数中,打印的, 但是打印代码始终不对,后面再添加。

bash 复制代码
diff --git a/src/modules/control_allocator/ControlAllocator.cpp b/src/modules/control_allocator/ControlAllocator.cpp
index 6ac6f318..1c9a5739 100644
--- a/src/modules/control_allocator/ControlAllocator.cpp
+++ b/src/modules/control_allocator/ControlAllocator.cpp
@@ -539,6 +539,8 @@ ControlAllocator::update_effectiveness_matrix_if_needed(EffectivenessUpdateReaso
                        }
                }
 
+               printf("cuigaosheng  _handled_motor_failure_bitmask: 0x%x", _handled_motor_failure_bitmask);
+
                // Handle failed actuators
                if (_handled_motor_failure_bitmask) {
                        actuator_idx = 0;
@@ -594,6 +596,7 @@ ControlAllocator::update_effectiveness_matrix_if_needed(EffectivenessUpdateReaso
                trims.timestamp = hrt_absolute_time();
                _actuator_servos_trim_pub.publish(trims);
        }
相关推荐
24年生活经验_小旻15 天前
ROS2+Ardupilot+Gazebo通信仿真基本环境搭建
无人机
Bobolink_16 天前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
嘉子的秃头日记16 天前
TRO 2026|无人机能不能像积木一样,拼出不同形态?
无人机
H1785350909616 天前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks
AI_yangxi16 天前
短视频矩阵系统专业公司
大数据·人工智能·矩阵
YOLO数据集集合16 天前
无人机航拍地质灾害智能识别 山体滑坡实例分割数据集落地实战 | 泥石流监测 道路险情封堵 深度学习模型训练方案10296期
人工智能·深度学习·yolo·目标检测·无人机
海砥装备HardAus16 天前
大载重工业无人机高空风扰建模与ADRC自抗扰抗风控制实现
无人机·adrc·工业无人机
海砥装备HardAus16 天前
大载重工业无人机动力容错控制:单电机失效下的应急重构算法设计
算法·重构·嵌入式·无人机
昇腾CANN16 天前
【cann-samples系列】GroupedMatmul MX量化矩阵乘的深度性能优化实践
线性代数·性能优化·矩阵·昇腾·cann
青山木16 天前
Hot 100 --- 矩阵置零
线性代数·算法·leetcode·矩阵·哈希算法