ChatGPT带我做四轴飞行器和自平衡小车

news2024/9/22 17:25:31

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照ChatGPT的说法,这款主板的的主控MCU、无线通信、电源管理、外设接口可以共用,需要差异化的有电机驱动、传感器的选择、控制算法和软件、电源供电。ChatGPT说的共用部分没啥争议,有差异化的地方需要细想下:电机驱动显然应该不同,比如四轴飞行器使用空心杯电机,那么它的电机驱动电路只用通过PWM控制空心杯电机的转速即可,平衡车电机就不一样,除了要控制转速,还要能控制正反转方向,还要能测量电机转速实现速度闭环控制;那么传感器的选择呢,四轴飞行器最少要用六轴传感器才行,它要用到三轴陀螺仪和三轴加速度计才能将当前姿态计算出来,平衡车则会少两个轴,因为它左右两个轮子固定了,不能左右倾斜,相当于四轴飞行器的横滚角固定不用测量,所以传感器可以就选用一款六轴传感器,平衡车不用其中两个轴就行了;控制算法和控制逻辑显然也会有差异,毕竟飞控系统和自平衡控制系统的控制原理不一样,用到的姿态检测数据也不一样,电机也不一样;电源供电不一样主要是因为四轴飞行器和平衡车的电机的功率不一样,额定电压也不一样。看来ChatGPT虽然只说大方向,但大方向细想后也没啥不对,接下来按照这个大方向设计顶层原理图图纸如下图所示,差异化的电机驱动部分通过两组GPIO来控制,具体差异在电机驱动模块原理图中设计;传感器直接选择六轴传感器,平衡车不用这么多数据在软件上过滤,硬件上不体现差异;供电由3.7V锂电池输入,通过电源电路分出3.3V和6V两路电源,3.3V给所有芯片供电,6V给平衡车电机供电,四轴飞行器的电机直接由3.7V锂电池供电。
在这里插入图片描述
控制算法与软件上的差异怎么做呢?问问ChatGPT
在这里插入图片描述

// 飞行器控制参数结构体
typedef struct {
    float roll_gain;
    float pitch_gain;
    float yaw_gain;
    float throttle_gain;
} FlightControllerParams;

// 平衡车控制参数结构体
typedef struct {
    float balance_gain;
    float steering_gain;
} BalancingControllerParams;

// 获取飞行器传感器数据
FlightSensorData getFlightSensorData();

// 获取平衡车传感器数据
BalancingSensorData getBalancingSensorData();

// 发送飞行器控制信号
void sendFlightControlSignal(FlightControlOutput control_output);

// 发送平衡车控制信号
void sendBalancingControlSignal(BalancingControlOutput control_output);

// 飞行器控制函数
FlightControlOutput flightControl(FlightSensorData sensor_data, FlightControllerParams params);

// 平衡车控制函数
BalancingControlOutput balancingControl(BalancingSensorData sensor_data, BalancingControllerParams params);

// 主函数
int main() {
    // 初始化飞行器控制参数
    FlightControllerParams flight_controller_params = {
        .roll_gain = 0.5,
        .pitch_gain = 0.5,
        .yaw_gain = 0.5,
        .throttle_gain = 0.5
    };

    // 初始化平衡车控制参数
    BalancingControllerParams balancing_controller_params = {
        .balance_gain = 0.5,
        .steering_gain = 0.5
    };

    // 主循环
    while (1) {
        // 获取飞行器传感器数据
        FlightSensorData flight_sensor_data = getFlightSensorData();

        // 获取平衡车传感器数据
        BalancingSensorData balancing_sensor_data = getBalancingSensorData();

        // 飞行器控制
        FlightControlOutput flight_control_output = flightControl(flight_sensor_data, flight_controller_params);

        // 平衡车控制
        BalancingControlOutput balancing_control_output = balancingControl(balancing_sensor_data, balancing_controller_params);

        // 发送飞行器控制信号
        sendFlightControlSignal(flight_control_output);

        // 发送平衡车控制信号
        sendBalancingControlSignal(balancing_control_output);
    }

    return 0;
}

在这里插入图片描述

ChatGPT给出了一个软件设计框架,主循环中就干了三件事:1、获取姿态数据,飞行器获取飞行器的,平衡车获取平衡车的;2、运行控制算法,得到控制信号,这个可以理解为根据当前飞行器姿态计算出一个飞行器电机的控制量,根据当前平衡车姿态计算出一个平衡车电机的控制量;3、将飞行器控制量给飞行器电机驱动电路来调节飞行器电机转速,将平衡车控制量给平衡车电机驱动电路来调节平衡车电机转速和方向。大方向好像没错,这里最复杂的应该是第2点的控制算法应该具体怎么做,再问问ChatGPT:
在这里插入图片描述

// 飞行器控制函数
FlightControlOutput flightControl(FlightSensorData sensor_data, FlightControllerParams params) {
    // 获取飞行器姿态信息
    float roll = sensor_data.roll;
    float pitch = sensor_data.pitch;
    float yaw = sensor_data.yaw;
    float throttle = sensor_data.throttle;

    // 计算飞行器控制输出
    float roll_output = roll * params.roll_gain;
    float pitch_output = pitch * params.pitch_gain;
    float yaw_output = yaw * params.yaw_gain;
    float throttle_output = throttle * params.throttle_gain;

    // 返回飞行器控制输出
    FlightControlOutput control_output = {
        .roll = roll_output,
        .pitch = pitch_output,
        .yaw = yaw_output,
        .throttle = throttle_output
    };

    return control_output;
}

// 平衡车控制函数
BalancingControlOutput balancingControl(BalancingSensorData sensor_data, BalancingControllerParams params) {
    // 获取平衡车姿态信息
    float balance = sensor_data.balance;
    float steering = sensor_data.steering;

    // 计算平衡车控制输出
    float balance_output = balance * params.balance_gain;
    float steering_output = steering * params.steering_gain;

    // 返回平衡车控制输出
    BalancingControlOutput control_output = {
        .balance = balance_output,
        .steering = steering_output
    };

    return control_output;
}

在这里插入图片描述
这段伪代码大致描述了如何将传感器数据转换为控制量,貌似就是乘了一个参数,参考意义不大。
根据ChatGPT提供的一些大方向,最终设计出的主板实物如下图所示:
在这里插入图片描述
这款主板已经能完美驾驭四轴飞行器和两轮自平衡小车,目前已在淘宝上线,在淘宝搜索"FlyBalance飞行器平衡车兼容驱动"或者直接点这里跳转,感兴趣的朋友可以移步那里获取更多信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

three.jsgsap滚动交互网页实现 2-创建文字并添加离开动画

添加动画 让聚光灯的角度随着下滑增大,展示完整的场景 const container document.querySelector("#container");gsap.to(light, {angle: 0.7,scrollTrigger: {trigger: container,start: 0,end: innerHeight,scrub: 1},});这样下滑一个屏幕高度聚光灯的角…

Redis——初窥门径

前言 在这篇文章中,荔枝整理了初步了解Redis的一些基础知识和常见指令。通过这篇文章我们可以弄懂Redis具体是什么以及主要的功能、基本数据类型和操作指令。这里注意如果标题后面带*则是仅需要了解就行的知识点哈。 文章目录 前言 一、Redis概述和配置 1.1 概述…

Android Compose UI实战练手----Google Bloom 主页实现(完结)

目录 1.概述2.页面展示2.1 亮色主题2.2 深色主题 3.页面拆分及实现3.1 主页的UI整体UI架构实现3.2 底部导航栏BottomBar的实现3.3 搜索栏SearchBar的实现3.4 Banner实现3.5 中间信息列表BloomInfoList的实现 4.源码地址 1.概述 主页的页面比前面的欢迎页和登录页面要复杂得多&…

Microsoft Visual Studio 2022添加.NET Framework 4.6.2框架,然后说下.NET目标包的作用。

众所周知,Microsoft Visual Studio 2022不再支持.NET Framework 4.6以下的框架。从而导致前期使用老框架开发的某些应用无法打开(打开时提示安装框架,但又安装不成功)的情况出现。 前于如何安装.NET Framework 4.5及更早版本框架的…

Java中的字符串类

提示:字符串类是编程中最常用的一种数据类型,比较重要❗ 文章目录 前言一、字符串类创建对象方式静态创建动态创建 二、String字符串内容不可改变三、字符串常用方法length方法charAt方法substring方法indexOf与lastIndexOfindexOf方法lastIndexOf方法 替…

计算机基础--->数据结构(9)【并查集】

文章目录 并查集的概述并查集的主要用途并查集的实现创建和初始化集合查找当前元素的集合根节点判断两个元素是否处于同一集合合并两个集合对节点的路径进行压缩 并查集的概述 并查集是一种用于解决集合合并和查询问题的数据结构,主要用于实现有关集合的操作&#x…

Skywalking高级使用

Skywalking高级使用 RPC调用监控Mysql调用监控Skywalking常用插件获取追踪ID过滤指定的端点告警功能Skywalking原理Open Tracing介绍 RPC调用监控 Skywalking(6.5.0)支持的RPC框架有以下几种: (1) Dubbo 2.5.4 -> 2.6.0 (2) Dubbox 2.8.4 (3) Apache Dubbo 2.7.…

动态规划 DP (六) 字符串编辑

1.字符串编辑 字符串编辑问题是一类常见的问题,通常涉及对字符串进行插入、删除、替换等操作,以达到某种特定的目标。 常见的字符串编辑问题包括: 编辑距离(Edit Distance):给定两个字符串,通…

最新抖音娱乐测评小程序源码 Thinkphp后端 抖音引流小程序

最新抖音娱乐测评小程序源码 thinkphp后端 抖音引流小程序 附搭建教程 测试环境 NginxPHP7.0MySQL5.6 网站运行目录设置为 /web 数据库配置文件 \source\application\database.php 后台登录地址 http://你的域名/index.php?s/admin/passport/login

python环境

卸载旧环境 wini 打开应用卸载 删除python解释器和pycharm 删除配置文件夹JetBrains C:\Users\CJC\AppData\Roaming\JetBrains 安装 安装python解释器 安装pycharm 查看或设置该项目的解释器和安装包 快捷键 全局搜索 双击shift 当前文件中搜索 ctrl f 查看函数…

MySQL数据库对象与数据备份和还原详解

目录 一、视图 1. 什么是视图 2. 视图与数据表的区别 3. 视图的优点 4. 创建视图 二、索引 1. 什么是索引 2. 为什么要使用索引 3. 索引优缺点 4. 何时不使用索引 5. 索引何时失效 6. 索引分类 6.1 普通索引 6.2 唯一索引 6.3 主键索引 6.4 组合索引 三、数据的…

RabbitMQ系列(25)--RabbitMQ搭建镜像队列

前言:如果RabbitMQ集群中只有一个Broker节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失,虽然可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,这样可以保证消息…

mysql 常用命令综合简单运用

目录 第一大题创建数据库创建用户表及约束字段修改位置修改字段数据类型修改字段名字添加字段修改表名字删除字段修改表的存储引擎 第二大题创建表及外键和其他约束删除外键约束和查找外键名 第三大题创建数据库创建用户同时授权一些功能修改用户的密码更新权限列表查看用户的权…

pytorch线性模型 学习前要学习的基础知识

跟着刘二大人学pytorch,补全一下我的基础缺失 1.numpy基础 import numpy as np from PIL import Image anp.array([1,2,3]) #生成一维数组 print(a) bnp.arange(1,4)#创建等差数组,默认等差是1,数组为1,2,3&#xff0…

spring 详解三 IOC(spring实例化及后处理器)

Spring实例化基本流程 Spring在容器初始化的时候,读取XMl配置,将其封装成BeanDefinition(Bean定义)对象,描述所有bean的信息 BeanDefinition会注册存储到beanDefinitionMap集合中 Spring框架遍历beanDefinitionMap,使用反射创建Be…

pycharm如何给一串中文快捷加引号(方法二)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 商人重利轻别离,前月浮梁买茶去。 大家好,我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

SpringBoot配置动态定时任务

1.配置ScheduledTask 主要是实现SchedulingConfigurer,动态传入cron。 package com.hzl.boot.config;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Propert…

使用promise函数封装post请求,封装aes加解密方法,并进行请求头aes加密,封装sm2国密加解密,进行请求体数据加密,响应数据解密。

export default {async post(url, params { header:{}, data:{} }, showLoading true){if(showLoading){uni.showLoading({title:"加载中",mask:true})}let options{header:{...params.header},url:globalParams.basepathurl.url,data:{...params.data}}//渠道 ae…

Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S

一、说在前面的话 本文是CI篇的上文,因为上一篇已经作了总体设计,就不再赘述,有需要的请看前文。 我们将演示,使用CI工具–jenkins,怎么和CD工具–argocd串联,重点是在Jenkins该怎么做。准备工作和argocd等…

C++常用库函数 5.输入和输出函数

函数名&#xff1a;fclose 函数原型&#xff1a;int fclose(FILE *stream)&#xff1b; 参数&#xff1a;streamFILE 结构的指针。 所需头文件&#xff1a;<cstdio> 返回值&#xff1a;如果该流成功关闭&#xff0c;fclose 返回0。如果出错&#xff0c;则返回 EOF。 功…