怎么在px4中添加自己的模块

在“px4固件目录结构和代码风格”这一节,曾经说过NuttX是一个实时的嵌入式系统,上面可以像windows那样运行程序。那既然是应用程序,那我们应该也能写一些可以在NuttX上运行的程序。这一节介绍怎么在px工程中添加自己的模块。

说明:本文用到的固件版本是1.6.5dev。操作系统是Ubuntu16.04

程序修改具体步骤

凡是程序入门的教程,都是经典的“hello world”,所以我们新建一个可以输出“hello world”的模块。为了复习上一节的uORB通信,我们可以在“hello world”后把一些传感器的数据输出来。

首先在Firmware\src\modules下新建文件夹,起名gaoweijintask。在下面新建文件gaoweijintask.c和CMakeLists.txt。
其中CMakeLists.txt中的内容:

px4_add_module(MODULE modules__gaoweijintaskMAIN gaoweijintaskSTACK_MAIN 200COMPILE_FLAGSSRCSgaoweijintask.c)

第二行代表这个模块在目录modules\gaoweijintask下,注意中间是两个下划线。

第三行代表这个模块的主函数是test,在代码中是gaoweijintask_main。

第五行代表这个模块用到的源文件。

gaoweijintask.c中的内容:

#include <stdio.h>__EXPORT int gaoweijintask_main(int argc, char *argv[]);int gaoweijintask_main(int argc, char *argv[])
{printf("Hello World!\n");return 1;
}

这个时候还需要在编译的配置中添加这个模块,在Firmware\cmake\configs下新建我们的配置文件nuttx_px4fmu-v2_gaoweijin.cmake,其中内容如下:

include(configs/nuttx_px4fmu-v2_default)list(APPEND config_module_listmodules/gaoweijintask)

这代表在默认的配置下加入新模块gaoweijintask,而且这个模块的路径是modules/gaoweijintask。

执行编译命令

make px4fmu-v2_gaoweijin

等待编译完成后下载到pixhawk中。

效果测试

为了测试我们的程序,我们需要用到nuttx系统的shell,nsh。

目前的px4固件版本,用putty查看nsh控制台时,会出现乱码。网上有说要拔掉SD卡,但是依然乱码。解决办法是:
将 /Firmware/ROMFS/px4fmu_common/init.d/rcS 文件中的

# Start MAVLinkmavlink start -r 800000 -d /dev/ttyACM0 -m config -x

替换为

# Start USB shell if no microSD present, MAVLink elseif [ $LOG_FILE == /dev/null ]then# Try to get an USB consolenshterm /dev/ttyACM0 &elsemavlink start -r 800000 -d /dev/ttyACM0 -m config -xfi

然后在进nsh的时候拔掉sd卡。进nsh我们需要用到一个工具,putty。

Ubuntu安装putty命令

sudo apt-get install putty

打开putty,选择串口/dev/ttyACM0,波特率选择57600。
输入help回车,查看可用的命令,会发现有一条gaoweijintask,这就是我们新添加的模块。

输入gaoweijintask start 并回车,显示Hello World!。这说明我们的模块添加成功了。

添加新模块实现输出加速度计的值

接下来实现一个简单的应用,通过nsh把加速度计的值打印出来。利用上一节的获取uORB消息的方法,获取加速度计的值。替换gaoweijintask.c中的内容为:

#include <nuttx/config.h>
#include <unistd.h>
#include <stdio.h>
#include <poll.h>#include <uORB/uORB.h>
#include <uORB/topics/sensor_combined.h>__EXPORT int gaoweijintask_main(int argc, char *argv[]);int gaoweijintask_main(int argc, char *argv[])
{printf("Hello World!\n");/*订阅sensor_combined 主题*/int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));/*一个应用可以等待多个主题,在这里只等待一个主题*/struct pollfd fds[] = {{ .fd = sensor_sub_fd,   .events = POLLIN },/* 这里可以添加更多的文件描述符;* { .fd = other_sub_fd,   .events = POLLIN },*/};int error_counter = 0;while (true) {/*poll函数调用阻塞的时间为1s*/int poll_ret = poll(fds, 1, 1000);/*处理poll返回的结果 */if (poll_ret == 0) {/* 这表示时间溢出了,在1s内没有获取到发布者的数据 */printf("[gaoweijin_task] Got no data within a second\n");} else if (poll_ret < 0) {/* 出现问题 */if (error_counter < 10 || error_counter % 50 == 0) {/* use a counter to prevent flooding (and slowing us down) */printf("[gaoweijin_task] ERROR return value from poll(): %d\n", poll_ret);}error_counter++;} else {if (fds[0].revents & POLLIN) {/*从文件描述符中获取订阅的数据*/struct sensor_combined_s raw;/* copy sensors raw data into local buffer */orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);printf("[gaoweijin_task] Accelerometer:\t%8.4f\t%8.4f\t%8.4f\n",(double)raw.accelerometer_m_s2[0],(double)raw.accelerometer_m_s2[1],(double)raw.accelerometer_m_s2[2]);}/* 如果有更多的文件描述符,可以这样:* if (fds[1..n].revents & POLLIN) {}*/}}return 0;
}

在putty中输入gaoweijintask并回车,得到:

PX4代码学习系列博客(5)——在px4中添加自己的模块相关推荐

  1. PX4代码学习系列博客(6)——offboard模式位置控制代码分析(之前转载过,这是第二次转载了)

    我刚刚发现这篇文章去年八月份的时候转载过一次了 https://blog.csdn.net/sinat_16643223/article/details/107874349 转载自:https://b ...

  2. 点云深度学习系列博客(二): 点云配准网络PCRNet

    目录 一. 简介 二. 基础结构 三. 项目代码 四. 实验结果 总结 Reference 今天的点云深度学习系列博客为大家介绍一个用于点云配准的深度网络:PCRNet [1].凡是对点云相关应用有些 ...

  3. 点云深度学习系列博客(四): PointNet代码精讲

    目录 1. 代码解析 1.1 初始化 1.2 数据载入 1.3 模型载入 1.4 训练代码 2. 实验结果 Reference 最近开始上手点云深度学习项目,相比之前纸上谈兵的阶段,此时我将把更多的精 ...

  4. 点云深度学习系列博客(一): 点云特征学习网络PCPNet

    目录 一. 简介 二. 基础结构 三. 项目代码 四. 实验结果 总结 Reference 最近开始研究点云分析的相关项目,经过文献调研我发现,近几年比较热的方法,基本都是基于深度学习框架设计的.正好 ...

  5. 【技术博客】2020.04.28-简单塔防游戏和棋牌游戏构架学习 ——学习系列博客(一)构架初探

    序言,保卫萝卜项目作为自己学习整体游戏项目的开始,还是很有收获的. 项目初步实现了分管关卡地图编辑.场景结构.关卡选择.游戏地图等主要功能,同时内部构架采用了MVC加单例的构架,对我这种初学者还是很有 ...

  6. android中页面自动跳转,【学习笔记-安卓开发】8. Android Studio如何实现页面自动跳转(安卓学习系列博客)...

    先将上上一篇博客中写在页面里的button以及相关代码删除 8.如何让页面自动跳转 在安卓开发中有一个非常重要的Handler 当我们输入Handler会出现两个提示,一个是os中的,一个是loggi ...

  7. flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥

    前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutte ...

  8. 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  9. 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

最新文章

  1. TreaponseHeader
  2. matlab unique函数
  3. 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...
  4. php 正则 回溯,PHP正则匹配绕过
  5. 朴素贝叶斯法---朴素贝叶斯法的参数估计
  6. SAP CRM Fiori My task应用里roundtrip取舍的讨论
  7. 国内linux内核镜像仓库,国内较快的maven仓库镜像
  8. tshark (wireshark)笔记
  9. EOS钱包及代码分析
  10. GPS原始坐标转百度地图坐标(纯C代码)
  11. 从抖音到“奶头乐“,它是如何一步步毁掉我们的?
  12. 电脑桌面简约时钟工具OneClock
  13. mac怎么打开rar文件
  14. php读取加密sqlite,加密你的SQLite
  15. CRM-客户关系管理(Customer Relationship Management)
  16. 用Python批处理将WORD文件转换成PDF格式(工具:win32com模块)
  17. PowerShell install 一键部署VMware_Workstation
  18. 通过冥想解除困意,提升精神
  19. 忆享科技聚焦|数字经济、网络安全、5.5G、数字火炬手……热点资讯一览
  20. Python代码实现两张图片的拼接

热门文章

  1. uni.app的剪切板
  2. 螺杆启闭机的安装和调试
  3. QT入门Containers之QScrollArea
  4. 计算机学习资源网站汇总(史上最全IT学习资源站点汇总,干货!!)
  5. 音响发烧友福音!亚马逊中国“国际品质悦听馆”上线
  6. deep-hight-relolution-net.pytorch训练自己的关键点检测数据步骤
  7. 联通无线猫3G转换WiFi是不是鸡肋?
  8. css 查看更多_CSS粘性定位固定表格thead部分元素小方法
  9. fullPage.js和Wow.js不兼容的问题(已解决,方法待优化)
  10. 大学生就业率是多少?出来找工作最有用的东西是什么?考研的真经是什么?