PX4固件通过UART连接串口读取超声波,和树莓派3通信

2023-05-16

添加串口读取程序

首先在Firmware/msg文件夹下添加rw_uart.msg

char[5] datastr
int16 data
#TOPICS rw_uart

记住在这一文件夹下的CMakeLists.txt下注册这个msg,添加rw_uart.msg即可。
这里写图片描述
上面的文件make之后会自动产生rw_uart.h头文件,里面会有结构体rw_uart_s,存取了我们刚才定义的data和datastr。然后在Firmware/src/module文件夹下新建文件夹rw_uart,在里面添加CMakeLists.txt和rw_uart.c。
CMakeLists.txt内容如下:

set(MODULE_CFLAGS)
px4_add_module(
        MODULE modules__rw_uart
        MAIN rw_uart
    COMPILE_FLAGS
        -Os
    SRCS
                rw_uart.c
    DEPENDS
        platforms__common
    )

读取程序rw_uart.c如下:

#include <px4_config.h>
#include <px4_tasks.h>
#include <px4_posix.h>
#include <unistd.h>
#include <stdio.h>
#include <poll.h>
#include <string.h>
#include <uORB/uORB.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <drivers/drv_hrt.h>
#include <string.h>
#include <systemlib/err.h>
#include <systemlib/systemlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <uORB/topics/rw_uart.h>

static bool thread_should_exit = false;
static bool thread_running = false;
static int daemon_task;


__EXPORT int rw_uart_main(int argc, char *argv[]);
int rw_uart_thread_main(int argc, char *argv[]);

static int uart_init(const char * uart_name);
static int set_uart_baudrate(const int fd, unsigned int baud);
static void usage(const char *reason);



int set_uart_baudrate(const int fd, unsigned int baud)//自动选取波特率
{
    int speed;

    switch (baud) {
        case 9600:   speed = B9600;   break;
        case 19200:  speed = B19200;  break;
        case 38400:  speed = B38400;  break;
        case 57600:  speed = B57600;  break;
        case 115200: speed = B115200; break;
        default:
            warnx("ERR: baudrate: %d\n", baud);
            return -EINVAL;
    }

    struct termios uart_config;
    /**
/*termios 函数族提供了一个常规的终端接口,用于控制非同步通信端口。 这个结构包含了至少下列成员:
/*tcflag_t c_iflag;      /* 输入模式 */
/*tcflag_t c_oflag;      /* 输出模式 */
/*tcflag_t c_cflag;      /* 控制模式 */
/*tcflag_t c_lflag;      /* 本地模式 */
/*cc_t c_cc[NCCS];       /* 控制字符 */
*/
    int termios_state;

    /* fill the struct for the new configuration */
    tcgetattr(fd, &uart_config);
    /* clear ONLCR flag (which appends a CR for every LF) */
    uart_config.c_oflag &= ~ONLCR;
    /* no parity, one stop bit */
    uart_config.c_cflag &= ~(CSTOPB | PARENB);
    /* set baud rate */
    if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) {
        warnx("ERR: %d (cfsetispeed)\n", termios_state);
        return false;
    }

    if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) {
        warnx("ERR: %d (cfsetospeed)\n", termios_state);
        return false;
    }

    if ((termios_state = tcsetattr(fd, TCSANOW, &uart_config)) < 0) {
        warnx("ERR: %d (tcsetattr)\n", termios_state);
        return false;
    }

    return true;
}


int uart_init(const char * uart_name)
{
    int serial_fd = open(uart_name, O_RDWR | O_NOCTTY);

    if (serial_fd < 0) {
        err(1, "failed to open port: %s", uart_name);
        return false;
    }
    return serial_fd;
}

static void usage(const char *reason)
{
    if (reason) {
        fprintf(stderr, "%s\n", reason);
    }

    fprintf(stderr, "usage: position_estimator_inav {start|stop|status} [param]\n\n");
    exit(1);
}

int rw_uart_main(int argc, char *argv[])
{
    if (argc < 2) {
        usage("[FC]missing command");
    }

    if (!strcmp(argv[1], "start")) {
        if (thread_running) {
            warnx("[FC]already running\n");
            exit(0);
        }

        thread_should_exit = false;
        daemon_task = px4_task_spawn_cmd("rw_uart",//任务接口句柄
                         SCHED_DEFAULT,
                         SCHED_PRIORITY_MAX - 5,
                         2000,
                         rw_uart_thread_main,
                         (argv) ? (char * const *)&argv[2] : (char * const *)NULL);
        exit(0);
    }

    if (!strcmp(argv[1], "stop")) {
        thread_should_exit = true;
        exit(0);
    }

    if (!strcmp(argv[1], "status")) {
        if (thread_running) {
            warnx("[FC]running");

        } else {
            warnx("[FC]stopped");
        }

        exit(0);
    }

    usage("unrecognized command");
    exit(1);
}

int rw_uart_thread_main(int argc, char *argv[])
{

    if (argc < 2) {
        errx(1, "[FC]need a serial port name as argument");
        usage("eg:");
    }

    const char *uart_name = argv[1];

    warnx("[FC]opening port %s", uart_name);
    char data = '0';
    char buffer[5] = "";
    /*
     * TELEM1 : /dev/ttyS1
     * TELEM2 : /dev/ttyS2
     * GPS    : /dev/ttyS3
     * NSH    : /dev/ttyS5
     * SERIAL4: /dev/ttyS6
     * N/A    : /dev/ttyS4
     * IO DEBUG (RX only):/dev/ttyS0
     */
    int uart_read = uart_init(uart_name);
    if(false == uart_read)return -1;
    if(false == set_uart_baudrate(uart_read,9600)){
        printf("[FC]set_uart_baudrate is failed\n");
        return -1;
    }
    printf("[FC]uart init is successful\n");

    thread_running = true;

    /*初始化数据结构体 */
    struct rw_uart_s sonardata;
    memset(&sonardata, 0, sizeof(sonardata));
    /* 公告主题 */
    orb_advert_t rw_uart_pub = orb_advertise(ORB_ID(rw_uart), &sonardata);


    while(!thread_should_exit){
        read(uart_read,&data,1);
        if(data == 'R'){//这个地方是模拟树莓派发送的R1100数据,在超声波处注释掉这个if条件语句,直接读取
            for(int i = 0;i <4;++i){

                read(uart_read,&data,1);

                buffer[i] = data;

                //data = '0';
            }
           // printf("%s\n",buffer);
            strncpy(sonardata.datastr,buffer,4);
            sonardata.data = atoi(sonardata.datastr);
           // printf("[YCM]sonar.data=%s\n",sonardata.datastr);
            orb_publish(ORB_ID(rw_uart), rw_uart_pub, &sonardata);
        }
    }

    warnx("[FC]exiting");
    thread_running = false;
    close(uart_read);

    fflush(stdout);
    return 0;
}

超声波和px4的硬件连接

首先说一下,这里用的是pixhawk的TELEM2口,TELEM1接口给的是数传。TELEM1和TELEM2接口是一样的,分布如下:
这里写图片描述
对于UART主要是TX,RX,VCC,GND这四个接口,这里面我用的是HC-SRO4超声波传感器,这个传感器给的是触发信号,并没有直接给出距离,需要自己通过计时器来获得距离,这个找度娘就可以了,这里验证的是能读到数据。TELEM2和超声波的连接方式:VCC-VCC,TX-RX,RX-TX,GND-GND,这里我的超声波的连接是:TX-Trigger,RX-Echo。最后的结果如下:
这里写图片描述
这里我使用的是数据订阅的方式——uORB通信机制
在Firmware/src/examples/px4_simple_app文件夹下,修改px4_simple_app.c如下:

/****************************************************************************
 *
 *   Copyright (c) 2012-2015 PX4 Development Team. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name PX4 nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

/**
 * @file px4_simple_app.c
 * Minimal application example for PX4 autopilot
 *
 * @author Example User <mail@example.com>
 */

#include <px4_config.h>
#include <px4_tasks.h>
#include <px4_posix.h>
#include <unistd.h>
#include <stdio.h>
#include <poll.h>
#include <string.h>
#include <math.h>

#include <uORB/uORB.h>
#include <uORB/topics/rw_uart.h>



__EXPORT int px4_simple_app_main(int argc, char *argv[]);

int px4_simple_app_main(int argc, char *argv[])
{
    printf("Hello Sky!\n");

    /* subscribe to rw_uart_sonar topic */
    int sonar_sub_fd = orb_subscribe(ORB_ID(rw_uart));
    /*设置以一秒钟接收一次,并打印出数据*/
    orb_set_interval(sonar_sub_fd, 1000);
   // bool updated;
    struct rw_uart_s sonar;

    /*接收数据方式一:start*/
    /*
    while(true){
        orb_check(sonar_sub_fd, &updated);

        if (updated) {
            orb_copy(ORB_ID(rw_uart_sonar), sonar_sub_fd, &sonar);
            printf("[YCM]sonar.data=%d\n",sonar.data);
        }
        //else printf("[YCM]No soanar data update\n");
    }
    */
    /*接收数据方式一:end*/

    /*接收数据方式二:start*/
    /* one could wait for multiple topics with this technique, just using one here */
    struct pollfd fds[] = {
        { .fd = sonar_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++) {
        /* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */
        int poll_ret = poll(fds, 1, 1000);

        /* handle the poll result */
        if (poll_ret == 0) {
            /* this means none of our providers is giving us data */
            printf("[px4_simple_app] Got no data within a second\n");

        } 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) */
                printf("[px4_simple_app] ERROR return value from poll(): %d\n"
                       , poll_ret);
            }

            error_counter++;

        } else {

            if (fds[0].revents & POLLIN) {
                /* obtained data for the first file descriptor */
                //struct rw_uart_s sonar;
                /* copy sensors raw data into local buffer */
                orb_copy(ORB_ID(rw_uart), sonar_sub_fd, &sonar);
                printf("[px4_simple_app] Sonar data:\t%s\t%d\n",
                       sonar.datastr,
                       sonar.data);
            }

            /* there could be more file descriptors here, in the form like:
             * if (fds[1..n].revents & POLLIN) {}
             */
        }
    }
    /*接收数据方式二:end*/

    return 0;
}

树莓派3和pixhawk通信

树莓派和pixhawk的连接如下:
这里写图片描述
这里切记不要把VCC和GND的GPIO口接反了,很容易把树莓派的CPU 烧了(我就烧了一次),如果都供电了,建议就不要连接两者之间的VCC。树莓派的发送程序如下:

#include <stdio.h> 
#include <wiringPi.h>
#include <wiringSerial.h> 
int main() 
{ 
int fd; 
char data[5]=“R1100”; 
int flag=1;
if(wiringPiSetup()<0)return 1; 
if((fd=serialOpen("/dev/ttyAMA0",9600))<0) return 1;
printf("serial test start ...\n");
serialPrintf(fd,"Hello world!\n"); 
while(flag) 
    { 
      serialPrintf(fd,data);//向串口设备发送data数据 
      delay(300);
        while(serialDataAvail(fd)) 
          { 
          printf("->%3d\n",serialGetchar(fd));
          flag=0; fflush(stdout); 
          } 
     } 
serialFlush(fd); 
serialClose(fd); 
return 0;
 } 

首先需要说一下,这个串口发送程序需要安装wiringPi库,编译运行命令如下:

gcc –Wall uart.c –o uart –lwiringPi
sudo ./uart

这几天坑埋完了,上各种博客链接:
树莓派和pixhawk连接
struct termios结构体详解
树莓派串口发送数据
PX4原生固件添加串口读取传感器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4固件通过UART连接串口读取超声波,和树莓派3通信 的相关文章

  • 【docker】安装clickhouse

    一 联网安装clickhouse 1 为了方便安装 xff0c 将clickhouse的工作目录和数据目录都在同一个目录下 xff0c 在home下创建目录 mkdir clickhouse cd clickhouse 创建日志 配置文件
  • springboot整合mybatis-plus、clickhouse、mysql多数据源

    springboot的多数据源有多种方式 xff0c 本文按照指定不同dao mapper xml的方式来实现访问不同的数据源 这样的好处是不用注解去切换数据源 1 引入驱动 span class token generics span c
  • linux中的oracle启动和关闭

    一 启动数据库实例 span class token number 1 span 切换到oracle用户 su span class token operator span oracle span class token number 2
  • BigDecimal计算工具类

    方便以后大家使用 span class token keyword import span span class token namespace java span class token punctuation span math spa
  • 安装、使用mongodb踩过的坑

    轻松一下 没用分布式架构之前 xff0c 你只有一个问题 xff1a 并发性能不足 用了分布式架构 xff0c 多出了一堆问题 xff1a 数据如何同步 主键如何产生 如何熔断 分布式事务如何处理 使用mongodb踩过的坑 今天对安装 x
  • JS使用总结:简单标签赋值和取值:span等;实时触发事件

    JS使用总结 简单标签赋值和取值 xff1a span等 xff1b 实时触发事件 xff1b 了解一下简单标签赋值和取值实时触发事件代码 了解一下 作为后台开发 xff0c 今天使用了前端的技术 xff0c 做一个总结 xff1b 包括两
  • FreeRtos的笔记 (一)

    FreeRtos的笔记 一 一 前言 linux是分时系统 和 RTOS时实操作系统区别 RTOS时实操作系统 当外界事件或数据产生时 xff0c 能够接受并以足够快的速度予以处理 实时操作系统是保证在一定时间限制内完成特定功能的操作系统
  • UCOSII操作系统(一)--基础知识

    前言 比较主流的操作系统有UCOSII FREERTOS LINUX等 参考书籍 xff1a 嵌入式实时操作系统 COS II原理及应用 嵌入式实时操作系统uCOS II 邵贝贝 第二版 1 操作系统的作用 xff1a 操作系统是计算机硬件
  • ORB SLAM2 编译&运行

    1 依赖安装 xff1a 1 xff09 安装 GLEW xff1a sudo apt get install libglew dev 2 xff09 安装 libuvc xff1a git clone https github com k
  • SAP 一句话入门之SD

    SD是Sales and Distribution的简称 在SAP系统中 xff0c 销售与分销模块处在供应链下游 xff0c 关注从客户订单到向客户收款的全过程 SD模块中的Sales好理解 xff0c 而Distribution却容易被
  • realsense-ros安装

    一 realsense ros安装 1 Create a catkin workspace mkdir p realsense rosws src cd realsense rosws src catkin init workspace 2
  • thinkphp页面请求时间超过40S报404错误解决办法

    最近在写一个thinkphp项目的时候 xff0c 发现Ajax从后端请求数据时间比较长 xff0c 大概需要45秒左右 xff0c 但是一旦请求时间超过40s xff0c 页面就会超时404了 xff0c 一开始以为是ajax请求时间不能
  • C语言宏定义详解

    宏定义引入 源程序在编译之前 xff0c 会先进行预处理 预处理并不是C语言编译器的组成部分 xff0c 不能直接对它们进行编译 经过预处理后 xff0c 程序就不再包括预处理命令了 xff0c 最后再由编译程序对预处理之后的源程序进行编译
  • C语言枚举详解

    枚举的引入 枚举是C语言中的一种基本数据类型 xff0c 它可以让数据更简洁 xff0c 更易读 枚举语法定义格式为 xff1a enum 枚举名 枚举元素1 枚举元素2 注意 xff0c 各元素之间用逗号隔开 注意 xff0c 末尾有分号
  • STC-ISP使用指南

    该软件无需安装 xff0c 下载后打开直接用 本软件是专门给STC系列单片机下载烧录程序的 xff0c 并不能适用于ARM系列的单片机 界面介绍 xff1a 打开后的界面如下 xff1a 左边的部分一般是用来下载程序的 xff0c 右面一般
  • STM32前言知识总结

    目录 关于STM32 STM32F1 存储器 位带操作 三种启动模式 低功耗模式 复位 时钟系统 STM32库 仿真器和调试器 注 xff1a 本文大部分内容来自于STMCU官网以及STM32数据手册 STM32使用的是ARM公司的Cort
  • STM32的标准库及其使用

    单片机的开发工作量 xff0c 主要集中在两个地方 xff0c 一是调通各种外设 xff0c 二是实现产品功能 像较高级的语言 xff0c 比如c 43 43 java python等 因为将底层操作进行了封装 xff0c 所以只需要集中关
  • PADS(一)简介、安装与基本使用

    PADS是一款制作PCB板的软件 PADS包括PADS Logic PADS Layout和PADS Router PADSLayout xff08 PowerPCB xff09 提供了与其他PCB设计软件 CAM加工软件 机械设计软件的接
  • 电路中的常见符号总结

    嵌入式如何阅读原理图和数据手册 路溪非溪的博客 CSDN博客 硬件原理图常见缩写 EN xff1a Enable xff0c 使能 CS xff1a Chip Select xff0c 片选 RST xff1a Reset xff0c 重启
  • 嵌入式常见英文2500词总结

    目录 嵌入式硬件常见英文总结 嵌入式软件常见英文总结 电子技术专业英语 嵌入式硬件常见英文总结 block diagram xff0c 框图 figure xff0c 图形 xff0c 图标 processor xff0c 处理器 Mirr

随机推荐

  • 我的2013—弃金融IT,从SAP业务

    我的2013 xff0c 是动荡的一年 xff1b 这一年 xff0c 我跳巢了 xff1b 这一年 xff0c 我换行业了 xff1b 这一年 xff0c 我离开了生活5年的长春 xff0c 来到成都 xff1b 这一年 xff0c 我放
  • STM32实战总结:HAL之电机

    电机基础知识参考 xff1a 51单片机外设篇 xff1a 电机 路溪非溪的博客 CSDN博客 无刷电机和有刷电机 先详细了解有刷电机 xff1a 带你了解 xff08 有刷 xff09 电机工作原理 哔哩哔哩 bilibili 再详细了解
  • F407标准库之时钟系统

    主要参考正点原子数据手册和源码资料等 第19讲 STM32时钟系统精讲 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 一般而言 xff0c 时钟越高 xff0c 速度越快 xff0c 但同时抗
  • F407标准库之定时器

    主要参考正点原子数据手册和源码资料等 第31 通用定时器基本原理讲解 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 定时器中断 定时器相关的库函数主要集中在固件库文件 stm32f4xx ti
  • F407标准库之基础知识

    关于STM32的结构体封装 在STM32中 xff0c 有两种容易弄混的结构体封装 第一种是系统对底层寄存器的封装 结构体类型定义好之后 xff0c 是不会分配地址空间的 xff0c 此时只是个类型定义 xff0c 之后使用的时候 xff0
  • c++架构师需要掌握哪些知识

    目录 本文技术梳理主要针对于三类人群的技术需求 c c 43 43 Linux服务器端开发岗位分析 经常被问到的问题 xff1a 技术体系建立的好处 c c 43 43 Linux服务器开发技术学习路径 一 精进基石 二 高性能网络设计 三
  • cmake:使用execute_process调用shell命令或脚本

    CMake可以通过execute process调用shell命令或者脚本 xff0c 其原型如下 xff1a execute process COMMAND lt cmd1 gt args1 COMMAND lt cmd2 gt args
  • 树莓派3B+上安装ubutun mate 18.04.2

    1 准备16G以上储存卡 xff0c 读卡器 2 准备两个软件 xff1a SDCardFormatter Win32DiskImager分别用于储存卡格式化和写入系统文件 链接如下 xff1a 链接 xff1a https pan bai
  • linux应用编程--思维导图

    思维导图软件是xmind 下载源文件点击打开链接
  • 深度学习中Batch、Iteration、Epoch的概念与区别

    在神经网络训练中 xff0c 一般采用小批量梯度下降的方式 Batch Epoch Iteration 就是其中的重要的概念 我们要理解懂得它们都是什么以及它们之间的区别 1 Batch 每次迭代时使用的一批样本就叫做一个Batch xff
  • STM32使用CubeMAX配置的串口中断接收方法

    STM32使用CubeMAX配置的串口中断接收方法 目录 1 定位串口中断发生的地方 2 处理串口中断接收的流程是 xff1a xff08 1 xff09 初始化串口 xff08 2 xff09 在main中第一次调用接收中断函数 xff0
  • SAP 寻找增强点的方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了 xff0c 可参考 SAP 标准教材 BC425 和 BC427 简单的说SAP的用户出口总共有四 代 1 第一代 基于源代码的增强 SAP提供一个空代码的子过程 xff0c 在这个
  • SNMPV3的实现原理

    在snmp发展到V3版本后 xff0c 把snmp的安全性提升到一个新高度 xff0c 这同时也带来了实现上的复杂性 在02年 xff0c 03年我都曾经想进一步的了解它的实现 xff0c 但都没什么进展 这次在实现Csnmp的过程中 xf
  • ubuntu更新错误:dists/artful/main/binary-arm64/Packages 404 Not Found

    Failed to fetch http archive ubuntu com ubuntu dists artful main binary arm64 Packages 404 Not Found IP 91 189 88 162 80
  • 个人公众号开通啦!!!!

    已经开通了个人微信公众号 xff1a 编程时光机 以后会在公众号里和大家分享知识和生吞活 xff0c 欢迎大家关注 xff01 xff01
  • 小白学AI系列(一)-- AI简史

    经过一段时间的酝酿 xff0c 小白学AI系列也正是开始了 xff01 小编将从三个阶段和大家一起入门人工智能 xff0c 掌握常用机器学习算法和数据分析技巧 小编专业为数据融合方向 xff0c 也曾接触过机器学习 xff0c 但由于人工智
  • 小白学AI系列(二) -- Python模块和函数

    原文地址 xff1a 小白学AI系列 xff08 二 xff09 Python模块和函数 今天的内容是带大家学习解释性语言 Python 小编有学过一段时间的C 43 43 和Matlab 相对于二者而言 xff0c Python是作为学习
  • PX4固定翼调试校准流程及实验相关问题记录分析

    pixhawk固定翼调试流程 对于px4固件 xff0c 其对应选择的一般是qgroundcontrol地面站 xff08 APM一般使用Mission Planner xff09 本次调试的固件版本是1 6 5dev xff08 最新的固
  • Ubuntu16.04下PX4环境快速搭建及uORB通信机制

    Ubuntu16 04下的环境搭建 之前搭建PX4环境常常编译不通 xff0c cmake gcc 以及交叉编译器gcc arm none eabi的版本问题导致make固件报错 xff0c 好不容易编译通过了 xff0c 在进行安装jMA
  • PX4固件通过UART连接串口读取超声波,和树莓派3通信

    添加串口读取程序 首先在Firmware msg文件夹下添加rw uart msg span class hljs keyword char span span class hljs number 5 span datastr span c