使用uart数据起飞

2023-05-16

使用uart得到的位置信息进行起飞


在得到了位置信息的前提下,我们开始进行模拟起飞,即使用usb供电,人工控制其高度,在上位机查看油门大小,电机的pwm输出。

  1. commander.cpp
    在commander.cpp中,主要是判断能不能切换到takeoff模式,并且设置一些标志位,为takeoff做准备
  2. navigator_main.cpp
    在navigator中,只要是通过run()重载,来确定使用的函数,takeoff模式下当然是进入takeoff.cpp。

    1. 在navigator_main.cpp中有设置takeoff triplet
      这里面主要是设置了rep->current ,为takeoff.cpp准备

      position_setpoint_triplet_s *rep = get_takeoff_triplet();
      
      // store current position as previous position and goal as next
      rep->previous.yaw = get_global_position()->yaw;
      rep->previous.lat = get_global_position()->lat;
      rep->previous.lon = get_global_position()->lon;
      rep->previous.alt = get_global_position()->alt;
      
      rep->current.loiter_radius = get_loiter_radius();
      rep->current.loiter_direction = 1;
      rep->current.type = position_setpoint_s::SETPOINT_TYPE_TAKEOFF;
      
      if (home_position_valid()) {
          rep->current.yaw = cmd.param4;
          rep->previous.valid = true;
      
      } else {
          rep->current.yaw = get_local_position()->yaw;
          rep->previous.valid = false;
      }
      
      if (PX4_ISFINITE(cmd.param5) && PX4_ISFINITE(cmd.param6)) {
          rep->current.lat = (cmd.param5 < 1000) ? cmd.param5 : cmd.param5 / (double)1e7;
          rep->current.lon = (cmd.param6 < 1000) ? cmd.param6 : cmd.param6 / (double)1e7;
      
      } else {
          // If one of them is non-finite, reset both
          rep->current.lat = NAN;
          rep->current.lon = NAN;
      }
      
      rep->current.alt = cmd.param7;
      
      rep->current.valid = true;
      rep->next.valid = false;
    2. takeoff.cpp
      on_activation()设置高度数据abs_altitude,并且需要设置坐标经纬度的数据,由于不使用gps,所以没有经纬度的数据,这里我们将lpe输出的xy数据赋值给经纬度的变量
      set_takeoff_item(&_mission_item, abs_altitude)

      item->lat = _navigator->get_local_position()->x;
      item->lon = _navigator->get_local_position()->y;

      将经纬度的变量赋值给位置期望
      mission_item_to_position_setpoint(_mission_item, &pos_sp_triplet->current)

      sp->lat = item.lat;
      sp->lon = item.lon;
      
      sp->alt = item.altitude_is_relative ? item.altitude + _navigator->get_home_position()->alt : item.altitude;
      sp->yaw = item.yaw;
      sp->yaw_valid = PX4_ISFINITE(item.yaw);
      sp->loiter_radius = (fabsf(item.loiter_radius) > NAV_EPSILON_POSITION) ? fabsf(item.loiter_radius) :
                  _navigator->get_loiter_radius();
      sp->loiter_direction = (item.loiter_radius > 0) ? 1 : -1;
      sp->acceptance_radius = item.acceptance_radius;
      
      sp->cruising_speed = _navigator->get_cruising_speed();
      sp->cruising_throttle = _navigator->get_cruising_throttle();
      switch (item.nav_cmd) {
      case NAV_CMD_TAKEOFF:
      
          // if already flying (armed and !landed) treat TAKEOFF like regular POSITION
          if ((_navigator->get_vstatus()->arming_state == vehicle_status_s::ARMING_STATE_ARMED)
              && !_navigator->get_land_detected()->landed) {
      
              sp->type = position_setpoint_s::SETPOINT_TYPE_POSITION;
      
          } else {
              sp->type = position_setpoint_s::SETPOINT_TYPE_TAKEOFF;
      
              // set pitch and ensure that the hold time is zero
              sp->pitch_min = item.pitch_min;
          }
      
          break;
      }
      
      sp->valid = true;
      
      return sp->valid;
  3. position_control.cpp
    因为takeoff原本使用的是gps的数据,在位置控制的时候,px4将其进行坐标转化,转化为机体坐标系的数据,在navigator中我们使用的就是机体坐标系的xy数据,所以不需要进行坐标系的转化。
    坐标系转化:

    //only project setpoints if they are finite, else use current position
    if (PX4_ISFINITE(_pos_sp_triplet.current.lat) &&
        PX4_ISFINITE(_pos_sp_triplet.current.lon)) {
        /* project setpoint to local frame */
        map_projection_project(&_ref_pos,
                       _pos_sp_triplet.current.lat, _pos_sp_triplet.current.lon,
                       &curr_pos_sp.data[0], &curr_pos_sp.data[1]);
    
        _triplet_lat_lon_finite = true;
    }

    改动:

    //only project setpoints if they are finite, else use current position
    if (PX4_ISFINITE(_pos_sp_triplet.current.x) &&
        PX4_ISFINITE(_pos_sp_triplet.current.y)) {
        /* project setpoint to local frame */
        curr_pos_sp(0) = _pos_sp_triplet.current.x;
        curr_pos_sp(1) = _pos_sp_triplet.current.y;
    
        _triplet_lat_lon_finite = true;
    }else if (PX4_ISFINITE(_pos_sp_triplet.current.lat) &&
            PX4_ISFINITE(_pos_sp_triplet.current.lon)) {
            /* project setpoint to local frame */
            map_projection_project(&_ref_pos,
                           _pos_sp_triplet.current.lat, _pos_sp_triplet.current.lon,
                           &curr_pos_sp.data[0], &curr_pos_sp.data[1]);
    
            _triplet_lat_lon_finite = true;
        }
  4. 模拟飞行
    解锁之后应该能看到油门数据突变,变为油门悬停值,当你升高飞行器至起飞高度后,模式切换为loier (待添加图片)

  5. 起飞之后

    起飞之后在on_active()函数中会判断是不是到达了起飞点is_mission_item_reached()

    它的思路是先判断有没有到达起飞高度或者任务点,在判断yaw有没有到,最后判断是不是在航线里。
    因为使用的是takeoff模式,所以先判断有没有到达起飞高度,也只需要修改起飞高度,yaw会以当前的yaw为期望,起飞之后yaw一定是满足err的,航线与takeoff模式无关。

    if ((_mission_item.nav_cmd == NAV_CMD_TAKEOFF || _mission_item.nav_cmd == NAV_CMD_VTOL_TAKEOFF)
            && _navigator->get_vstatus()->is_rotary_wing) {
    
            /* We want to avoid the edge case where the acceptance radius is bigger or equal than
             * the altitude of the takeoff waypoint above home. Otherwise, we do not really follow
             * take-off procedures like leaving the landing gear down. */
    
            float takeoff_alt = _mission_item.altitude_is_relative ?
                        _mission_item.altitude :
                        (_mission_item.altitude - _navigator->get_home_position()->alt);
    
            float altitude_acceptance_radius = _navigator->get_altitude_acceptance_radius();
    
            /* It should be safe to just use half of the takoeff_alt as an acceptance radius. */
            if (takeoff_alt > 0 && takeoff_alt < altitude_acceptance_radius) {
                altitude_acceptance_radius = takeoff_alt / 2.0f;
            }
    
            /* require only altitude for takeoff for multicopter */
            if(_navigator->home_position_valid()){
                if (_navigator->get_global_position()->alt >
                    altitude_amsl - altitude_acceptance_radius) {
                    _waypoint_position_reached = true;
                }
            }
            else {
                if(- _navigator->get_local_position()->z > altitude_amsl -0.2f){
                    _waypoint_position_reached = true ;
                }
            }
    

    可以看到,模式是takeoff且是四旋翼的时候才会进入这个if语句里,在最后我用home_position_valid来判断是不是使用的gps,不是的话,我就判断当前的高度与期望的高度差,满足阈值的话,就认为到达了高度

  6. takeoff之后

    takeoff完成了之后,飞行器会切换到loiter模式,但是我们使用的是uart的数据,没有gps,所以我们必须进行修改,一: 到达高度之后切换模式为position。二:修改loiter的数据

    我选择修改loiter的使用数据:

        void
    MissionBlock::set_loiter_item(struct mission_item_s *item, float min_clearance)
    {
        if (_navigator->get_land_detected()->landed) {
            /* landed, don't takeoff, but switch to IDLE mode */
            item->nav_cmd = NAV_CMD_IDLE;
    
        } else {
            item->nav_cmd = NAV_CMD_LOITER_UNLIMITED;
    
            struct position_setpoint_triplet_s *pos_sp_triplet = _navigator->get_position_setpoint_triplet();
            if(_navigator->home_position_valid()){
                if (_navigator->get_can_loiter_at_sp() && pos_sp_triplet->current.valid) {
                    /* use current position setpoint */
                    item->lat = pos_sp_triplet->current.lat;
                    item->lon = pos_sp_triplet->current.lon;
                    item->altitude = pos_sp_triplet->current.alt;
    
                } else {
                    /* use current position and use return altitude as clearance */
                    item->lat = _navigator->get_global_position()->lat;
                    item->lon = _navigator->get_global_position()->lon;
                    item->altitude = _navigator->get_global_position()->alt;
    
                    if (min_clearance > 0.0f && item->altitude < _navigator->get_home_position()->alt + min_clearance) {
                        item->altitude = _navigator->get_home_position()->alt + min_clearance;
                    }
                }
            }
            else {
                if (_navigator->get_can_loiter_at_sp() && pos_sp_triplet->current.valid) {
                    /* use current position setpoint */
                    item->x = pos_sp_triplet->current.x;
                    item->y = pos_sp_triplet->current.y;
                    item->altitude = pos_sp_triplet->current.alt;
    
                } else {
                    /* use current position and use return altitude as clearance */
                    item->x = _navigator->get_local_position()->x;
                    item->y = _navigator->get_local_position()->y;
                    item->altitude = -_navigator->get_local_position()->z;
    
                }
            }
    
            item->altitude_is_relative = false;
            item->yaw = NAN;
            item->loiter_radius = _navigator->get_loiter_radius();
            item->acceptance_radius = _navigator->get_acceptance_radius();
            item->time_inside = 0.0f;
            item->autocontinue = false;
            item->origin = ORIGIN_ONBOARD;
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用uart数据起飞 的相关文章

  • TM4C123系列(四)————UART串口通信

    一 实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信 二 UART介绍 TM4C123有八个串口 xff0c 其中UART0已经与USB集成 xff0c UART0建议只用来和PC端通信 xff0c 不要与外界通信 除此之外
  • FPGA学习-UART串口发送单字节(UART时序分析+真正的FPGA设计看图写代码)

    首先看UART发送时序图 xff1a 要发送一个完整字节 xff0c 需要 1位起始位 43 8位数据位 43 1位停止位 xff0c 图上的第11位 xff0c 是确认一个字节发送完的一位 重点是每一位之间的发送时间需要保持一致 xff0
  • 【FPGA】UART串口通信

    文章目录 一 通信方式1 串行通信2 并行通信 二 UART串口通信1 模块设计与时序图2 代码实现 三 测试结果1 仿真结果2 上板验证 一 通信方式 1 串行通信 串行通信是指利用一条传输线将数据一位位地顺序传送 xff08 也就是说串
  • DSP:TMS320C6657 之 UART波特率问题

    6657 设置串口波特率 以614400为例 xff08 1 xff09 根据公式计算分频系数 xff08 2 xff09 1GHz 主频下 UART 输入频率 166666666Hz xff08 1 6 xff09 xff08 3 xff
  • 【STM32】UART串口通信详解

    目录 一 数据通信方式 1 串行与并行通信2 全双工 半双工及单工通讯3 同步通讯与异步通讯 二 串口通讯协议 STM32串口简介1 物理层1 RS232标准2 USB转串口 重点 3原生的串口到串口2 协议层1 xff09 通讯的起始和停
  • Jetson Nano – UART

    There is a UART on the J41 GPIO Header of the NVIDIA Jetson Nano Developer Kit Useful when you need a little bit of extr
  • UART协议

    UART协议 简介 UART是通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff0c 是一种异步收发传输器 是设备间进行异步通信的关键
  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART 是一种异步全双工串行通信协议 xff0c 它将要传输的资料在串行通信与并行通信之
  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • 1、串口(UART/COM/TTL/RS232/RS485)

    目录 串口简介 串行通讯制式 UART 2 1 简介 2 2 电平标准 TTL RS232 RS485 2 3 电平转换 xff08 重点讲解RS232 TTL xff09 USB转TTL USB转RS232 USB转RS485 RS232
  • ESP32+WiFi+UART数据传输测试

    刚开始使用ESP32芯片 xff0c 摸索着实现了一个数据传输的功能 xff0c 记录下来以免忘记 实现功能 使用ESP32在服务器与下位机之间传输数据 xff0c 整体的流程图如下所示 如图所示 xff0c 下位机与ESP通过串口连接 x
  • 串口通信协议---UART

    串口通信的分类 UART属于串行 异步 全双工通信 串行通信与并行通信 根据传输数据的位宽 xff0c 串口通信可分为串行通信与并行通信 xff0c 串行通信是指设备之间通过少量数据信号线 一般是 8 根以下 xff0c 地线以及控制信号线
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数(作者自己生成的函数代码,中间有关闭接收中断,但是原子教程中没有关闭中断的语句注意区别)

    前言 1 UART Receive IT 2 HAL UART Receive 3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • 串行通信基础知识与UART驱动构件使用方法

    串行通信基础 串行通信接口 异步串行通信 UART 常称为 串口 或SCI xff0c 在USB未普及之前 xff0c 是PC机必备通信接口之一 通信方式为单字节通信 xff0c 是最简单的串行通信方式 RS232 RS485 接线简单 x
  • STM32—UART中断收发 Day4

    软件 xff1a STM32CubeMX xff0c MDK ARM 硬件 xff1a 蓝桥杯物联网Lora开发板 xff0c 板载芯片STM32L071 一 STM32CubeMX配置 1 先在连接 xff08 Connectivity
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数

    目录 前言1 UART Receive IT2 HAL UART Receive3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)

    测试第三课 ESP32 C3的串口通信测试 老样子 使用Enocean无线模块和ESP32 C3进行串口通信 目录 前言 1 UART示例测试 1 1 UART 基础测试 1 2 与Enocean无线模块串口通信测试 2 ESP32 C3
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子
  • 如何在R中从串口读取数据

    我想绘制来自串行端口的实时数据 我认为 R 将是完成这项工作的好工具 我在尝试从串行端口 COM4 读取数据时遇到了困难 我已经验证数据是通过 terra term 传入的 并在尝试 R 之前关闭会话 但我似乎无法在 R 中获取任何内容 我
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data

随机推荐

  • FreeRTOS系列|FreeRTOS简介

    1 RTOS简介 RTOS全称为 Real Time Operation System xff0c 即实时操作系统 RTOS强调的是实时性 xff0c 又分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 xff0c 不允许超时 xf
  • FreeRTOS系列|任务创建和删除

    1 任务创建和删除API函数 xTaskCreate 函数 xff1a 动态创建一个新的任务 xff0c 每个任务都需要RAM来保存任务状态 任务控制块 43 任务栈 xff0c 此接口采用动态分配内存资源 BaseType t span
  • FreeRTOS系列|多任务调度

    1 多任务启动流程 多任务启动流程如下表所示 启动后以下各函数由上至下依次执行含义osKernelStart 启动内核vTaskStartScheduler 启动任务调度器xPortStartScheduler 启动调度器prvStartF
  • PTP 报文格式

    HeaderBodySuffix34 字节Variable lengthOptional 所有的 PTP 帧都包含一个公共报头 xff0c 它决定了协议版本和消息类型 xff0c 还定义了消息的剩余内容 所有多字节字段以大端顺序发送 xff
  • makefile:make -C M=参数的使用

    Makefile为 xff0c PWD span class token operator 61 span span class token punctuation span shell pwd span class token punct
  • BW笔记(2011-10-24更新至No.237)

    1 同一个变量名的UID可能有多个 xff0c 记得注意 2 在查找时要注意技术名称还是名称 xff0c 因为查询时会在两个中进行 xff0c 模糊查询时要细心 xff0c FV与V都可以查到 3 复制的时候注意长度 xff0c 过长的会不
  • rpmsg 内核开发 用户层接口

    地址 xff1a https blog csdn net thisway diy article details 129195479 韦东山 Tina Linux E907开发指南 AMP 环境搭建 7 1 rpmsg 内核开发 7 2 r
  • __raw_writel, writel_relaxed 和 writel的区别

    因为对别的平台不了解 xff0c 下面仅谈它们在ARM上的区别 raw writel xff1a 因为有volatile关键字 xff0c 所以编译器不会打乱多个 raw writel的执行顺序 对于ARM而言 xff0c 当多个写以代码的
  • WFE和WFI的区别

    1 概念 xff1a WFI Wait for interrupt 和WFE Wait for event 是两个让ARM核进入low power standby模式的指令 xff0c 由ARM architecture定义 xff0c 由
  • Ubuntu16.04安装中文输入法

    转载地址 xff1a http blog csdn net suxiang198 article details 52040283 Ubuntu16 04安装完后 xff0c 和12 04以及14 04都不一样 xff0c 并没有中文输入功
  • QT linux安装

    转载地址 xff1a http www cnblogs com tangkaixuan p 6504102 html 文章来自https lug ustc edu cn sites qtguide 1 4 Qt在Linux下安装 Qt在Li
  • Linux CAN编程详解

    转载地址 xff1a http velep com archives 1181 html Linux CAN编程详解 是一篇百度文库上的文档 xff0c 主要描述了以下内容 xff1a can总线介绍及其帧类型 xff1b Linux 系统
  • buildroot学习(十)——at91sam9g45软件平台更新

    转载地址 xff1a https blog csdn net srf1986 article details 52474697 xff08 xff11 xff13 xff16 xff09 spice protocol In computin
  • killall 、kill 、pkill 命令详解

    转载地址 xff1a https www cnblogs com rsky p 4886043 html killall 命令 Linux系统中的killall命令用于杀死指定名字的进程 xff08 kill processes by na
  • PCIe扫盲——PCIe简介

    转载地址 xff1a http blog chinaaet com justlxy p 5100053066 PCI Express是继ISA和PCI总线之后的第三代I O总线 xff0c 即3GIO 由Intel在2001年的IDF上提出
  • Adaptive Autosar通讯层:ARA::COM中的Instance Identifiers

    一般概念 实例标识符 在收发两端都是要用的 是很核心的概念 proxy端用来搜索服务 xff0c skeleton端用来创建服务实例 站在API的角度来看 xff0c 这样的识别符是和特定的技术绑定的 所以 xff0c 标识符的结构和内容都
  • BW:数据源抽取机制(这篇是以前的笔记,写得很差,有不少错的地方,留着给自己看)

    题记 xff1a 忽然想到这么个问题 xff0c 后勤数据源和非后勤数据初始化有何区别 xff0c 然后进行周边的拓展 xff0c 所以就形成了下文 大部分知识源于 TBW350 和 SAP SDN 对数据源抽取机制的深入探讨 一 什么数据
  • 【ARA com API】ara::core::Optional

    文章目录 ara core Optional 是什么标准中的代码示例 ara core Optional 是什么 实际上就是std optional 但是当前的AP标准没有支持到那么新版本的C 43 43 标准 xff08 我没有具体研究是
  • ROS学习总结(1)--入门、学习路线

    最近由于项目需要 xff0c 我被分配到机器人驱动模块 xff0c 由此开始研究学习ROS xff0c 在此记录学习ROS的方法 过程 经历与应用 本节记录ROS学习路线 ROS xff08 robot operation system x
  • 使用uart数据起飞

    使用uart得到的位置信息进行起飞 在得到了位置信息的前提下 xff0c 我们开始进行模拟起飞 xff0c 即使用usb供电 xff0c 人工控制其高度 xff0c 在上位机查看油门大小 xff0c 电机的pwm输出 commander c