PX4模块设计之二十六:BatteryStatus模块

本文详细介绍了PX4飞行控制系统中BatteryStatus模块的工作原理与实现细节,包括模块的功能介绍、重要函数解析及硬件配置等内容。

1. BatteryStatus模块简介

### Description

The provided functionality includes:
- Read the output from the ADC driver (via ioctl interface) and publish `battery_status`.


### Implementation
It runs in its own thread and polls on the currently selected gyro topic.

battery_status <command> [arguments...]
 Commands:
   start

   stop

   status        print status info

注:print_usage函数是具体对应实现。

class BatteryStatus : public ModuleBase<BatteryStatus>, public ModuleParams, public px4::ScheduledWorkItem

注:battery_status模块采用了ModuleBaseWorkQueue设计。

2. 模块入口函数

2.1 主入口battery_status_main

这里比较简单,继承了ModuleBase,由ModuleBase的main来完成模块入口。

battery_status_main
 └──> return BatteryStatus::main(argc, argv)

2.2 自定义子命令custom_command

模块仅支持start/stop/status命令,不支持其他自定义命令。

BatteryStatus::custom_command
 └──> return print_usage("unknown command")

3. BatteryStatus模块重要函数

3.1 task_spawn

这里主要初始化了BatteryStatus对象,后续通过WorkQueue来完成进行轮询。

BatteryStatus::task_spawn
 ├──> BatteryStatus *instance = new BatteryStatus()
 ├──> <instance>
 │   ├──> _object.store(instance)
 │   ├──> _task_id = task_id_is_work_queue
 │   └──> <instance->init()>
 │       └──> return PX4_OK
 ├──> <else>
 │   └──> PX4_ERR("alloc failed")
 ├──> delete instance
 ├──> _object.store(nullptr)
 ├──> _task_id = -1
 └──> return PX4_ERROR

3.2 instantiate

注:鉴于该模块不采用任务(线程),所以ModuleBase::run_trampoline无需执行,所以可以不实现。

3.3 init

在task_spawn中使用,对_adc_report_sub成员变量进行事件回调注册(当有adc_report消息时,会调用SubscriptionCallbackWorkItem::ScheduleNow,再触发BatteryStatus::Run过程)。

BatteryStatus::init
 └──> return _adc_report_sub.registerCallback()

注:这里真正调用ScheduleNow的不是BatteryStatus类,而是该类内部成员变量_adc_report_sub。

uORB::SubscriptionCallbackWorkItem _adc_report_sub{this, ORB_ID(adc_report)};

3.4 Run

每次WorkQueue执行,会自动调用Run函数,详见:PX4模块设计之十三:WorkQueue设计

BatteryStatus::Run
 ├──> <should_exit()>
 │   ├──> exit_and_cleanup()
 │   └──> return
 ├──> perf_begin(_loop_perf)
 ├──> parameter_update_poll()  // check parameters for updates
 ├──> adc_poll()  // check battery voltage
 └──> perf_end(_loop_perf)

注:关于adc_report消息的来由,可参考:PX4模块设计之二十四:内部ADC模块

4. 硬件配置

鉴于当前硬件板子使用的是Holybro Kakute AIO F7,其硬件配置如下:

86 #define ADC_RSSI_IN_CHANNEL                 /* PC5 */  ADC1_CH(15)
87 #define ADC_BATTERY_VOLTAGE_CHANNEL         /* PC3 */  ADC1_CH(13)
88 #define ADC_BATTERY_CURRENT_CHANNEL         /* PC2 */  ADC1_CH(12)
89 
90 #define ADC_CHANNELS \
91 	((1 << ADC_BATTERY_VOLTAGE_CHANNEL)       | \
92 	 (1 << ADC_BATTERY_CURRENT_CHANNEL)       | \
93 	 (1 << ADC_RSSI_IN_CHANNEL))
138 #if !defined(BOARD_NUMBER_BRICKS)
139 #  define BOARD_NUMBER_BRICKS 1
140 #  if !defined(BOARD_ADC_BRICK_VALID)
141 #    define BOARD_ADC_BRICK_VALID (1)
142 #  endif
143 #endif
144
145 #if BOARD_NUMBER_BRICKS == 0
146 /* allow SITL to disable all bricks */
147 #elif BOARD_NUMBER_BRICKS == 1
148 #  define BOARD_BATT_V_LIST       {ADC_BATTERY_VOLTAGE_CHANNEL}
149 #  define BOARD_BATT_I_LIST       {ADC_BATTERY_CURRENT_CHANNEL}
150 #  define BOARD_BRICK_VALID_LIST  {BOARD_ADC_BRICK_VALID}
151 #elif BOARD_NUMBER_BRICKS == 2
152 #  if  defined(BOARD_NUMBER_DIGITAL_BRICKS)
153 #    define BOARD_BATT_V_LIST       {-1, -1}
154 #    define BOARD_BATT_I_LIST       {-1, -1}
155 #  else
156 #    define BOARD_BATT_V_LIST       {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL}
157 #    define BOARD_BATT_I_LIST       {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL}
158 #  endif
159 #  define BOARD_BRICK_VALID_LIST  {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID}
160 #elif BOARD_NUMBER_BRICKS == 3
161 #  define BOARD_BATT_V_LIST       {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL, ADC_BATTERY3_VOLTAGE_CHANNEL}
162 #  define BOARD_BATT_I_LIST       {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL, ADC_BATTERY3_CURRENT_CHANNEL}
163 #  define BOARD_BRICK_VALID_LIST  {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID, BOARD_ADC_BRICK3_VALID}
164 #elif BOARD_NUMBER_BRICKS == 4
165 #  define BOARD_BATT_V_LIST       {ADC_BATTERY1_VOLTAGE_CHANNEL, ADC_BATTERY2_VOLTAGE_CHANNEL, ADC_BATTERY3_VOLTAGE_CHANNEL, ADC_BATTERY4_VOLTAGE_CHANNEL}
166 #  define BOARD_BATT_I_LIST       {ADC_BATTERY1_CURRENT_CHANNEL, ADC_BATTERY2_CURRENT_CHANNEL, ADC_BATTERY3_CURRENT_CHANNEL, ADC_BATTERY4_CURRENT_CHANNEL}
167 #  define BOARD_BRICK_VALID_LIST  {BOARD_ADC_BRICK1_VALID, BOARD_ADC_BRICK2_VALID, BOARD_ADC_BRICK3_VALID, BOARD_ADC_BRICK4_VALID}
168 #else
169 #  error Unsuported BOARD_NUMBER_BRICKS number.
170 #endif
171 
172 /* Choose the source for ADC_SCALED_V5_SENSE */
173 #if defined(ADC_5V_RAIL_SENSE)
174 #define ADC_SCALED_V5_SENSE ADC_5V_RAIL_SENSE
175 #else
176 #  if defined(ADC_SCALED_V5_CHANNEL)
177 #    define ADC_SCALED_V5_SENSE ADC_SCALED_V5_CHANNEL
178 #  endif
179 #endif

5. 总结

模块有对adc数据进行过滤但是命令行没有相应的输出显示,也没有将处理后的adc数据发送到系统中。可能这仅仅如代码中写的,是遗产吧。

platforms/common/include/px4_platform_common/board_common.h

136 /* Legacy default */

6. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4 modules_main
【7】PX4模块设计之二十四:内部ADC模块

我要设计一个智能光伏清洗机监测的数据可视化大屏页面
具体需求是: 1.全屏显示1920×1080 2.背景用视频或者图片作为监测画面 3.平米左上角显示标题副标题,主标题与副标题中间用分割线作区分。 4.屏幕右侧显示“地址区域”“年月日”头像分别用竖向分割线区分。 5.屏幕左侧标题下方显示“灰尘覆盖度”,“环境温度与湿度”“风级风速”“辐照度”分别用进度条来表示,进度条底色用浅色透明度50中间数据用正常颜色.鼠标经过每个进度条的时候要显示相应的数据弹层,弹层内的数据内容可以点击快速定位到相应的数据展示模块。弹层可关闭右上角的位置显示关闭icon。整体在白色背景内显示。 6.紧接着下方展示“运行状态”用白色背景作为整体展示区,运行状态用进度条的样式,进度条用不同颜色表示不同的数据及状态,比如:低电,报警,故障等状态。在不同颜色下有一个整体的颜色表示正常状态。整体感觉就像高德导航的路线那样。鼠标经过不同颜色是弹出弹层展示详情,详情可点击连接到具体的数据展示模块。色块与色块希望有个指引线,下方有个图标可以是白天,晚上,或者风的icon,我想表达的意思是这个时间段是白天还是晚上进行作业的,或者当时机器在作业时遇到了大风等情况状态。进度条最顶层要有一个图片标识,作为清洗机来表示运行状态。右上角显示全部机器机单台机器的下拉选项框。 7.在运行状态下紧接着展示“清洗机管理”白色背景展示区内部显示标题,右侧显示年月日下拉选项。下方显示在线数量,离线数量前面用蓝色点表示在线状态,灰色点表示离线状态。右侧分别显示数量。下面分别显示“单次清洗”“总清洗”“年清洗”右侧小括号浅色字体显示“公里”右侧分别显示各自的清洗数量。下面用进度进度条的形式显示清洗状态,进度条以浅色作为底色,最顶端用横线作为指引,不同高度表示不同清洗数据。 8.在清洗机管理右侧显示“清洗记录”“清洗动态”两个tab可切换。清洗记录用表格形式,清晰动态是进度跳的形式,进度条实用小长方形各自组成,最上方是一个长方形图片表示机器icon。进度条分成两层最下层是浅色的,上层是深度色并于机器icon同步,这样来显示机器的清晰动态走向。一共展示五个状态。如果遇到故障,低电等状态进度的最删除用浅红、黄色等颜色且描边的形式表示,同时有方形状态图标。当鼠标经过词状态的时候出现弹层,弹层用毛玻璃形式,上面有标题,标题蓝深色显示,毛玻璃区域显示具体内容。标题栏可关闭。 9.清洗记录右侧显示“发电效率”“收益信息”上下结构,各自展示。内容用圆形百分比不同色表示,右侧显示瓦数下面显示小标题。面板右侧显示年月日。 10.发电效率上面展示“发电功率”面板左侧显示实际发电功率图表圆形表的样式描边要细在每个具体刻度颜色要有深浅的区别。右侧显示“补贴电价”“装机容量”“逆变器数量”“并网电压”。 11.在发电功率上面显示清洗机的电池数据。剩余电量右侧是百分比下面是电量进度条。下方展示“电流”“温度”“湿度”等跟电池相关的状态。 用html+CSS JS动效的方式写出来
最新发布
07-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值