发表于《开源一块飞控SS0》
tmn_A作者
8个月29天前IP:广东
948797
1楼

然后现在发几段我认为有移植意义的代码。

#include "main.h"
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

float* vector_add(float result[3], int num, ...)
{
	//多个向量加
	va_list valist;
	va_start(valist, num);

	memset(result, 0, 12);
	 
	float *vec;
	for(uint8_t i = 0;i < num;i++)
	{
		vec = va_arg(valist, float*);
		for(uint8_t j = 0;j < 3;j++)result[j] += vec[j];
	}

	va_end(valist);

	return result;
}

float* scalar_mult(float result[3], float k, float vec[3])
{
	//数乘
	for(uint8_t i = 0;i < 3;i++)result[i] = k*vec[i];
	return result;
}

float* cross_product(float result[3], float vec1[3] ,float vec2[3])
{
	//叉乘
	result[0] = vec1[1]*vec2[2]-vec1[2]*vec2[1];
	result[1] = vec1[2]*vec2[0]-vec1[0]*vec2[2];
	result[2] = vec1[0]*vec2[1]-vec1[1]*vec2[0];
	return result;
}

float* left_mult(float result[3], float mat[3][3], float vec[3])
{
	//矩阵左乘
	result[0] = mat[0][0]*vec[0]+mat[0][1]*vec[1]+mat[0][2]*vec[2];
	result[1] = mat[1][0]*vec[0]+mat[1][1]*vec[1]+mat[1][2]*vec[2];
	result[2] = mat[2][0]*vec[0]+mat[2][1]*vec[1]+mat[2][2]*vec[2];
	return result;
}

来源INSS0工程中的matrix_count.c全部,这里主要是实现三维向量线性相加,数乘,叉乘,矩阵左乘的函数,这些在惯导解算中较为常用。线性相加用了stdarg.h的不定参数,用于实现多个向量加和。用法是外部定义结果存储的位置,然后参数和返回值都指向那个位置,方便嵌套,节省代码量且更接近于数学公式。

评论
文号 / 948797

百炼成钢
名片专栏发私信
学术分 0
总主题 15 帖总回复 172 楼拥有证书:进士 机友 笔友
注册于 2020/08/28 12:52:17最后登录 2026/10/30 21:53:39
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东

个人简介

辰星引力工作室成员,火箭爱好者,嵌入式爱好者,物理爱好者,还有亚雷斯塔克劳利是我老婆。

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的