PX4学习之-uORB简单体验
一、前言
最近项目使用到 CPU2 与 CPU0 之间的通信, 使用定时器传递消息到 CPU0 后, CPU0 需要将消息分发到不同的应用程序里面. PX4 里面使用的是 uORB 多线程/进程通信机制.
uORB 相关介绍参考: 官方 uORB 介绍 以及 无人机中级篇:第三讲:uORB原理与使用, 下文中的代码细节也不做过多解释。
目前使用的是 Firmware 的 1.82 版本 . 下文使用到的文件夹地址如下:
uORB 库文件位于
Firmware/src/modules/uORB.configs 文件位于
Firmware/cmake/configsdrivers 文件位于
Firmware/src/driversmsg 文件位于
Firmware/msg
二、Coding
主要的步骤为:
- 新建 msg
- 新建 publish 和 subscriber
- 将publish 和 subscriber 添加到 configs 目录下对应的板子里面去
- 编译上传。
2.1 新建 msg
在 msg 目录下面新建一个 cpu2.msg, 并将 cpu2 添加到 msg/CMakeLists.txt 文件中
cpu2 简单定义一个变量: length
uint32 length
2.2 新建 publish 和 subscriber
在 drivers 目录下面新建 uorb_publish 目录 以及 uorb_subscriber 目录, 并新建对应的文件, 结构如下
├── uorb_publish
│ ├── CMakeLists.txt
│ └── uorb_publish.cpp
├── uorb_subscriber
│ ├── CMakeLists.txt
│ └── uorb_subscriber.cpp
uorb_publish/CMakeLists.txt
px4_add_module(
MODULE drivers__uorb_publish
MAIN uorb_publish
STACK_MAIN 1200
COMPILE_FLAGS
SRCS
uorb_publish.cpp
DEPENDS
)
uorb_publish/uorb_publish.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <poll.h>
#include <px4_log.h>
#include <uORB/uORB.h>
#include <uORB/topics/cpu2.h>
#include <px4_workqueue.h>
extern "C" __EXPORT int uorb_publish_main(int argc, char *argv[]);
static orb_advert_t cpu2_topic;
static uint8_t cnt = 0;
static struct work_s work;
static struct cpu2_s att;
static void cycle_trampoline(void *arg)
{
PX4_INFO("publish \n");
if (cpu2_topic == NULL)
{
cpu2_topic = orb_advertise(ORB_ID(cpu2), &att);
}
att.length = cnt;
cnt++;
if (cnt == 255) {
cnt = 0;
}
orb_publish(ORB_ID(cpu2), cpu2_topic, &att);
(void)work_queue(HPWORK, &work, (worker_t)&cycle_trampoline, nullptr, USEC2TICK(1000 * 1000));
}
int uorb_publish_main(int argc, char *argv[])
{
PX4_INFO(" uorb_publish \n");
work = {};
cpu2_topic = NULL;
memset(&att, 0 , sizeof(att));
(void)work_queue(HPWORK, &work, (worker_t)&cycle_trampoline, nullptr, 0);
return 0;
}
uorb_subscriber/CMakeLists.txt
px4_add_module(
MODULE drivers__uorb_subscriber
MAIN uorb_subscriber
STACK_MAIN 1200
COMPILE_FLAGS
SRCS
uorb_subscriber.cpp
DEPENDS
)
uorb_subscriber/uorb_subscriber.cpp
#include <poll.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <px4_log.h>
#include <uORB/topics/cpu2.h>
#include <uORB/uORB.h>
#include <px4_workqueue.h>
#include <drivers/device/device.h>
extern "C" __EXPORT int uorb_subscriber_main(int argc, char *argv[]);
static struct work_s work;
static int cpu2_fd = 0;
static struct cpu2_s att;
static void cycle_trampoline(void *arg)
{
// PX4_INFO("subscriber \n");
if (cpu2_fd == 0)
{
cpu2_fd = orb_subscribe(ORB_ID(cpu2));
}
bool updated = false;
updated = false;
if (orb_check(cpu2_fd, &updated) != PX4_OK)
{
return;
}
if (updated)
{
orb_copy(ORB_ID(cpu2), cpu2_fd, &att);
PX4_INFO("%d \n", att.length);
}
work_queue(HPWORK,
&work,
(worker_t)&cycle_trampoline,
nullptr,
USEC2TICK(1000 * 1000));
}
int uorb_subscriber_main(int argc, char *argv[])
{
work = {};
cpu2_fd = 0;
memset(&att, 0 , sizeof(att));
PX4_INFO("uorb_subscriber ");
(void)work_queue(HPWORK, &work, (worker_t)&cycle_trampoline, nullptr, 0);
return 0;
}
2.3 将publish 和 subscriber 添加到 configs 目录下对应的板子里面去 以及 编译运行
三、运行结果以及常见问题
编译烧录到板子后,在
nsh键入?, 会显示如下nsh> ?
help usage: help [-v] [<cmd>] [ dirname false mkfatfs pwd true
? date free mkfifo rm uname
basename dd help mkrd rmdir umount
break df hexdump mh set unset
cat echo kill mount sh usleep
cd printf ls mv sleep xd
cp exec mb mw test
cmp exit mkdir ps time Builtin Apps: ...
uorb
uorb_publish
uorb_subscriber
...
nsh>
如果未出现
uorb_publish与uorb_subscriber, 原因在于 未将publish 和 subscriber 添加到 configs 目录下对应的板子里面去;先启动
uorb_subscriber, 再启动uorb_publish
nsh> uorb_subscriber
INFO [uorb_subscriber] uorb_subscriber
nsh> uorb_publish
INFO [uorb_publish] uorb_publish INFO [uorb_publish] publish nsh> INFO [uorb_subscriber] 0 INFO [uorb_publish] publish INFO [uorb_subscriber] 1 INFO [uorb_publish] publish INFO [uorb_subscriber] 2 INFO [uorb_publish] publish INFO [uorb_subscriber] 3 INFO [uorb_publish] publish INFO [uorb_subscriber] 4 INFO [uorb_publish] publish INFO [uorb_subscriber] 5 INFO [uorb_publish] publish INFO [uorb_subscriber] 6 INFO [uorb_publish] publish
.....
PX4学习之-uORB简单体验的更多相关文章
- PX4学习之-uORB msg 自动生成模板解读
最后更新日期 2019-06-22 一.前言 在 PX4学习之-uORB简单体验 中指出, 使用 uORB 进行通信的第一步是新建 msg.在实际编译过程中,新建的 msg 会转换成对应的 .h..c ...
- Linux入门学习教程:虚拟机体验之KVM篇
本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2. dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...
- 第三次随笔--安装虚拟机及学习linux系统初体验
第三次随笔--安装虚拟机及学习linux系统初体验 ·学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 首先按照老师的提示步骤进行VirtualBox虚拟 ...
- 【Cardboard】 体验 - Google Cardboard DIY及完成后简单体验
体验 - Google Cardboard DIY及完成后简单体验 今年的Google I/O最让我感兴趣的除了Material Design以外就是这个Google Cardboard了.据说是Go ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- Hibernate二次学习一----------Hibernate简单搭建
因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- oracle学习 第一章 简单的查询语句 ——03
1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示全部的列.它与在select 之后列出全部的列名是一样的.查询语句以分号( ...
- Spark学习笔记0——简单了解和技术架构
目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...
随机推荐
- 恶补一下DP+背包专题(刷刷水题)L2
开心的金明 题目大意 就是求一定背包容量的最大值 思路 想必大家都知道,一看到这种题目,就会想起01背包 虽然特别简单但是还是讲一下吧 状态设置 由于这题差不多是一个01背包的版子题,那么我们就只需要 ...
- [LeetCode] Remove Duplicates from Sorted List 链表
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...
- SaltStack 模块学习之拷贝master服务器上文件和目录到minion服务器
一. cp.get_file实现从master端复制文件到minion服务器的文件中cp.get_file 1. 修改/etc/salt/master ,指定server 工作的根目录 file- ...
- OSX 系统无法直接用 Chrome 双击点击打开本地 html 文件
在 Mac OS X 下,文件经常会被附加上 OS X 特有的扩展属性 ( extend attributes ),具体表现是用 ls -l 查看时会有 @ 的标记,譬如: $ ls -l index ...
- Facebook为什么使用PHP编程语言?
当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科 ...
- AC日记——[ZJOI2009]狼和羊的故事 bzoj 1412
1412 思路: 最小割: 狼作为一个点集a,空领地作为点集b,羊作为点集c: s向a连边,c向t连边,a向b连边,b向b连边,b向c连边: 如何理解最小割? a,c之间割掉最少的路径(栅栏)使其没有 ...
- 在typescript中import第三方类库clipboard报错
一.问题 在实际开发项目中就遇到了这样的问题,需要在Vue+Typescript项目中添加复制文本的功能,就找了clipboard插件,先是新建了一个新的项目用来实验看看是否好用,都写好了以后发给别人 ...
- 洛谷——P2383 狗哥玩木棒
P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...
- Java IO设计模式
JAVA IO 设计模式彻底分析 2011-01-06 14:20:09| 分类: java|字号 订阅 http://blog.csdn.net/tianyue168/archive/2010/0 ...
- sslstrip 中间人HTTP
https://moxie.org/software.html http://bbs.pediy.com/thread-173970.htm https://www.cnblogs.com/index ...