px4代码解析(3)

7 篇文章 80 订阅
5 篇文章 81 订阅

前言

在使用PX4飞控时,我们难免要对其进行二次开发,例如修改控制算法,添加新的传感器,这时需要在代码中定义属于自己的消息。本节主要分享一下如何在PX4代码中添加自己的消息

一、消息添加与配置

从代码解析(1)中,我们了解到PX4主要的消息都放在PX4项目下的msg目录中,因此,我们添加自己的消息也需要在msg文件夹下操作
打开msg文件夹,在其中新建一个以.msg结尾的文件,如图,我建立了一个mylove.msg文件
在这里插入图片描述打开文件,在其中定义两个变量,a,b,并定义一个时间戳timestamp(否则编译不通过)
在这里插入图片描述

在msg文件夹下找到cmakelist.txt文件,打开在其中添加mylove.msg
在这里插入图片描述对代码重新编译,在终端输入make px4_sitl_default
编译完成,在PX4项目下会生成build文件,该文件中会存放关于编译后生成的可执行文件和编译中间文件,打开build,会看到我们编译生成的px4_sitl_default的文件夹
在这里插入图片描述在该文件夹下打开msg文件夹,会在其中看到tmp文件夹,该文件夹会存放定义的消息生成的.h文件与.cpp文件
在这里插入图片描述进入header文件夹,你会找到mylove.h文件,这就是我们定义消息产生的文件
在这里插入图片描述打开mylove.h文件,我们会看到

#pragma once


#include <uORB/uORB.h>


#ifndef __cplusplus

#endif


#ifdef __cplusplus
struct __EXPORT mylove_s {
#else
struct mylove_s {
#endif
	uint64_t timestamp;
	float a;
	float b;


#ifdef __cplusplus

#endif
};

系统在文件中帮我们自动定义了以s结尾的消息结构体,这个结构体在我们使用消息时会使用到。这点在上一讲中讲解px4_simple_app代码时有所体现,在代码中他使用了vehicle_attitude_s与sensor_combined_s两种消息结构体,用来存放消息数据,并通过uorb发送与接收。
消息定义与配置完成,接下来我将用一个简单的例子来演示如何使用自己的消息并在PX4编写自己的代码

二、PX4添加并运行自己程序

在代码解析(1)中,我们曾说过,PX4有关飞机的代码全部存在src目录下,因此添加自己的代码也需要在src目录下添加。进入src/example,在其中建立一个my_example的文件夹
在这里插入图片描述在my_example文件夹下建立两个文件,my_example.c与CMakeList.txt
在这里插入图片描述
在my_example.c中添加下列代码

#include "stdio.h"
#include <px4_platform_common/log.h>//PX4_INFO所在头文件
#include <uORB/uORB.h>//uorb相关文件夹
#include <uORB/topics/mylove.h>//消息所在头文件
#include <string.h>//meset头文件


//把主函数声明为全局,方便调用
//px4中主函数的命名规则,以_main表示主函数
__EXPORT int my_example_main(int argc, char *argv[]);


//主函数实现
int my_example_main(int argc, char *argv[])
{
  //使用之前自定义消息生成的结构体
  struct mylove_s love;
  //为结构体分配空间
  memset(&love, 0, sizeof(love));
  //向系统公布本程序要分布mylove消息
  //公布主题成功则返回一个指针
  //公布主题失败则返回NULL空指针
  orb_advert_t love_pub = orb_advertise(ORB_ID(mylove), &love);
  
  if (love_pub != NULL)
  {//表明公布成功,侧面证明我们定义消息可用
	PX4_INFO("success!");
  }
  else
  {//公布失败
	PX4_INFO("faild!");
  }
  
  return 0;
}

CMakeList.txt代码中存放相关配置,代码内容如下

px4_add_module(//添加一个模块
  //examples代表我们的代码在src/examples文件夹下
  //examples后面有两条_,代表存放在examples文件夹下
  //my_examples是模块名称
	MODULE examples__my_example
	//主函数名称
	MAIN my_example
	//源代码文件列表
	SRCS
		my_example.c
	DEPENDS
	)

添加好my_example模块后,我们需要将其加入到编译目录中,例如我编译的是px4_sitl_default,则在boards下找到px4目录,进入px4找到sitl(软件在环,为没有硬件的兄弟准备)
在这里插入图片描述进入sitl,找到default.cmake文件,在EXAMPLES下添加my_example
在这里插入图片描述添加完成后在PX4目录下打开终端,进行编译make px4_sitl_default jmavsim
jmavsim是PX4的一种仿真器
编译完成后在终端输入help,可以看到PX4代码中可以运行的模块名称,你会在其中找到my_example模块
在这里插入图片描述输入my_example,结果如下
在这里插入图片描述返回success证明实验成功

后记

自己写代码解析一方面是巩固自己所学,另一方面希望分享自己对PX4源码解读,找到一些志同道合的朋友,可以一起讨论交流进步
此外,我目前在做空中作业机器人,希望可以有大佬指导指导,目前在无人机下加了四自由度的舵机机械臂,但无法进行力矩反馈,打算换电机机械臂,有推荐吗

在这里插入图片描述

PX4是一个开源的飞控固件,其PID控制器部分的代码如下: ```c++ void PID::update(float desired, float measured, float dt) { // 计算误差 float error = desired - measured; // 积分误差 _integrator += _ki * error * dt; // 限制积分误差 _integrator = math::constrain(_integrator, -_integrator_saturation, _integrator_saturation); // 计算微分误差 _derivative = (_kd == 0) ? 0 : (_prev_error - error) / dt; // 计算输出 _output = _kp * error + _integrator + _kd * _derivative; // 限制输出 _output = math::constrain(_output, -_output_saturation, _output_saturation); // 更新上一次误差 _prev_error = error; } ``` 该代码实现的是一个标准的PID控制器,其中包含了三个部分,分别是比例控制、积分控制和微分控制。算法流程如下: 1. 计算误差:目标值与实际值之间的差距。 2. 积分误差:将误差累加起来,用于消除稳态误差。 3. 限制积分误差:对积分误差进行限制,防止积分饱和。 4. 计算微分误差:计算误差的变化率,用于抑制超调和减小调节时间。 5. 计算输出:将比例控制、积分控制和微分控制三个部分的输出相加,得到最终的控制输出。 6. 限制输出:对输出进行限制,防止输出过大或过小。 7. 更新上一次误差:将当前误差保存下来,供下一次计算使用。 这段代码的实现比较简单,但是需要注意的是,积分误差和微分误差的计算需要进行限制,否则会出现积分饱和和微分爆炸的问题。此外,PID控制器的参数需要根据具体的控制对象进行调整,以获得更好的控制效果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值