精华内容
下载资源
问答
  • px4入门
    2020-09-23 21:27:20

    PX4入门及开发指南

    用户手册

    https://docs.px4.cc/master/zh/index.html

    开发者手册

    https://dev.px4.cc/master/zh/index.html

    更多相关内容
  • PX4FLOW-光流传感器入门说明 详细介绍怎么使用 驱动的安装等等 X4FLOW驱动的安装 PX4 FLOW的 Windows驱动下载:px4 win drivers.zip,下载后解压备用 安装步骤:PX4FLW光流传感器插到WN7系统电脑上,会显小两个未知的PX4...
  • ROS学习笔记之——PX4开发初入门

    千次阅读 多人点赞 2021-07-08 10:57:36
    PX4 Github主页:PX4 Github(代码有分支,请查看v1.10.0分支) PX4开发者手册:PX4手册 v1.11(手册有分支,请查看v1.11.0分支) PX4官方仿真教程 :PX4手册 - gazebo simulation PX4环境配置可参考PX4手册 - ...

    PX4 是一款专业级飞控。 它由来自业界和学术界的世界级开发商开发,并得到活跃的全球社区的支持,为从竞速和物流无人机到地面车辆和潜水艇的各种载具提供动力。

    目录

    基本概念

    QGroundControl(QGC地面站)

    飞行控制系统

    传感器

    无线电控制(遥控)

    动力系统及其他硬件设备

    输出:电机,舵机,执行器

    电调 & 电机

    电池/电源

    安全开关

    数传电台

    机载计算机

    SD卡(可移除储存器)

    开发指南

    PX4开发指南Mac OS

    下载 PX4 源代码

    搭建第一个PX4应用

    启动/构建 SITL 模拟

    编译

    代码测试

    PX4 系统架构概述

    顶层软件架构

    飞行控制栈

     中间件

    参考资料


    基本概念

    首先,我们学习一些基本的概念~

    PX4是与平台无关的自动驾驶仪软件(或称为固件),可以驱动无人机或无人车。它可以被烧写在某些硬件(如Pixhawk v2),并与地面控制站在一起组成一个完全独立的自动驾驶系统。

    PX4 的一些主要功能包括:

    PX4/ArduPilot两种都是开源的可以烧写到Pixhawk飞控中的自驾仪软件。

    APM(Ardupilot Mega)早期也是一款自驾仪硬件,但是更新到了APM3.0版本后,这款自驾仪也就走到了终点。而ArduPilot是属于APM的原生固件,现在ArduPilot也全面支持Pixhawk,而大家也习惯将ArduPilot称为APM。

    两个不同固件都是应用C++开发的,区别在于,PX4是Pixhawk的原生固件,它的架构更加清晰容易维护,但是功能比起APM来讲比较少;而APM相对而言,性能更加稳定成熟,功能也更加丰富,与之相对的就是架构不是太清晰所以不利于维护和修改。

    QGroundControl(QGC地面站)

    地面控制站称为 QGC 地面站 (opens new window)。 您可以使用QGroundControl 将PX4 加载(烧写)到飞行器控制硬件上,可以设置飞行器,更改不同参数,获取实时飞行信息以及创建和执行完全自主的任务。

    QGC即在地面的基站,用于多旋翼飞行器起飞前对自驾行进行传感器校准和参数调整等初始化工作,以及在多旋翼飞行时,通过无线数据模块接受多旋翼的飞行状态并实时发送控制指令。(地面站有:QGC(QGround Control)和MP(Mission Planner)两种不同版本。一般来说,PX4固件使用QGC操作,APM固件配套MP使用。)

    QGroundControl 可以在 Windows,Android,MacOS 或 Linux 上运行(直接下载安装即可,但mac上好像安装不了,可能是权限问题,打开设置,安全与隐私、通用设置一下即可)。

    下载链接:http://qgroundcontrol.com/downloads/

    注意:一旦选中并购买或组装了机架后,在对无人机的飞控初始化阶段,你需要从地面站QGroundControl中众多的机架模板中选择一款和你使用的构造类似的机架。

    飞行控制系统

    所谓无人机的飞控,就是无人机的飞行控制系统。无人机飞控能够稳定无人机飞行姿态,并能控制无人机自主或半自主飞行,是无人机的大脑。

    PX4最初设计为在 Pixhawk 系列 飞控上运行(Pixhawk是第一款专门为PX4自驾软件而设计的无人机飞控),但现在可以在 Linux 计算机和其他硬件上运行。 选择飞行控制板时,您应当考虑飞行器的物理尺寸限制,想要执行的活动,还有必不可少的成本。

    Pixhawk飞控是开源硬件架构,所以全世界很多公司出品了基于Pixhawk的飞控产品。他们都有共同的硬件架构和相同的连接方式、输出接口及功能,仅仅是具体形式不同而已,例如接口的位置不同、外壳不同等等。

    所谓的Pixhawk是一款低成本高性能的飞控硬件平台,相当于一个载体,承载无人机运行的代码。

    Pixhawk的构造:PIXHAWK拥有168MHz的运算频率,其中主处理器为STM32F427,协处理器STM32F103,主处理器和协处理器之间采用串口通信方式。为内置两套陀螺和加速度计MEMS传感器,互为补充矫正,内置三轴磁场传感器并可以外接一个三轴磁场传感器,同时可外接一主一备两个GPS传感器,在故障时自动切换。

     除了PX4这款自驾仪软件,还有一种飞行协议栈(或称自驾仪软件)可以被烧写到Pixhawk飞控,那就是非常流行的ArduPilot或称为APM的自驾仪软件。

    请牢记,Pixhawk飞控是硬件平台,而PX4和APM都是开源的可以烧写到Pixhawk飞控中的自驾仪软件。

    传感器

    PX4 使用传感器来确定飞行器状态(稳定和启用自动控制所需)。 系统*最低要求 *陀螺仪,加速度计,磁力计(罗盘)和气压计。 需要 GPS 或其他定位系统来启用所有自动模式和一些辅助模式。 固定翼和 VTOL 飞行器还应包括空速传感器(强烈推荐)。

    加速度计其定义为去掉重力后的整体加速度。不太好理解,简单来说重力的分解,来测算物体所受的加速度。加速度计也可以测量横滚角、俯仰角。

    优点:加速度计测量角度没有积累误差,低频特性好,可以测量低速的静态加速度。

    缺点:因为其低频特性,容易受高频振动的影响。

    陀螺仪主要测量角速度。利用高速回转体的动量矩敏感壳体相对惯性空间绕正交于自转轴的一个或二个轴的角运动检测装置。优点就是高频特性比较好,可以测量飞机的三个角,即横滚角、俯仰角和偏航角。

    磁力计也被称为指南针可以得到当前磁场的分布。容易收到外界环境的干扰,而且只可以测量到飞机的偏航角。

    无线电控制(遥控)

    遥控(RC)系统用于 手动 控制机体。 它由一个遥控装置组成,使用发射机来与飞行器上的接收机通信。 一些 RC 系统还可以接自动驾驶仪传回的收遥测信息。

    遥控系统:由遥控器和接收器、解码器和伺服系统组成.接收器接到遥控器信号(通常为PWM信号)进行解码,分离出动作信号传输给伺服系统,伺服系统则根据信号做出相应的动作。 

    为了能够对您的PX4无人驾驶仪进行配置、控制及交互,需要先对其进行连接。对于Pixhawk硬件有三种类型的连接:

      遥控连接 – 通过无线电实现遥控器对飞控的连接。

      数据连接 – 使用数传、WiFi或者USB线对QGroundControl地面站和无人机进行的连接。

      机外连接 – PX4和外部能够控制PX4的微机之间的数据连接。

    动力系统及其他硬件设备

    基本动力套装包括单片机、电机、电调、螺旋桨等套装。其余硬件设备还包括机架、电池、GPS、蜂鸣器等等,

    输出:电机,舵机,执行器

    PX4使用输出来控制:电机速度(例如通过ESC),飞行平面如副翼和襟翼,相机触发器,降落伞,抓手,和许多其他类型的有效载荷。

    例如,下面的图像显示 Pixhawk 4 和 Pixhawk 4 mini 的 PWM 输出端口。

    电调 & 电机

    许多 PX4 无人机使用无刷电机,其由飞行控制器通过电子调速器(ESC)驱动(ESC将来自飞行控制器的信号转换为合适的功率水平,传递给电机)。

    电池/电源

    PX4 无人机通常由锂聚合物(LiPo)电池供电。 电池通常使用*电源模块 电源管理板 *连接到系统,它为飞行控制器和 ESC(用于电动机)提供单独的动力。

    安全开关

    机体通常必须有一个 安全开关,然后才能使用 解锁(解锁后,电机会供电,螺旋桨开始旋转)。 通常,安全开关被整合到GPS设备中,但也可能是一个单独的物理组件。

    数传电台

    数传电台 可以在诸如 QGC 地面站 与运行 PX4 的机体之间提供无线 MAVLink 连接。 这使得飞机飞行中调试参数、实时检查遥测信息、更改任务等等成为了可能。

    机载计算机

    PX4 可以通过串行接线或 WiFi 由独立的机载伴飞计算机进行控制。 机载计算机通常使用 MAVLink API(如 MAVSDK 或 MAVROS)进行通信。

    SD卡(可移除储存器)

    PX4 使用 SD 储存卡存储 飞行日志,而且还需要内存卡才能使用 UAVCAN 外围设备,运行 飞行任务

    默认情况下,如果没有 SD 卡,PX4 将在启动时播放 格式化失败(2-声短响) 两次(且上述需要储存卡的功能都不可用)。

    无人机硬件连接如下

    开发指南

    PX4开发指南Mac OS

    PX4代码可以在 Mac OS, Linux 或者 Windows上进行开发,建议在Mac OS和Linux上进行开发,因为图像处理和高级导航在windows上不容易开发。

    这里看看在Mac OS上进行安装(之前博客《ROS实验笔记之——基于Prometheus自主无人机开源项目的学习与仿真》已经在linux上配置了~)

    第一步就是从Mac应用商店中安装Xcode。打开一个新的终端并安装命令行工具:

    xcode-select --install

    然后安装Homebrew 。Homebrew 是最简单和灵活的方式,用来在 Mac OS X 安装 Linux 工具包(https://blog.csdn.net/jdsjlzx/article/details/108081327)。

    安装过程很简单:

    https://gitee.com/cunkai/HomebrewCN

    /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

    HomeBrew是ruby脚本,但是mac下不需要安装ruby解释环境,系统自带了。

    安装好后,可以运行下面命令,通过检查homebrew版本确认是否安装成功。

    brew –v

    安装好Homebrew以后,拷贝以下命令到终端命令行:

    brew tap PX4/px4
    brew tap PX4/simulation(安装不了)
    brew update
    brew install git bash-completion genromfs kconfig-frontends gcc-arm-none-eabi
    brew install astyle cmake ninja
    # simulation tools
    brew install ant graphviz sdformat3 eigen protobuf
    brew install opencv

    再安装以下:

    brew tap PX4/px4
    brew install px4-dev
    # 可选,但建议安装额外的仿真模拟用工具
    brew install px4-sim

    遇到安装不成功,可以看看https://www.cnblogs.com/my-blogs-for-everone/articles/14256182.html

    然后安装python包:

    sudo easy_install pip
    sudo pip install pyserial empy pandas jinja2
    Java for jMAVSim
    brew install xquartz java

    Gazebo仿真

    sudo easy_install pip
    sudo -H pip install pyserial empy toml numpy pandas jinja2 pyyaml
    # install required packages using pip3
    python3 -m pip install --user pyserial empy toml numpy pandas jinja2 pyyaml pyros-genmsg packaging
    # if this fails with a permissions error, your Python install is in a system path - use this command instead:
    sudo -H python3 -m pip install --user pyserial empy toml numpy pandas jinja2 pyyaml pyros-genmsg packaging

    jMAVSim 仿真模拟

    brew install --cask xquartz
    brew install px4-sim-gazebo

    gazebo安装出错:http://gazebosim.org/tutorials?tut=install_on_mac

    其他额外工具

    brew tap AdoptOpenJDK/openjdk
    brew install --cask adoptopenjdk15
    brew install px4-sim-jmavsim

    安装完毕

    安装IDE vscode

    下载px4的源代码

    git clone https://github.com/PX4/PX4-Autopilot.git

    通过vscode打开并编译(Select the PX4-Autopilot directory and then press OK.)

    Install extensions

    将推荐的都安装,然后cmake(依次点击小红框,选择px4_sitl)

    Select Cmake build target

    调试成功后会显示:

    然后点击build(其中可能会报错,需要安装一些依赖,安报错的要求安装即可)

    You can then kick off a build from the config bar (select either Build or Debug). 

    Run debug or build

    After building at least once you can now use [code completion](#code completion) and other VSCode features.

    下载 PX4 源代码

    git clone --recursive https://github.com/google/bloaty.git /tmp/bloaty \
          && cd /tmp/bloaty && cmake -GNinja . && ninja bloaty && cp bloaty /usr/local/bin/ \
          && rm -rf /tmp/*

    初次编译(使用 jMAVSim 模拟器)

    导航到 Firmware 目录,并使用以下命令启动 jMAVSim

    make px4_sitl jmavsim

    如下图所示

    报错了,估计就是JDK版本不一致

    参考链接:https://docs.px4.io/master/en/simulation/jmavsim.html#troubleshooting

    里面要安装版本15好像没错~但是细细一看,应该是16才对,所以重新运行

     brew install --cask adoptopenjdk16

     再试试~终于ok了~

    打开地面站

     然后运行

    pxh> commander takeoff

    搭建第一个PX4应用

    源代码在/src/examples/px4_simple_app中

    启动/构建 SITL 模拟

    # 启动固定翼机型的 Gazebo
    make px4_sitl gazebo_plane
    
    # 启动有光流的Iris机型的 Gazebo
    make px4_sitl gazebo_iris_opt_flow
    
    # 启动Iris(默认机型)的 JMavSim
    make px4_sitl jmavsim

    编译

    编写完应用后需要编译。

    To enable the compilation of the application into the firmware create a new line for your application somewhere in the cmake file:

    examples/px4_simple_app

    Build the example using the board-specific command:

    • jMAVSim Simulator: make px4_sitl_default jmavsim
    • Pixhawk v1/2: make px4_fmu-v2_default (or just make px4_fmu-v2)
    • Pixhawk v3: make px4_fmu-v4_default
    • Other boards: Building the Code

    代码测试

    Enter px4_simple_app to run the minimal app.

    pxh> px4_hello_app
    INFO  [px4_simple_app] Hello Sky!
    

    The application can now be extended to actually perform useful tasks

    源代码如下: 

    #include <px4_platform_common/log.h>
    
    //The main function must be named <module_name>_main and exported from the module as shown.
    __EXPORT int px4_hello_app_main(int argc, char *argv[]);
    int px4_hello_app_main(int argc, char *argv[])
    {
    	PX4_INFO("Hello Sky! 666666");//打印输出(included from px4_platform_common/log.h)
    	//有几种不同的形式:PX4_INFO, PX4_WARN, PX4_ERR, PX4_DEBUG
    	return OK;
    }
    

    订阅传感器的信息

    #include <px4_platform_common/log.h>//include用于PX4_INFO
    #include <uORB/topics/sensor_combined.h> //订阅传感器用
    #include <px4_platform_common/px4_config.h>
    #include <px4_platform_common/tasks.h>
    #include <px4_platform_common/posix.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <poll.h>
    #include <string.h>
    
    #include <uORB/uORB.h>
    #include <uORB/topics/sensor_combined.h>
    #include <uORB/topics/vehicle_attitude.h>
    
    //The main function must be named <module_name>_main and exported from the module as shown.
    __EXPORT int px4_hello_app_main(int argc, char *argv[]);
    int px4_hello_app_main(int argc, char *argv[])
    {
    	PX4_INFO("Hello Sky! 666666");//打印输出(included from px4_platform_common/log.h)
    	//有几种不同的形式:PX4_INFO, PX4_WARN, PX4_ERR, PX4_DEBUG
    
    	//订阅传感器的信息
    	int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));//有点类似ros中创建订阅者
    	//“sensor_sub_fd”是一个消息句柄,能够十分有效处理新数据的到来之前的延迟等待。
    	//当前线程会休眠,直到新的传感器数据到来时,被调度器唤醒,并且在等待时不需要占用任何的CPU时间。
    
    	/* one could wait for multiple topics with this technique, just using one here */
    	px4_pollfd_struct_t fds[] = {
    		{ .fd = sensor_sub_fd,   .events = POLLIN },
    		/* there could be more file descriptors here, in the form like:
    		 * { .fd = other_sub_fd,   .events = POLLIN },
    		 */
    	};
    
    	int error_counter = 0;
    
    	for (int i = 0; i < 5; i++) {
    		/* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */
    		int poll_ret = px4_poll(fds, 1, 1000);
    
    		/* handle the poll result */
    		if (poll_ret == 0) {
    			/* this means none of our providers is giving us data */
    			PX4_ERR("[px4_simple_app] Got no data within a second");
    
    		} else if (poll_ret < 0) {
    			/* this is seriously bad - should be an emergency */
    			if (error_counter < 10 || error_counter % 50 == 0) {
    				/* use a counter to prevent flooding (and slowing us down) */
    				PX4_ERR("[px4_simple_app] ERROR return value from poll(): %d"
    					, poll_ret);
    			}
    
    			error_counter++;
    
    		} else {
    
    			if (fds[0].revents & POLLIN) {
    				/* obtained data for the first file descriptor */
    				struct sensor_combined_s raw;
    				/* copy sensors raw data into local buffer */
    				orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);
    				PX4_WARN("[px4_simple_app] Accelerometer:\t%8.4f\t%8.4f\t%8.4f",
    					 (double)raw.accelerometer_m_s2[0],
    					 (double)raw.accelerometer_m_s2[1],
    					 (double)raw.accelerometer_m_s2[2]);
    
    			}
    
    		}
    	}
            PX4_INFO("exiting");
    
    	return OK;
    }
    
    

    PX4 系统架构概述

    PX4 由两个主要部分组成:

    • 一是 飞行控制栈(flight stack) ,该部分主要包括状态估计和飞行控制系统;
    • 另一个是 中间件 ,该部分是一个通用的机器人应用层,可支持任意类型的自主机器人,主要负责机器人的内部/外部通讯和硬件整合。

    所有的 PX4 支持的无人机机型(包括其他诸如无人船、无人车、无人水下航行器等平台)均共用同一个代码库。 整个系统采用了响应式(reactive)设计,这意味着:

    • 所有的功能都可以被分割成若干可替换、可重复使用的部件。
    • 通过异步消息传递进行通信。
    • 系统可以应对不同的工作负载。

    顶层软件架构

    下面的架构图对 PX4 的各个积木模块以及各模块之间的联系进行了一个详细的概述。 图的上半部分包括了中间件模块,而下半部分展示的则是飞行控制栈的组件。

    上图中的箭头表示的是各个模块之间 最重要的 信息流连接。 实际运行时各模块之间信息流的连接数目比图中展示出来的要多很多,且部分数据(比如:配置参数)会被大部分模块访问。

    PX4 系统通过一个名为 uORB 的 发布-订阅 消息总线实现模块之间的相互通讯。 使用 发布-订阅 消息总线这个方案意味着:

    • 系统是 “响应式” 的 — 系统异步运行,新数据抵达时系统立即进行更新。
    • 系统所有的活动和通信都是完全并行的。
    • 系统组件在任何地方都可以在保证线程安全的情况下使用数据。

    飞行控制栈

    飞行控制栈是针对自主无人机设计的导航、制导和控制算法的集合。 它包括了为固定翼、旋翼和 VTOL 无人机设计的控制器,以及相应的姿态、位置估计器。下图展示了飞行控制栈的整体架构, 它包含了从传感器数据、 RC 控制量输入 到自主飞行控制(制导控制器,Navigator ),再到电机、舵机控制(执行器,Actuators)的全套通路。

     估计器 (estimator) 取一个或者多个传感器数据作为输入量,并进行数据融合进而计算出无人机的状态(例如:从 IMU 传感器数据计算得到无人机的姿态角)。

    控制器 (controller) 组件以一个期望设定值和一个测量值或状态估计量(过程变量)作为输入, 它的目标是将过程变量的实际值调整到与期望设定值相一致, 得到的输出量实现对状态变量的矫正以使其最终抵达期望的设定值。 以位置控制器为例,该控制器以期望位置作为输入,过程变量是当前位置的估计值,控制器最终输出的是将引导无人机前往期望位置的姿态、油门指令。

    混合器 (mixer) 响应力的指令(例如右转),并将其转换为单独的电机指令并保证产生的指令不超限。 每一类飞机都有特定的指令转换方式且受许多因素的影响,例如:电机关于重心的安装位置,飞机的惯性矩参数等。

     中间件

    中间件 主要包由载嵌入式传感器驱动、与外界的通讯(配套计算机, GCS 等)以及 uORB 发布-订阅 消息总线三部分组成。

    此外,中间件还包括一个 仿真应用层 以实现在桌面操作系统运行 PX4 飞行代码并在计算机的模拟“世界”中控制由计算机建模得到的无人机。

    参考资料

    展开全文
  • PX4FLOW-光流传感器入门说明 详细介绍怎么使用 驱动的安装等等
  • 这学期有一门机器人导论课程,最近在课程实验中使用了turtlebot,对ROS下机器人应用的开发有了深入的理解,经验在px4开发上也同样适用。 根据turtlebot实验的经验,我开始有能力阅读px4例程源码。根据官方教程的指导...

    上一篇ROS及PX4环境搭建


    1. 前言

    这学期有一门机器人导论课程,最近在课程实验中使用了turtlebot,对ROS下机器人应用的开发有了深入的理解,经验在px4开发上也同样适用。
    根据turtlebot实验的经验,我开始有能力阅读px4例程源码。根据官方教程的指导,我学会了如何用gazebo仿真环境下运行C++程序。

    • turtlebot和px4的区别
      • 编译方式
    展开全文
  • 飞控简析-从入门到跑路 第一章PX4的姿态控制(2)-附件资源
  • PX4固件版本1.11.0 代码位置 一、期望姿态生成 代码在mc_att_control_main.cpp中,具体如下. void MulticopterAttitudeControl::generate_attitude_setpoint(const Quatf &q, float dt, bool reset_yaw_sp) { ...

    前言

    一个人可以走的更快,一群人才能走的更远,交流学习加qq:2096723956
    更多保姆级PX4+ROS学习视频:https://b23.tv/ZeUDKqy
    PX4固件版本1.11.0
    参考 https://zhuanlan.zhihu.com/p/81847591

    一、期望姿态生成

    代码位置
    请添加图片描述

    代码在mc_att_control_main.cpp中,具体如下.

    void
    MulticopterAttitudeControl::generate_attitude_setpoint(const Quatf &q, float dt, bool reset_yaw_sp)
    {
    	vehicle_attitude_setpoint_s attitude_setpoint{};
    

    从四元数中获取当前偏航角

    const float yaw = Eulerf(q).psi();
    

    如果需要重置的话将期望偏航角重置为当前偏航角

    if (reset_yaw_sp) {
    	_man_yaw_sp = yaw;
    }
    

    如果遥控器油门大于0.05或者airmode为roll_pitch_yaw

     else if (_manual_control_setpoint.z > 0.05f || _param_mc_airmode.get() == (int32_t)Mixer::Airmode::roll_pitch_yaw)
    

    获取最大偏航角速率

      {
    		const float yaw_rate = math::radians(_param_mpc_man_y_max.get());
    

    根据最大偏航角速率和遥控器偏航输入(归一化后)计算期望偏航角速率

    attitude_setpoint.yaw_sp_move_rate = _manual_control_setpoint.r * yaw_rate;
    

    根据期望偏航角速率计算期望偏航角(求积分)

    	_man_yaw_sp = wrap_pi(_man_yaw_sp + attitude_setpoint.yaw_sp_move_rate * dt);
    }
    

    遥控器横滚俯仰通道低通滤波,如下图

    请添加图片描述

    _man_x_input_filter.setParameters(dt, _param_mc_man_tilt_tau.get());
    _man_y_input_filter.setParameters(dt, _param_mc_man_tilt_tau.get());
    _man_x_input_filter.update(_manual_control_setpoint.x * _man_tilt_max);
    _man_y_input_filter.update(_manual_control_setpoint.y * _man_tilt_max);
    const float x = _man_x_input_filter.getState();
    const float y = _man_y_input_filter.getState();
    

    用旋转向量表示期望的倾斜量(即横滚和俯仰),旋转轴即下面的(v(0), v(1), 0.f),旋转角度即该向量的摸.这里先进行角度限幅,对向量v取模,表示倾斜角度.

    Vector2f v = Vector2f(y, -x);
    float v_norm = v.norm(); 
    

    倾斜角度限幅

    if (v_norm > _man_tilt_max) { // limit to the configured maximum tilt angle
    	v *= _man_tilt_max / v_norm;
    }
    

    轴角转四元数

    Quatf q_sp_rpy = AxisAnglef(v(0), v(1), 0.f);
    

    转换代码如下图
    请添加图片描述

    四元数转欧拉角,分两步进行

    Eulerf euler_sp = q_sp_rpy;
    

    第一步四元数转DCM矩阵
    请添加图片描述
    第二步DCM矩阵转欧拉角
    请添加图片描述
    对期望的横滚和俯仰进行赋值.

    attitude_setpoint.roll_body = euler_sp(0);
    attitude_setpoint.pitch_body = euler_sp(1);
    

    补偿偏航角
    前面的轴角只是取了遥控器的横滚和俯仰的旋转量,因此旋转轴是水平方向的,在转化为欧拉角后,会产生一个额外的偏航角euler_sp(2),如下,其中q2=0.
    请添加图片描述

    attitude_setpoint.yaw_body = _man_yaw_sp + euler_sp(2);
    

    如果是vtol,则始终以期望的偏航角方向叠加俯仰和横滚,而不是以当前的偏航

    	if (_vtol) {
    

    计算航向的误差

    float yaw_error = wrap_pi(attitude_setpoint.yaw_body - yaw);
    

    定义Z轴向量

    Vector3f zB = {0.0f, 0.0f, 1.0f};
    

    定义仅包含俯仰和横滚旋转的旋转矩阵

    Dcmf R_sp_roll_pitch = Eulerf(attitude_setpoint.roll_body, attitude_setpoint.pitch_body, 0.0f);
    

    计算旋转z轴后的向量

    Vector3f z_roll_pitch_sp = R_sp_roll_pitch * zB;
    

    定义表示偏航角误差的旋转矩阵

    Dcmf R_yaw_correction = Eulerf(0.0f, 0.0f, -yaw_error);
    

    将偏航角误差补偿到代表横滚和俯仰旋转的向量中,相当于将以期望偏航角为基准的俯仰和横滚旋转变换到以当前偏航角为基准的俯仰和横滚,这在偏航角存在较大误差时,避免了偏航偏航通道与俯仰横滚通道的耦合.

    z_roll_pitch_sp = R_yaw_correction * z_roll_pitch_sp;
    

    从向量中获取俯仰和横滚的期望角度值

    attitude_setpoint.roll_body = -asinf(z_roll_pitch_sp(1));
    attitude_setpoint.pitch_body = atan2f(z_roll_pitch_sp(0), z_roll_pitch_sp(2));
    }
    

    欧拉角转四元数,油门取遥控器油门值,赋值并发布

    Quatf q_sp = Eulerf(attitude_setpoint.roll_body, attitude_setpoint.pitch_body, attitude_setpoint.yaw_body);
    q_sp.copyTo(attitude_setpoint.q_d);
    attitude_setpoint.thrust_body[2] = -throttle_curve(_manual_control_setpoint.z);
    attitude_setpoint.timestamp = hrt_absolute_time();
    _vehicle_attitude_setpoint_pub.publish(attitude_setpoint);
    }
    

    二、姿态角控制

    代码位置
    请添加图片描述

    定义期望姿态四元数,由上一节期望姿态生成求得.

    Quatf qd = _attitude_setpoint_q;
    

    计算当前姿态四元数对应的机体坐标系Z轴单位向量,在机载NED系下表示

    const Vector3f e_z = q.dcm_z();
    

    计算期望姿态四元数对应的机体坐标系Z轴单位向量,在机载NED系下表示

    const Vector3f e_z_d = qd.dcm_z();
    

    计算去除旋转误差后仅代表倾斜误差的四元数,计算公式如下:
    请添加图片描述

    Quatf qd_red(e_z, e_z_d);
    

    无旋转运动时,直接赋值为期望四元数

    if (fabsf(qd_red(1)) > (1.f - 1e-5f) || fabsf(qd_red(2)) > (1.f - 1e-5f)) {
    	qd_red = qd;
    }
    

    否则将旋转轴从N系转换到B系:
    请添加图片描述
    结合当前姿态,我们可以得到仅代表倾斜运动的期望四元数:
    请添加图片描述

    qd_red *= q;是将上面两步合成了一步.

    else {
    // transform rotation from current to desired thrust vector into a world frame reduced desired attitude
    qd_red *= q;
    }
    根据期望四元数和倾斜期望四元数可以得到代表旋转运动的期望四元数请添加图片描述

    Quatf q_mix = qd_red.inversed() * qd;
    

    根据旋转运动的性质,q_mix一定可以表示为(cos(α_mix/2),0,0,sin(α_mix/2)):

    q_mix.canonicalize();
    q_mix(0) = math::constrain(q_mix(0), -1.f, 1.f);
    q_mix(3) = math::constrain(q_mix(3), -1.f, 1.f);
    

    限制旋转误差,最后结合倾斜运动和受限制旋转运动组成新的期望四元数

    qd = qd_red * Quatf(cosf(_yaw_w * acosf(q_mix(0))), 0, 0, sinf(_yaw_w * asinf(q_mix(3))));
    

    根据新四元数姿态期望计算四元数误差

    const Quatf qe = q.inversed() * qd;
    

    根据实际意义选取姿态误差为:eq=2*sign(qe(0))*qe(1:3)

    const Vector3f eq = 2.f * qe.canonical().imag();
    

    根据姿态误差计算期望角速度

    matrix::Vector3f rate_setpoint = eq.emult(_proportional_gain);
    

    增加偏航角速度前馈

    rate_setpoint += q.inversed().dcm_z() * _yawspeed_setpoint;
    

    角速度期望输出限幅

    for (int i = 0; i < 3; i++) {
    	rate_setpoint(i) = math::constrain(rate_setpoint(i), -_rate_limit(i), _rate_limit(i));
    }
    return rate_setpoint;
    

    三、姿态角速率控制

    代码位置
    请添加图片描述
    角速率控制
    获取角速率误差,期望姿态由姿态角控制生成

    Vector3f rate_error = rate_sp - rate;
    

    PID控制

    const Vector3f torque = _gain_p.emult(rate_error) + _rate_int - _gain_d.emult(angular_accel) + _gain_ff.emult(rate_sp);
    

    未落地时才更新积分

    if (!landed) {
    	updateIntegral(rate_error, dt);
    }
    
    return torque;
    

    更新积分
    抗积分饱和

    for (int i = 0; i < 3; i++) {
    

    防止积分正向饱和

    if (_mixer_saturation_positive[i]) {
    	rate_error(i) = math::min(rate_error(i), 0.f);
    }
    

    防止积分负向饱和

    if (_mixer_saturation_negative[i]) {
    	rate_error(i) = math::max(rate_error(i), 0.f);
    }
    

    积分项因子i_factor,用于抵消积分过程中的非线性效应,否则在误差较大时积分会快速累积.当误差较小时,该项接近1,对积分项基本无影响,当误差较大时,该项接近0,对积分项有较大的削弱.

    float i_factor = rate_error(i) / math::radians(400.f);
    i_factor = math::max(0.0f, 1.f - i_factor * i_factor);
    

    求积分

    float rate_i = _rate_int(i) + i_factor * _gain_i(i) * rate_error(i) * dt;
    

    限幅

    	if (PX4_ISFINITE(rate_i)) {
    		_rate_int(i) = math::constrain(rate_i, -_lim_int(i), _lim_int(i));
    	}
    }
    
    展开全文
  • 里面有代码和视频,还有一些WORD的讲解文档,一共8个文件,4个.C代码,一个视频,一个代码理解,一个固件编译下载,一个光流入门PDF
  • 首先,我们要清楚的我们的需求,PX4的位置控制需要完成什么样的工作。位置控制需要完成的是,从期望位置得到期望姿态的一个过程,然后把期望姿态传递给姿态控制模块,所以位置控制的输入是期望位置,输出是期望姿态...
  • 文章目录前言一、PX4是什么?二、PX4能做什么?1.支持的载具2.支持的飞控硬件二、PX4架构二、如何开发PX4?二、基于PX4的集群开发二、基于PX4的避障开发总结 前言 设计无人机的飞控是一个非常复杂的工程,因此对于...
  • 1.什么是姿态 一个无人机,或者说一个物体,在空间上总是有6个自由度,分别对应XYZ轴的移动以及转动。简单的说,就是前后方向的移动,左右方向的移动,上下方向的移动,共3个自由度,这是位置。...
  • 首先,我们先下载PX4的源码。本人将要分析的为1.54版本的PX4源码。 1.官方地址传送门:https://github.com/PX4/Firmware/archive/v1.5.4.zip 2.百度网盘:https://pan.baidu.com/s/1HYUuxED1Nv2_uE_sMx1RQQ 打开...
  • 本节主要记录自己学px4的代码架构与Ardupilot代码架构地方对比文档,欢迎批评指正。 (1)px4与apm固件的区别与联系 (2)px4与apm每个文件夹的作用 (3)px4与apm无人机的启动过程 1.px4与apm的区别...
  • 刚刚入门ROS开发,作为刚刚挺过艰难的ubuntu安装、ros安装的萌新来说,你应该正处于ROS开发的初始过渡阶段。一方面,你庆幸你解决了许多安装新系统的许多bug,跨过了阻拦了无数人入门ROS的一道坎,另一方面,你开始...
  • 文章目录前言一、自定义UORB消息二、创建...本文主要介绍利用PX4进行二次开发所需的基础知识,磨刀不误砍柴工,掌握这些知识是进行二次开发的前提. 一、自定义UORB消息 1.创建msg文件 PX4中所有的UORB消息都有一个m
  • 新手入门 专业名词解释 aircraft:任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机(航空器). uav:无人驾驶飞机 vehicle:飞行器 airplane/plane/aero-plane :有机翼和一个或多个引擎的飞行器统称为飞机 ...
  • ROS+Gazebo+PX4仿真步骤

    千次阅读 2021-08-28 09:31:38
    本文参考链接:[入门教程] PX4-Gazebo仿真 - 知乎 (zhihu.com) 1、参照上一个帖子手把手教你如何安装ROS+Gazebo+PX4开发环境(ubuntu18.04 + Melodic)完成开发环境的安装。 2、了解PX4包含哪些仿真工具 仿真首先...
  • PX4学习笔记】1. ROS及PX4环境搭建

    千次阅读 2020-11-26 18:18:58
    环境 Ubuntu18.04 安装教程参考 ...安装过程中问题的解决 问题1 rosdep init 错误的终极解决方法 注意etc/下的ros和rostep文件夹要自己建 问题2 ...问题4:GeographicLib的安装 教程中安装GeographicLib d
  • 怎么在px4中添加自己的模块在“px4固件目录结构和代码风格”这一节,曾经说过NuttX是一个实时的嵌入式系统,上面可以像windows那样运行程序。那既然是应用程序,那我们应该也能写一些可以在NuttX上运行的程序。这...
  • PX4开发基础

    千次阅读 2020-03-26 22:18:21
    文章目录一、与无人机的缘分二、开发前三、背景知识硬件PIXHAWKpixhawkV1:pixhawkV2:pixhawkV3x:软件代码ArduPilotPX4(推荐)地面站(GCS)Mission Planner(MP)QGroundControl(QGC)四、我的开发环境 ...
  • [入门教程] PX4-Gazebo仿真 无人机仿真之搭建仿真平台-SITL、gazebo、ROS XTDrone使用文档 ROS的安装-> rosdep init /update报错2021.5.6实测有效 Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建 gazebo...
  • Ros_PX4_Mavros从零入门--哪些坑

    千次阅读 2020-04-06 17:45:17
    最后启动需要先启动gazebo: make px4_sitl gazebo 然后启动mavros: roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557" 最后在启动Ros节点: rosrun px4_simu px4_simu_node 就可以看到gazebo...
  • PX4和ardupilot(APM)的对比

    千次阅读 2020-08-07 14:18:26
    1、APM历史要远长于PX4,因此功能更丰富,经历的坑也更多,填的坑也更多,因此有“功能完善、运行稳定”的优势(这里的稳定指的是由于程序问题莫名其妙炸机的情况少);2、APM与PX4在一些关键算法上是相互借鉴的,...
  • PX4学习过程遇到的问题及解决方法一、 安装时遇到的问题二、 添加环境变量 一、 安装时遇到的问题 1.安装时使用amov制作的ubuntu18.04环境包,该系统是通过systemback软件打包好的ubuntu系统,省去了PX4和ros等环境...
  • 入门 安装 通过npm添加 $ npm install babel-plugin-styled-components-px2vw --save-dev 或纱线 $ yarn add -D babel-plugin-styled-components-px2vw 配置 babel.config.js: module . exports = { plugins : ...
  • 瑞芯微RK PX30开发板中文详解(带开源资料)简介-附件资源
  • NVIDA PX2 入门

    千次阅读 2018-03-26 20:27:23
    偶然间看到一篇文章说UART3串口是TTL电平,不是RS232电平,用的时候注意。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,233
精华内容 24,893
关键字:

px4入门