PX4模块设计之二:uORB消息代理

2023-05-16

PX4模块设计之二:uORB消息代理

  • 1. uORB模块接口
  • 1.1. uORB服务接口
  • 1.2. uORB消息注册/去注册接口
  • 1.3. uORB消息发布接口
  • 1.4. uORB消息订阅/去订阅接口
  • 1.5. uORB辅助功能接口
  • 2. Hello World with uORB
    • 2.1. px4_simple_app工程结构
    • 2.2. px4_simple_app之Hello World
    • 2.3. px4_simple_app之uORB
    • 2.4. px4_simple_app之CMakeList.txt
    • 2.5. px4_simple_app之Kconfig
  • 3. 测试应用(SITL)
  • 4. 参考资料

uORB(Micro Object Request Broker,微对象请求代理器)是PX4中非常重要且关键的一个模块,通过异步publish/subscribe的消息传递方式,用于各个模块之间的数据交互。

这个使我想到了11年的时候,接触的CORBA, Common Object Request Broker。度娘了一圈(包括Google),发现这个uORB是PX4的特殊模块,也没有被抽象出来(比如:Nuttx,MAVLink,Coap,Mqtt等能独立抽象出来)。

In distributed computing, an object request broker (ORB) is a middleware which allows program calls to be made from one computer to another via a computer network, providing location transparency through remote procedure calls. ORBs promote interoperability of distributed object systems, enabling such systems to be built by piecing together objects from different vendors, while different parts communicate with each other via the ORB.

其实对象模型更多考虑是解耦(松耦合模块设计),当然这个和我们前面PX4开源软件框架简明简介的框架设计原则是非常吻合的。

既然这样先对这个模块进行下了解,关于内部实现细节和模块性能这方面我们暂放一边。

1. uORB模块接口

接口文件定义:

platforms\common\uORB\uORB.h

服务模型

1.1. uORB服务接口

int uorb_start(void); //启动服务

int uorb_status(void); //服务状态查询,命令行打印状态

int uorb_top(char **topic_filter, int num_filters); //uORB动态情况查询,类似top

1.2. uORB消息注册/去注册接口

orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data); //注册uORB主题(缓存1个消息)

orb_advert_t orb_advertise_queue(const struct orb_metadata *meta, const void *data, unsigned int queue_size); //注册uORB主题(缓存queue_size个消息)

orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance); //注册多实例uORB主题(每个实例缓存1个消息)

orb_advert_t orb_advertise_multi_queue(const struct orb_metadata *meta, const void *data, int *instance, unsigned int queue_size);  //注册多实例uORB主题(每个实例缓存queue_size个消息)

int orb_unadvertise(orb_advert_t handle); //去注册uORB主题

1.3. uORB消息发布接口

int	orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data); //发布uORB消息

int orb_publish_auto(const struct orb_metadata *meta, orb_advert_t *handle, const void *data, int *instance); //整合注册uORB主题+发布uORB消息的函数(支持多实例)

1.4. uORB消息订阅/去订阅接口

int	orb_subscribe(const struct orb_metadata *meta); //订阅uORB主题

int	orb_subscribe_multi(const struct orb_metadata *meta, unsigned instance); //订阅uORB主题(针对特定主题)

int	orb_unsubscribe(int handle); //去订阅uORB主题

1.5. uORB辅助功能接口

int	orb_copy(const struct orb_metadata *meta, int handle, void *buffer); //获取uORB主题消息数据

int	orb_check(int handle, bool *updated); //用来检查一个主题在发布者上一次更新数据后,有没有订阅者调用过ob_copy来接收、处理过

int	orb_exists(const struct orb_metadata *meta, int instance); //检测一个主题是否存在

int	orb_group_count(const struct orb_metadata *meta); //检查有多少个实例

int	orb_set_interval(int handle, unsigned interval); //设置订阅的最小时间间隔。如果设置了,则在这间隔内发布的数据将订阅不到;需要注意的是,设置后,第一次的数据订阅还是由最初设置的频率来获取。

int	orb_get_interval(int handle, unsigned *interval); //获取订阅的最小时间间隔

char *orb_get_c_type(unsigned char short_type); //ctype类型检查

void orb_print_message_internal(const struct orb_metadata *meta, const void *data, bool print_topic_name); //内部debug函数

2. Hello World with uORB

PX4是提供了一个完整的飞控解决方案。什么叫完整,不仅仅是结果,还会提供过程,甚至是为什么。所以这个【Hello World with uORB】的示例代码,已经有了。

-不仅开源,还专业,哈哈!!!

注1:完整代码详见链接。
注2:关于自定义消息这块内容,后面我们会找机会介绍,先了解这个模块和简单应用。

2.1. px4_simple_app工程结构

这个就是完整的Hello World任务工程。为什么这里叫任务工程(是我自己随便叫的),主要原因:

  1. PX4代码主要是跑在两种OS上(Nuttx or Unix), Nuttx任务对应linux线程;
  2. PX4代码在Nuttx上主要是启动多个任务
  3. PX4代码在Unix上主要是启动一个进程下的多个线程(对应Nuttx任务)
  4. PX4代码采用CMakeLists.txt和MODULE的方式来对应用层进行打包
src\examples\px4_simple_app\
 ├──> px4_simple_app.c
 ├──> CMakeLists.txt
 └──> Kconfig

2.2. px4_simple_app之Hello World

这里是Hello World代码,很熟悉吧!类似C语言Linux应用程序之Helloworld入门

54 __EXPORT int px4_simple_app_main(int argc, char *argv[]);
55 
56 int px4_simple_app_main(int argc, char *argv[])
57 {
58 	PX4_INFO("Hello Sky!");

2.3. px4_simple_app之uORB

示例代码中使用了以下API

  1. orb_subscribe
  2. orb_set_interval
  3. orb_advertise
  4. orb_copy
  5. orb_publish
60 	/* subscribe to vehicle_acceleration topic */
61 	int sensor_sub_fd = orb_subscribe(ORB_ID(vehicle_acceleration));
62 	/* limit the update rate to 5 Hz */
63 	orb_set_interval(sensor_sub_fd, 200);
64 
65 	/* advertise attitude topic */
66 	struct vehicle_attitude_s att;
67 	memset(&att, 0, sizeof(att));
68 	orb_advert_t att_pub = orb_advertise(ORB_ID(vehicle_attitude), &att);
69 
70 	/* one could wait for multiple topics with this technique, just using one here */
71 	px4_pollfd_struct_t fds[] = {
72 		{ .fd = sensor_sub_fd,   .events = POLLIN },
73 		/* there could be more file descriptors here, in the form like:
74 		 * { .fd = other_sub_fd,   .events = POLLIN },
75 		 */
76 	};
77 
78 	int error_counter = 0;
79 
80 	for (int i = 0; i < 5; i++) {
81 		/* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */
82 		int poll_ret = px4_poll(fds, 1, 1000);
83 
84 		/* handle the poll result */
85 		if (poll_ret == 0) {
86 			/* this means none of our providers is giving us data */
87 			PX4_ERR("Got no data within a second");
88 
89 		} else if (poll_ret < 0) {
90 			/* this is seriously bad - should be an emergency */
91 			if (error_counter < 10 || error_counter % 50 == 0) {
92 				/* use a counter to prevent flooding (and slowing us down) */
93 				PX4_ERR("ERROR return value from poll(): %d", poll_ret);
94 			}
95 
96 			error_counter++;
97 
98 		} else {
99 
100			if (fds[0].revents & POLLIN) {
101				/* obtained data for the first file descriptor */
102				struct vehicle_acceleration_s accel;
103				/* copy sensors raw data into local buffer */
104				orb_copy(ORB_ID(vehicle_acceleration), sensor_sub_fd, &accel);
105				PX4_INFO("Accelerometer:\t%8.4f\t%8.4f\t%8.4f",
106					 (double)accel.xyz[0],
107					 (double)accel.xyz[1],
108					 (double)accel.xyz[2]);
109
110				/* set att and publish this information for other apps
111				 the following does not have any meaning, it's just an example
112				*/
113				att.q[0] = accel.xyz[0];
114				att.q[1] = accel.xyz[1];
115				att.q[2] = accel.xyz[2];
116
117				orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);
118			}
119
120			/* there could be more file descriptors here, in the form like:
121			 * if (fds[1..n].revents & POLLIN) {}
122			 */
123		}
124	}
125
126	PX4_INFO("exiting");

2.4. px4_simple_app之CMakeList.txt

px4_add_module() 方法根据模块描述生成静态库。

  • MODULE块是模块的唯一固件名称(按照惯例,模块名称的前缀是src之后的父路径)
  • MAIN块列出了模块的入口点,它将命令注册到 NuttX,以便可以从 PX4 shell 或 SITL 控制台调用它。
33 px4_add_module(
34 	MODULE examples__px4_simple_app
35 	MAIN px4_simple_app
36	SRCS
37 		px4_simple_app.c
38 	DEPENDS
39 	)

2.5. px4_simple_app之Kconfig

Kconfig文件里面定义了:

  1. 任务的名称: px4_simple_app
  2. Kconfig符号:EXAMPLES_PX4_SIMPLE_APP
  3. 默认选择:n
  4. 该任务的描述
1 menuconfig EXAMPLES_PX4_SIMPLE_APP
2 	bool "px4_simple_app"
3 	default n
4 	---help---
5 		Enable support for px4_simple_app

3. 测试应用(SITL)

这里就用SITL来做下测试效果。
注:自己的KakuteF7还有BetaFlight,目前懒得动bootloader。

由于SITL代码编译和有硬件目标板的Kconfig配置有些差异,无法使用命令:

$ make px4_sitl menuconfig

我们查下build工程下的boardconfig文件,看下这个文件是否已经选中编译我们的这个任务模块(449行):

436 #
437 # examples
438 #
439 CONFIG_EXAMPLES_DYN_HELLO=y
440 CONFIG_EXAMPLES_FAKE_GPS=y
441 # CONFIG_EXAMPLES_FAKE_GYRO is not set
442 CONFIG_EXAMPLES_FAKE_IMU=y
443 CONFIG_EXAMPLES_FAKE_MAGNETOMETER=y
444 CONFIG_EXAMPLES_FIXEDWING_CONTROL=y
445 CONFIG_EXAMPLES_HELLO=y
446 # CONFIG_EXAMPLES_HWTEST is not set
447 # CONFIG_EXAMPLES_MATLAB_CSV_SERIAL is not set
448 CONFIG_EXAMPLES_PX4_MAVLINK_DEBUG=y
449 CONFIG_EXAMPLES_PX4_SIMPLE_APP=y
450 CONFIG_EXAMPLES_ROVER_STEERING_CONTROL=y
451 CONFIG_EXAMPLES_UUV_EXAMPLE_APP=y
452 CONFIG_EXAMPLES_WORK_ITEM=y
453 # end of examples

整体构建下代码,并运行仿真环境:

$ make px4_sitl jmavsim

在仿真pxh命令提示下,help看下内部支持的命令是否含有px4_simple_app

pxh> help
Builtin Commands:
  actuator_test
  airship_att_control
  airspeed_selector
  attitude_estimator_q
  battery_simulator
  camera_feedback
  camera_trigger
  cdev_test
  commander
  commander_tests
  control_allocator
  controllib_test
  dataman
  dyn
  ekf2
  ex_fixedwing_control
  failure
  fake_gps
  fake_imu
  fake_magnetometer
  flight_mode_manager
  fw_att_control
  fw_autotune_attitude_control
  fw_pos_control_l1
  gimbal
  gps
  gyro_calibration
  gyro_fft
  hello
  hrt_test
  land_detector
  landing_target_estimator
  led_control
  list_files
  list_tasks
  listener
  load_mon
  local_position_estimator
  logger
  mag_bias_estimator
  manual_control
  mavlink
  mavlink_tests
  mc_att_control
  mc_autotune_attitude_control
  mc_hover_thrust_estimator
  mc_pos_control
  mc_rate_control
  mixer
  motor_test
  navigator
  param
  perf
  pwm
  pwm_out_sim
  px4_mavlink_debug
  px4_simple_app
  rc_tests
  rc_update
  replay
  rover_pos_control
  rover_steering_control
  rpm_simulator
  sd_bench
  send_event
  sensor_baro_sim
  sensor_gps_sim
  sensor_mag_sim
  sensors
  shutdown
  sih
  simulator
  sleep
  system_time
  temperature_compensation
  tests
  tone_alarm
  tune_control
  uorb
  uorb_tests
  uuv_att_control
  uuv_example_app
  uuv_pos_control
  ver
  vtol_att_control
  work_item_example
  work_queue
  wqueue_test

在仿真pxh命令提示下运行:

pxh> px4_simple_app
INFO  [px4_simple_app] Hello Sky!
INFO  [px4_simple_app] Accelerometer:	  0.0373	 -0.0432	 -9.7909
INFO  [px4_simple_app] Accelerometer:	  0.0652	 -0.0592	 -9.7908
INFO  [px4_simple_app] Accelerometer:	  0.0738	 -0.0068	 -9.7628
INFO  [px4_simple_app] Accelerometer:	  0.0282	 -0.0097	 -9.8224
INFO  [px4_simple_app] Accelerometer:	  0.0637	 -0.0293	 -9.7856
INFO  [px4_simple_app] exiting

不过这里有一点可能看不到了,因为orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);混在在很多仿真模拟数据里面了。有兴趣可以研改下代码,将这个ACC的值放大到很大,显示一个差异。

具体QGroundControl的验证方法可以参考:PX4开发环境搭建–模拟器编译及QGroundControl & RC遥控模拟配置

4. 参考资料

【1】uORB Messaging
【2】First Application Tutorial (Hello Sky)

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

PX4模块设计之二:uORB消息代理 的相关文章

  • 在ArduPilot旋翼机上安装PX4Flow光流传感器

    在ArduPilot旋翼机上安装PX4Flow光流传感器 本作品采用知识共享署名 相同方式共享 3 0 未本地化版本许可协议进行许可 预先要求 在安装和调试光流传感器之前 xff0c 请先保证 xff1a 旋翼机已经安装 调试完毕 xff0
  • 教程:使用树莓派连接Pixhawk飞控

    教程 xff1a 使用树莓派连接Pixhawk飞控 树莓派可以与Pixhawk飞控相连 xff0c 读取飞控中的状态信息 xff0c 同时对飞控发送指令 树莓派作为一个更高性能的计算平台 xff0c 可以运行图像识别 机器学习 实时路径规划
  • STM32Cube的PWM控制基础篇(一)一路PWM设置

    以下是有关STM32cube的PWM的花式操作 xff0c 大佬们在看下面链接之前建议先看完本博客 xff0c 个人觉得写的比较详细 xff0c 欢迎大佬之指正 xff01 STM32Cube的PWM控制基础篇 xff08 二 xff09
  • MissionPlanner找不到全部参数表(Full Parameter List)的解决方法

    MissionPlanner 找不到全部参数表 xff08 Full Parameter List xff09 的解决方法 ArduPilot是一款强大的开源飞控软件 xff0c 在使用MissionPlanner的高级功能的时候 xff0
  • Pixhawk室内自动控制:参数设置

    Pixhawk室内自动控制 xff1a 参数设置 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 的Pixhawk用户 ArduCopter目前 xff08 3 52 xff09 已经能够使用光流传感器提供的位置信
  • Pixhawk室内自动控制:参数设置(SITL)

    Pixhawk室内自动控制 xff1a 参数设置 xff08 SITL xff09 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 进行开发 xff0c 期望实现室内自动控制的Pixhawk用户 这篇文章讲解了如何
  • DroneKit教程(一):安装DroneKit和测试工具

    DroneKit教程 xff08 一 xff09 xff1a 安装DroneKit和测试工具 DroneKit Python是一个用于控制无人机的Python库 DroneKit提供了用于控制无人机的API xff0c 其代码独立于飞控 x
  • DroneKit教程(二):控制Pixhawk示例

    DroneKit教程 xff08 二 xff09 xff1a 控制Pixhawk示例 本篇提供了一个简单的示例 xff0c 配以详细的注释说明不同语句的功能 xff0c 希望能给各位一个总体的框架和印象 该示例文件改写自DroneKit的官
  • DroneKit教程(三):连接Pixhawk飞控

    DroneKit教程 xff08 三 xff09 xff1a 连接Pixhawk飞控 DroneKit提供了非常简便的代码 xff0c 可通过多种方式与飞控连接 连接飞控 使用DroneKit中的connect函数 xff0c 可以方便地连
  • DroneKit教程(四):属性和参数的读取与设置

    DroneKit教程 xff08 四 xff09 xff1a 属性和参数的读取与设置 DroneKit内置了无人机的属性和参数 xff0c 使用简单的Python代码即可进行读取和修改 此教程的例子均使用在本地编译完成的SITL进行测试 如
  • DroneKit教程(五):使用自定义MAVLink指令

    DroneKit教程 xff08 五 xff09 xff1a 使用自定义MAVLink指令 DroneKit的实质是通过发送和接受MAVLink消息 xff0c 向飞控发送控制指令 从飞控获取各种状态信息 DroneKit的所有内置功能都是
  • DroneKit教程(六):继承和自定义Vehicle类

    DroneKit教程 xff08 六 xff09 xff1a 继承和自定义Vehicle类 DroneKit的Vehicle类内置了许多基于MAVLink消息的属性数据 xff0c 但同时也有许多属性数据没有被支持 有时 xff0c 为了支
  • DroneKit教程(七):遥控信道覆盖

    DroneKit教程 xff08 七 xff09 xff1a 遥控信道覆盖 MAVLink支持一项有用却又非常危险的功能 xff1a 遥控信道覆盖 xff08 Channel Override xff09 遥控信道覆盖可以将任一至全部通道的
  • STM32Cube的PWM控制基础篇(三)定时器的PWM设置详解

    STM32Cube的PWM控制基础篇 xff08 一 xff09 一路PWM设置 STM32Cube的PWM控制基础篇 xff08 二 xff09 多路占空比不同的PWM 今天是挤牙膏的第三天 xff0c 感觉如果每天都放很多干货的话可能会
  • 教程:使用DroneKit在室内控制无人机

    教程 xff1a 使用DroneKit在室内控制无人机 DroneKit Python是一个用于控制无人机的Python库 DroneKit提供了用于控制无人机的API xff0c 其代码独立于飞控 xff0c 单独运行在机载电脑 xff0
  • OpenCV 3.3+VS2017+Win10环境配置指南

    OpenCV 3 3 43 VS2017 43 Win10环境配置指南 最近开始接触OpenCV xff0c 没想到安装和环境配置又踩了不少坑 一开始本着对官网的信任 xff0c 按着官方tutorial里的步骤走 xff0c 但是怎么样都
  • 朴素贝叶斯算法原理

    朴素贝叶斯算法原理 朴素贝叶斯分类器 xff08 Naive Bayes Classifier xff09 的优点是运算时间短 数学原理清晰 xff0c 我在MNIST和CIFAR 10数据集上测试 xff0c 错误率分别为15 74 和5
  • ubuntu18.04更新源方法

    前言 Ubuntu自带默认的软件源指向的服务器是部署在国外的 xff0c 在国内进行软件下载更新时会非常慢 xff0c 可以通过更改源地址指向国内的镜像数据源 xff0c 比如阿里 网易 清华 中科等等 PS xff1a 因为今天群里有人在
  • 数据结构算法学习总结-慕课网(五)冒泡排序,与选择,插入排序的异同(从小到大)

    数据结构算法学习总结 慕课网 xff08 五 xff09 冒泡排序 xff0c 与选择 xff0c 插入排序的异同 xff08 从小到大 xff09 1 回顾 上一节讲到了插入排序的优化 xff0c 了解了插入排序的优势 xff0c 这一节
  • 拒绝采样(reject sampling)原理详解

    文章转自 xff1a https blog csdn net jteng article details 54344766 版权归原作者 xff01 蒙特 卡罗方法 Monte Carlo method 也称统计模拟方法 xff0c 通过重

随机推荐

  • Ubuntu sudo 命令行直接输入密码

    在 sh 文件中输入命令时碰上输入密码的最让人头疼 xff0c 就要想一个办法密码自动填充 xff1b 例子 xff1a echo 123 sudo S su 假之密码为123 原命令为 sudo su
  • ESP32+Blufi+Tcp+UART

    ESP32 43 Blufi 43 TCP 43 UART 在上上一篇文章的基础上添加了蓝牙配网的功能 xff0c 第一次连接WiFi时 xff0c 通过手机微信小程序蓝牙配网 xff0c 第二次通过记录的WiFi内容就能够直接连接 参考的
  • ESP32+UART+TCP_Client+OTA

    在上一篇博客的基础上添加了OTA空中升级功能 实现的功能是一个WiFi DTU模块 xff0c ESP32板子通过串口与下位机连接 xff0c 我目前使用的下位机为51 xff0c ESP32第一次启动时 xff0c 通过微信小程序连接wi
  • ubuntu 网络编程

    ubuntu的网络编程 网络编程 一般有两种 TCP 和 UDP TCP 是面向连接层的传输协议 是无误的 数据没有丢失的失序 和 数据不会重复到达的 UDP是用户数据协议 是不可靠的无连接的协议 xff0c 但是可以进行高效率的传输 说起
  • 头文件intrins.h的用法

    KEIL 中 头文件 INTRINS H的作用 在 C51 单片机编程中 xff0c 头文件 INTRINS H 的函数使用起来 xff0c 就会让你像在用汇编时一样简便 内部函数 描述 crol 字符循环左移 cror 字符循环右移 ir
  • 4G DTU 透传模块简单使用方法

    不是打广告 xff0c 纯记录用途 最近由于项目需要 xff0c 买了一批4g 透传模块 众所周知 xff0c 两个4g模块一般不能直连 xff0c 需要中间通过搭建服务器来搭桥 卖家把桥搭好了 xff0c 自己简单配置下 xff0c 就可
  • ucos多任务与linux进程、多线程的比较分析

    从最初使用51片机 xff0c 再到avr msp430 xff0c arm7 arm9裸机 xff0c 单片机的处理速度越来越快 xff0c 而产品需求的日新月异 xff0c 在硬件成本 功耗 体积以及开发周期等的限制下 xff0c 开发
  • 【记录】Ubuntu下简单的软件安装-aptitude安装,samba安装,terminator软件

    Ubuntu下安装简单的软件 一 安装aptitude管理软件 sudo apt get install aptitude 这样可以使用aptitude来管理软件 如下命令 xff1a sudo aptitude update 更新软件源
  • freeRTOS开源项目crazyflie

    不小心接触到了开源飞控 xff0c 有一个小四轴的项目 xff1a crazyflie xff0c 有兴趣百度搜 使用的就是freeRTOS内核 xff0c 可以作为学习freeRTOS应用的一个参考 另外freeRTOS官方源码包里面就有
  • ROS serial串口通讯

    目录 ROS serial 串口通讯安装基本使用代码示例 Reference ROS serial 串口通讯 安装 sudo apt get install ros kinetic serial 基本使用 代码示例 include lt r
  • 四轴飞控DIY简明步骤介绍

    新手四轴飞控DIY组装简明步骤介绍 1 什么叫做新手 xff1f 2 新手如何思考 xff1f 3 上手步骤Step1 xff1a 四轴飞控介绍定义运动原理组成 Step2 xff1a 四轴飞控组装视频Step3 xff1a 四轴飞控新手规
  • BetaFlight开源工程结构简明介绍

    BetaFlight开源工程结构简明介绍 Step1 获取开源代码开源代码版本克隆开源代码 Step2 了解工程情况支持模型类型 xff1a 多旋翼 amp 固定翼支持特性 amp 功能安装 amp 文档链接配置工具下载其他介绍 xff08
  • 四轴FPV无人机手动操作简明介绍

    四轴FPV无人机手动操作简明介绍 通常航拍机都是有自稳算法 43 GPS导航 43 辅助功能 避障 的支持 xff0c 从而保证飞手能够相对容易且稳定的操作模型飞机 xff0c 通常通过阅读说明书都能很快上手 xff0c 这里就不在赘述 本
  • BetaFlight模块设计之三十:Cli模块分析

    BetaFlight模块设计之三十 xff1a Cli模块分析 Cli模块Cli接口Cli框架Cli命令结构主要函数分析cliProcess函数processCharacterInteractive函数processCharacter函数
  • PX4开发环境搭建--模拟器编译及QGroundControl & RC遥控模拟配置

    PX4开发环境搭建 模拟器编译 1 PX4开发环境介绍2 PX4开发环境搭建2 1代码下载2 2 国内环境调整2 3 建立ubuntu开发环境2 4 构建jMAVSim仿真2 5 补充版本信息 3 jmavsim仿真环境3 1 仿真命令集3
  • Android中的枚举

    在ARouter源码中发现使用到了枚举 xff0c 说明枚举并不是不常见的 xff0c 刚好枚举在我的视野中处于盲区 xff0c 于是打算周末加班给拿下 xff0c 扩展视野 了解枚举之前首先说一下什么是常量和变量 常量 声明后无法改变的量
  • PX4开源工程结构简明介绍

    PX4开源工程结构简明介绍 Step1 获取开源代码1 1 开源代码版本1 2 克隆开源代码 Step2 了解工程情况2 1 支持模型类型2 2 支持特性 amp 功能2 3 安装 amp 文档链接2 4 配置工具下载2 5 其他介绍 xf
  • PX4开源软件框架简明简介

    PX4开源软件框架简明简介 1 PX4系统构架1 1 飞控 43 地面站 RC控制1 2 飞控 43 伴飞电脑 43 地面站 集成RC控制 2 PX4软件构架2 1 设计概念2 2 软件构架2 1 中间件2 2 飞控代码 3 PX4运行环境
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二:uORB消息代理

    PX4模块设计之二 xff1a uORB消息代理 1 uORB模块接口1 1 uORB服务接口1 2 uORB消息注册 去注册接口1 3 uORB消息发布接口1 4 uORB消息订阅 去订阅接口1 5 uORB辅助功能接口2 Hello W