Pixhawk原生固件PX4之串口读取信息

2023-05-16

欢迎交流~ 个人 Gitter 交流平台,点击直达:Gitter


这篇博客纯粹出于对FreeApe这位先行者贡献的复现,也是本人一直想要进行的一项操作。在此还是做一下记录。时代在改变,代码在更新,有些坑先填一填。

说明

本意是采用串口的方式添加一个自定义传感器——超声波。

已知的是超声波模块是通过串口方式发送(Tx)出数据,使用的模块数据发送周期为100ms,数据格式为:

R0034 R0122 R0122 R0046 R0127 R0044 R0044 R0125 R0034 R0037 R0041 R0122 R0122 .....

则可以通过Pixhawk板上的串口来接收(Rx)数据,即将超声波的Tx接口连接到Pixhawk板上的Rx接口。 这个想法就目前来说是非常好并且实施相对最简单的,毕竟PX4源码框架很大,十分复杂,在其原有的基础上改代码需要对这套系统有着很深的理解,所有初学者确实可以采用这种“协同”的方式连入到Pixhawk,可能用一个外部运算能力强的处理器算出姿态或位置或视觉数据经过串口发送到Pixhawk中,怎么把这些数据融合进原生算法那就另说了。

OK,继续主题,Pixhawk板上串口说明如下:

NuttX UARTPixhawk UART
/dev/ttyS0IO DEBUG(RX ONLY)
/dev/ttyS1TELEM1(USART2)
/dev/ttyS2TELEM2(USART3)
/dev/ttyS3GPS(UART4)
/dev/ttyS4N/A(UART5, IO link)
/dev/ttyS5SERIAL5(UART7,NSH Console Only)
/dev/ttyS6SERIAL4(UART8)

测试使用Pixhawk板上TELEM2接口的USART2,对应的Nuttx UART设备文件尾/dev/ttyS2:

pix

对于的各接口线序可以从这里查看,其中Pixhawk接口最左边为Vcc,最右边是GND。

  • TELEM1, TELEM2
PinSignalVolt
1 (red)VCC+5V
2 (blk)TX (OUT)+3.3V
3 (blk)RX (IN)+3.3V
4 (blk)CTS (IN)+3.3V
5 (blk)RTS (OUT)+3.3V
6 (blk)GNDGND
  • GPS
PinSignalVolt
1 (red)VCC+5V
2 (blk)TX (OUT)+3.3V
3 (blk)RX (IN)+3.3V
4 (blk)CAN2 TX+3.3V
5 (blk)CAN2 RX+3.3V
6 (blk)GNDGND
  • SERIAL 4/5
PinSignalVolt
1 (red)VCC+5V
2 (blk)TX (#4)+3.3V
3 (blk)RX (#4)+3.3V
4 (blk)TX (#5)+3.3V
5 (blk)RX (#5)+3.3V
6 (blk)GNDGND

读取数据测试

步骤:

1. Firmware/src/modules中添加一个新的文件夹,命名为rw_uart,并创建C文件rw_uart.c

/* 
 * 串口读取函数
 * rw_uart.c 
 */
#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>

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

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

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;

    int termios_state;

    /* 以新的配置填充结构体 */
    /* 设置某个选项,那么就使用"|="运算,
     * 如果关闭某个选项就使用"&="和"~"运算
     * */
    tcgetattr(fd, &uart_config); // 获取终端参数

    /* clear ONLCR flag (which appends a CR for every LF) */
    uart_config.c_oflag &= ~ONLCR;// 将NL转换成CR(回车)-NL后输出。

    /* 无偶校验,一个停止位 */
    uart_config.c_cflag &= ~(CSTOPB | PARENB);// CSTOPB 使用两个停止位,PARENB 表示偶校验

     /* 设置波特率 */
    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;
    }
    // 设置与终端相关的参数,TCSANOW 立即改变参数
    if ((termios_state = tcsetattr(fd, TCSANOW, &uart_config)) < 0) {
        warnx("ERR: %d (tcsetattr)\n", termios_state);
        return false;
    }

    return true;
}


int uart_init(char * uart_name)
{
    int serial_fd = open(uart_name, O_RDWR | O_NOCTTY);
    /*Linux中,万物皆文件,打开串口设备和打开普通文件一样,使用的是open()系统调用*/
    // 选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行
    if (serial_fd < 0) {
        err(1, "failed to open port: %s", uart_name);
        return false;
    }
//    printf("Open the %s\n",serial_fd);
    return serial_fd;
}

int rw_uart_main(int argc, char *argv[])
{
    char data = '0';
    char buffer[4] = "";
    /*
     * 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("/dev/ttyS2");
    if(false == uart_read)
        return -1;
    if(false == set_uart_baudrate(uart_read,9600)){
        printf("[JXF]set_uart_baudrate is failed\n");
        return -1;
    }
    printf("[JXF]uart init is successful\n");

    while(true){
        read(uart_read,&data,1);
        if(data == 'R'){
            for(int i = 0;i <4;++i){
                read(uart_read,&data,1);
                buffer[i] = data;
                data = '0';
            }
            printf("%s\n",buffer);
        }
    }

    return 0;
}

具体的实现过程请查看irmware/src/drivers/hott/comms.cpp,里面是关于串口的设置,设计到NuttX这个类Unix操作系统的文件系统了,小白有点难啃。

2. rw_uart文件夹中创建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
    )
# vim: set noet ft=cmake fenc=utf-8 ff=unix : 

3. 注册新添加的应用到NuttShell中。Firmware/cmake/configs/nuttx_px4fmu-v2_default.cmake文件中添加如下内容:

modules/rw_uart

add

4. 编译并上传固件

make px4fmu-v2_default upload

5. 读取测试

  • 查看app
    • 在NSH终端中输入help,在Builtin Apps中出现rw_uart应用。
      nsh
  • 运行rw_uart应用(前提是模块与Pixhawk连接好)

    wire

  • 设置好发送装置
    这里我使用的是秉火STM32开发板的USART1给Pixhawk的TELEM2发送对应的字符串。根据代码,数据的格式要求很严格,不然很可能得不到数据,博主开始设置让串口疯狂的发Rxxxx,结果速度太快是不行的,后来给加了一个延时函数,更新频率设置为20Hz,有时候还是会有乱码出现。各位进行设置的时候需要注意波特率对应,数据格式按要求来。

int main(void)
{   

    /* USARTx config 9600 8-N-1 */
    USARTx_Config();    

    /* 配置SysTick为每10us中断一次 */
    SysTick_Init();

    printf("R1000 ");

  for(;;){
        int i = 1000;
        for(i=1001;i<2000;i++)
        {
            printf("R%d ",i);
            Delay_us(5000); // 5000*10us = 50ms
        }
    }
}
  • 运行rw_uart应用,查看打印数据。
    why

有点不尽人意……

后面一定要改得人性化一点。


                                          By Fantasy

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

Pixhawk原生固件PX4之串口读取信息 的相关文章

  • PX4项目学习::(一)项目架构::软件简明架构

    1 软件构架 PX4软件架构由两个层次组成 xff1a 一是飞行控制栈 flight stack xff0c 即自驾仪的软件解决方案 xff0c 二是中间件 xff0c 一种可以支持任意类型自主机器人的通用机器人中间件 2 1 中间件 中间
  • PX4项目学习::(四)中间件::驱动框架

    驱动框架 PX4的代码库使用一个轻量级的 xff0c 统一的驱动抽象层 xff1a DriverFramework POSIX和 QuRT的驱动写入这个驱动框架当中 旧的NuttX驱动是基于设备 架构的 xff0c 以后将会移植到驱动框架之
  • PX4项目学习::(四)中间件::任务管理与调度

    目录 1 PX4模块运行方式2 PX任务启动方式Task工作队列 参考文献 1 PX4模块运行方式 PX4项目采用两种方式运行 Tasks Work queue tasks Tasks 模块在自己的任务中运行 xff0c 具有自己的堆栈和进
  • PX4项目学习::(五)项目启动流程(纯代码讲解)

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 无人机原理::(一)模型框架与控制系统框架详解

    0 完整框图 1 无人机软件框图 上图为PX4固件框架总览 xff0c 蓝色方块是指飞控系统中的各个模块 下面分别介绍各个模块的作用 xff1a Mavlink模块最为常用 xff0c 可以调整为off board模式以配合机载电脑 xff
  • 基础理论知识

    序 xff1a 综述 机器人专业需要学习什么理论知识 robinvista的博客 CSDN博客 零 基础中的基础 数学 力学 运动学 一 动力学建模与仿真 1 机器人 机器人学基础 蒋志宏 微信读书 2 无人机 全权的两本书 B站有课 3
  • 面试流程总结

    一 HR简单了解情况 xff08 会来了解一般就没啥多说的 xff0c 就是了解下你的意象 xff0c 除非你自己不想去 xff09 二 技术面 一般分两面 xff0c 有些公司急缺人 xff0c 或者一些小公司及其它情况也有可能 面一次
  • 8款设计师常用漂亮的HTML CSS表格样式

    原来的地址 xff1a http www laozuo org 2040 html 我们在布局网站的时候以前都可能直接用TABLE设计 xff0c 如今都更流行使用CSS设计 xff0c 这样对于网站结构更加友好和轻便 下面老左整理的8款设
  • Apollo车辆控制模块::框架与流程

    self drive car 学习笔记 第11课 xff1a 控制理论 鸿 H的博客 CSDN博客 智能驾驶进阶8 控制 次言的博客 CSDN博客 一 框架图 控制输入 xff1a 主要来源于规划模块以及反馈阶段信息 xff08 如loca
  • rt-thread源码分析篇十五:rt_application_init函数分析

    一 rt application init函数调用 二 函数分析 span class token keyword void span span class token function rt application init span s
  • USB 协议整理 八:STM32官方USB库

    https blog csdn net asher zhou article details 105519209 https blog csdn net zcshoucsdn article details 78936456 本章摘取 ST
  • 常用SDK整合

    databuilding SDK官方地址 xff1a https developer android google cn topic libraries data binding
  • 机会留给有准备的人

    通过这次考试 xff0c 发现自己很多不足 xff0c 关上书完全是空白 xff0c 努力吧 xff0c 还有机会
  • 精致代码(C算法——进制问题10-->16)

    xff08 精致算法 xff09 开发思维 十进制转十六进制 蓝桥练习题 xff1a 十进制转十六进制 资源限制 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数
  • C语言多线程同步 -- 信号量semaphore.h

    多线程读文件使用fopen xff0c 出现BUG xff0c 然后寻找同步方法 xff0c 找到这个 信号量 首先需要用sem init 初始化sem t型变量 xff0c 并设置初始信号量 比如设置为1 每次调用sem wait sem
  • 错误管理记录机制(一)

    当执行configure aprutil时 xff0c 提示 xff1a sed 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 这是因为 configure aprutil bat 文件中使用了 Linux 下的 sed
  • 从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计

    最近在尝试用光流法写一个基本的双目视觉SLAM xff0c 希望通过这个项目把SLAM的各个模块都自己实现一遍 xff0c 以此加深对SLAM各个模块的理解 目前刚完成了一个通过求解相邻帧PnP问题的双目视觉里程计 xff0c 基本有了一个
  • 盘点丨无人机与AI 深度融合及跨域应用

    在密集的竹林里 xff0c 一群无人机自如地穿梭其中 xff0c 像组织有序的鸟群 xff0c 时而灵巧地掠过低矮灌木丛 xff0c 时而交叉飞行变换队形 这不是科幻内容 xff0c 而是浙江大学团队研发的自主导航的集群飞行系统 xff0c
  • 安全即代码:为Go实现lint和gosec | Gopher Daily (2020.08.05) ʕ◔ϖ◔ʔ

    每日一谚 xff1a a little copying is better than a little dependency 有意想学习容器或Kubernets的童鞋可以了解一下我的慕课网实战课 xff1a k8s实战 https codi
  • 终于有人把RISC-V讲明白了

    http m elecfans com article 653167 html

随机推荐

  • OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍

    xff08 以下内容来自开发者分享 xff0c 不代表 OpenHarmony 项目群工作委员会观点 xff09 刘鑫 容器类 xff0c 顾名思义就是存储的类 xff0c 用于存储各种数据类型的元素 xff0c 并具备一系列处理数据元素的
  • 200个DIY及科技网站

    http www powerlabs org 高能diy 电磁枪 微波武器 http www altair org tesla html 高电压diy爱好者 http www richieburnett co uk tesla shtml
  • Linuxunexpected error reading Dockerfile: is a directory--2021-08-25

    编写完Dockerfile后需要通过命令将其制作为镜像 mobaXterm报错 unexpected error reading Dockerfile read var lib docker tmp docker builder314741
  • 在Eclipse中配置Tomcat

    简介 xff1a 1 3步为 xff1a 把Tomcat配置到eclipse中 4 7步为 xff1a 把新建的Web项目部署到Tomcat中并运行 最后一部分为 xff1a 改变Web工程的真实部署路径到Tomcat中目录下 x1f447
  • ROS与C++入门教程-消息-序列化和适配类型

    原文地址 xff1a ROS与C 43 43 入门教程 消息 序列化和适配类型 创客智造 说明 xff1a 介绍序列化和适配类型在C Turtle版本增加 序列化到内存 使用ros serialization serialize 函数 xf
  • 前方高能,官方教程:教你如何玩转 GitHub !

    回复 1024 xff0c 送你一个特别推送 作为程序员 xff0c 一般手上会有三把剑 xff0c 用好了这三把剑 xff0c 对于编程来说 xff0c 对于解决编程中遇到的 Bug xff0c 都应该能够轻而易举的解决 程序员手中的三把
  • 树莓派安装宝塔面板后无法连接VNC

    解决方法 xff1a 登陆宝塔面板后台 xff0c 在 安全 中放行端口5900即可
  • Python并行处理视频帧

    参考链接 xff1a Speedy Computer Vision Pipelines using Parallelism 方案 xff1a 使用Python多进程编程 xff0c 将视频分成多个小段 xff0c 可按照CPU核数num p
  • 深度学习目标检测之SSD

    经典论文SSD笔记 论文链接 xff1a SSD Single Shot MultiBox Detector论文报告 xff1a ssd eccv2016 slide目标检测百页综述 xff0c 从传统方法到深度学习 xff1a Objec
  • C++编译报错fmt未定义的引用

    对 fmt v5 internal basic data POWERS OF 10 64 未定义的引用 1 最简单的方法 xff1a 把代码中printf的输出全部换成std cout或者其他的 2 安装fmt包 git clone htt
  • PyG/torch_geometric的一些坑

    安装PyG span class token keyword import span os span class token keyword import span torch os span class token punctuation
  • Pixhawk官网飞行模式介绍

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a Flight Mode 飞行模式 原文地址 http dev px4 io concept flight modes html 飞行模式定义了系统在任何给定时间的状态
  • PX4中文维基汉化项目启动

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 敬启者 xff1a 打算进行PX4官网的汉化工作 GitBook 与官网的方式相同 xff0c 我们也是将网站以GitBook的方式呈现给大家 汉化后的版本先点点点点
  • Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 更新于2017 3 13 FAQ 本文说明针对 PX4 Firmware 1 6 0 问题 1 xff1a 找不到python jinja2模块 CMake Erro
  • Sublime Text中文乱码的解决方法

    Sublime Text Sublime Text这款代码编译器相当不错 xff0c 自带高亮显示 xff0c 界面清新 但是Sublime Text默认是不支持中文显示的 xff0c 这种中文乱码的行为万万是不能够接受的 这里简单介绍一下
  • 自制Pixhawk飞控板烧写BootLoader教程

    对于自己制作的飞控板 xff0c 通过USB连接电脑之后 xff0c 开始电脑是无法检测到飞控板的端口存在的 检测不到端口 xff0c 就不能用控制台给飞控板烧写固件 xff0c 就不能用QGroundControl xff0c 就不能进行
  • Pixhawk原生固件PX4之常用函数解读

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff
  • Pixhawk原生固件PX4之添加uORB主题

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 本说明针对 Firmware v1 5 4 1 添加流程说明 1 在Firmware msg下新建uORB的成员变量 xff0c eg xxx msg 2 在Firm
  • Pixhawk原生固件PX4之SITL软件在环仿真

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 故事开始之前 xff0c 先按照笔者的这一篇博客在Ubuntu上完成固件的编译 jMAVSim仿真 jMAVSim仿真不需要任何配置 xff0c 直接输入指令即可 s
  • Pixhawk原生固件PX4之串口读取信息

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 这篇博客纯粹出于对FreeApe这位先行者贡献的复现 xff0c 也是本人一直想要进行的一项操作 在此还是做一下记录 时代在改变 xff0c 代码在更新 xff0c