×

Buggy QXA3场地守护者开源分享

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-07-13

成尔秩

分享资料个

描述

田野守护者又名 - Buggy QXA3

背景

面对海平面上升和全球变暖的威胁,以及人口的稳步增长,农民甚至家庭必须保持农业产量以保证稳定的产品交付。由于野火和飓风等自然灾害带来的杀虫剂、杂草和空气毒性,这一直具有挑战性。虽然商业农场可能有能力消除大部分危害并扩大规模以应对中断的全球供应链,但小型工业化农场主发挥着至关重要的作用,但他们一直无法做到这一点。得益于低成本硬件和加速人工智能技术,工业物联网和机器人技术将成为彻底改变农业需求的工具。

灵感

pYYBAGSBNMqAEgzZAACTN1ypJo8466.png
QXA3 设计概述
 

Hovergame 生态系统将允许早期的人类互动来绘制兴趣点、有害昆虫、不需要的杀虫剂、杂草,以及早期发现田间发生故障的设备。在无人机上进行人工监督的早期监视和监测将使我们能够由包括农业研究人员、工程师和科学家在内的专家进一步进行分析,以提高作物生长的性能并满足生产需求。由于缺乏遥测和传感器数据,现场的工业人员一直面临着不断解决此类问题的挑战。如果不全神贯注,产量监测也被证明是困难的。

车辆组装(加上一些早期的问题)

[幸运的是,货物到达并收集了所有重要部件以组装 RC 控制试驾!得益于指导性MR-BUGGY3 构建指南(NXP CUP 的一部分),节省了许多时间

 
poYBAGSBNM2AHKhWAAEFyoGy9Uw166.png
户外测试旋转(因为测试 PX4 版本需要预臂 GPS 锁定)
 

主要障碍(你必须在进入机器人开发和 NAVQ+ 集成之前解决问题

硬件磨合:a) 远程控制/遥测 - 由于无线电控制器配置问题,寻求稳定的 PX4 版本用于 Rover 机身。throttle not zero解决了PX4 version: v1.13.2-28-ga5ccd145aa带有 ESC 的额外 PWM 微调。该版本还允许为流动站禁用 GPS 锁定以进行飞行测试。通过调整和映射到上限上限,油门在适当的转向和转向角度下适当地降低动力。

nsh> pwm test -d /dev/pwm_output0 -c 4 -p 
pYYBAGSBNM-AFU7kAAAwQyw09_0190.png
FMUK-66 手动飞行舵机微调(载具武装前显示值)
 

b) HW revC 6 针 PWM 上的 ESC 配置。c) 元器件洗牌、接线整理、配电板固定。

poYBAGSBNNGAO3bVAAEFe2XmaF8337.png
确保威廉希尔官方网站 板已固定以连接 1500mAh 电池、FMU 电源、NAVQ+
 

Software Grind : a)nxp_fmuk66-v3在 Mac M1 上使用 PX4-Autopilot 克服构建/编译/Flash(请参阅要点了解 python3 版本和 conda 要求)

pYYBAGSBNNWAGWdmAAHXAcPpg0s880.png
基于 M1 (Rosetta) 构建的 PX4 固件
 

b) 使用 UART/TELEM2 在 NavQ+ 和飞行控制器之间建立串行通信(设备树分配给/dev/ttymxc2上的 SPI ,使用/dev/ttyUSB0的解决方法) c) NavQ+ 上用于构建eIQ工具的 ubuntu 稳定版本的 UUU 闪存和MAVSDK

技术开发

BME688 固件和传感器 uORB 主题

需要进行一些调整来包装与 Bosch C++ API 通信的 PX4 驱动程序(I2C/SPI HAL 不可知代码)。固件端口的详细信息可以在本教程和Github页面上找到。

uint64 timestamp          # time since system start (microseconds)
uint64 timestamp_sample

uint32 device_id          # unique device ID for the sensor that does not change between power cycles

uint32 sample_count       # bme688 sample counts
float32 temperature       # temperature in degrees Celsius
float32 pressure          # static pressure measurement in Pascals
float32 humidity          # Humidity in percentage (%)
float32 gas_resistance    # gas resistance (ohm)
uint8 device_status       # byte hex 0xB0

uint32 error_count

uint8 ORB_QUEUE_LENGTH = 4

Use of I2C scan (default address: 0x77 on adafruit BME688 breakout)

nsh> i2cdetect -b 1
Scanning I2C bus: 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- 77 -- -- -- -- -- -- -- --

nsh> bme688 start -X -f 200000
NFO  [SPI_I2C] adding a running instance -set started to true
bme688 #0 on I2C bus 1 address 0x77
nsh> bme688 status
INFO  [SPI_I2C] Running on I2C Bus 1, Address 0x77
bme688: sample: 108 events, 115304us elapsed, 1067.63us avg, min 884us max 1411us 93.582us rms
bme688: measure: 109 events, 16119470us elapsed, 147885.05us avg, min 147140us max 148614us 266.258us rms
bme688: comms errors: 0 events
传感器 uORB 主题对 PX4 系统是透明的,并且可以由农作物监控应用程序订阅,如下所示(下面使用测试listener
nsh> uorb status
TOPIC NAME                     INST #SUB #Q SIZE PATH
sensor_gas                        0    0  4   48 /obj/sensor_gas0
nsh> listener sensor_gas

TOPIC: sensor_gas
 sensor_gas
    timestamp: 185075367 (0.630325 seconds ago)
    timestamp_sample: 185074305 (1062 us before timestamp)
    device_id: 12744457 (Type: 0xC2, I2C:1 (0x77))
    sample_count: 1
    temperature: 23.7633
    pressure: 101306.1875
    humidity: 59.5401
    gas_resistance: 35814.2148
    error_count: 0
    device_status: 176

By将 app 命令添加到PX4 src/boards/nxp/fmuk66-v3/init/rc.board_sensors,气体传感器驱动程序将在设备启动时启动 I2C 状态机,在测量收集状态之间切换发布sensor_gas主题 @ 2 Hz(每 500 毫秒)

# auto start BME688 gas sensor on external i2c bus 1 @200k
bme688 start -X -b 1 -f 200000
pYYBAGSBNNmAAYClAAENOwpdVLg939.png
I2C 总线上的 BME688 传感器数据
 
static constexpr uint32_t   _measure_interval{250 * 1000};  // every 0.5 sec
pYYBAGSBNNuAA6_GAABFPK_KBWI505.png
sensor_gas uORB 采样和发布 @ 2Hz
 

数据采样是在强制(而不是并行模式)下完成的,因为我们以高数据速率发布推理决策(不需要长时间的热分析)以获取温度、湿度、气压和气体指标。

Edge ML - 使用 Bosch AI Studio

这个简短实验的目标是收集传感器数据并提供可部署到 IoT Edge 的基本分类模型,在我们的例子中是一个相当占用的 FMUK-66。Bosch BME688 开发套件(x8 传感器)用于收集具有各种传感配置文件的一些植物的温度、压力、湿度和气体成分,以最大限度地减少数据差异并避免 Bosch AI studio 中的 BSEC 训练出现异常。收集阶段耗时数小时,并在控制环境下进行了两次(相隔约 1.5 周),一次是在这些植物处于最健康状态时,一次是在其易碎、腐烂的状态(叶子呈褐色,活力较差,和干腐烂的根

pYYBAGSBNN6ACc1oAAF4xoz1L6k419.png
新鲜空气、腐烂空气和健康空气各收集 1.5 小时的传感器数据。
 

在数据收集之前,威廉希尔官方网站 板传感器已经稳定(准备 24 小时)。加热器配置文件是使用 8 传感器评估套件(ESP32 Teensy 模块)创建的。虽然尚不清楚额外的气体成分(如 CO、NO2、乙醇、气体混合物)是否是植物样本健康恶化的任何因素,但该模型能够得出一些可靠的结果,而不是严重过度拟合(门控通过工作室训练的混淆矩阵)通过暗示温度、湿度等其他因素。

poYBAGSBNOGAIz39AACT38JBnk8895.png
导入收集的传感器数据。设置算法以在 3 个标记类之间进行分类
 

训练方法:批量大小为32 的ADAM 1024轮,70%/30%数据拆分

除了 AI studio 生成的 BSEC 配置头文件和 .config 二进制文件,我们还需要导入其 cortex-M4(FMUK-66 架构)以包含在bsec.h分类任务中。预测结果作为 uORB crop_health 主题的一部分发布,该主题由在 PX4 上开发的作物监测 C++ 应用程序推断

pYYBAGSBNOOADd19AABHxLfyOu4785.png
ML模型的混淆矩阵
 

珊瑚相机支架NAVQ+ 集成

poYBAGSBNOeAahaRAAFdrtuqejU128.png
将 FMUK66 拖到后方,以便为 Coral 相机和 NavQ+ 运行
 

pixy2 pan tilt 套件被修改为连接珊瑚短壳并尝试让云台控制相机(物理安装但未使用,考虑到飞行控制上的 CPU 负载很重 ~91%)设法在底部钻了几个洞NavQ+ 机箱,同时为配套计算机腾出空间。USB 集线器安装在第一个 PCB 的顶部,它允许 NavQ+ 与 /dev/ttyUSB0 上的 FMUK66 通信以获取 MAVLink 消息。

poYBAGSBNOmAcJ8DAAJQMLbxys0399.png
接近完整的系统图示
 
 

作物健康监测

uORB sensor_gas主题必须由机载农作物监控应用程序定期使用,该应用程序在通过 MAVLink 发送它们之前计算分类结果和指标。

uint64 timestamp      # time since system start (microseconds)

char[20] crop_type    # type of crops

float32 temperature       # temperature in degrees Celsius
float32 pressure          # static pressure measurement in Pascals
float32 humidity          # Humidity in percentage (%)
float32 gas_resistance    # gas resistance (ohm)

float32 health_index      # general health index
uint8 pred_longevity    # model prediction

1) 添加rcS文件以允许 Edge ML 订阅、解释、监控农作物健康状况。crops_monitor

2) 添加 MAVLink stream 命令以启用包流以周期性速率到地面站和 NavQ+ 的串行/遥测(这两个文件都在ROMFS/px4fmu_common/init.d-posix 下)px4-rc.mavlink

# custom CROPS_MONITOR startup stream for mavlink
mavlink stream -r 2 -s CROPS_MONITOR -d /dev/ttyS1

crops_monitor.cpp

PX4_INFO("Crops monitor evaluate identified plant health using BME688 gas sensor metrics");

// subscribe to sensor_gas topic
int sensor_gas_fd = orb_subscribe(ORB_ID(sensor_gas));
// limit the update rate to 50 Hz
orb_set_interval(sensor_gas_fd, 20);

struct crops_health_s ch{};
orb_advert_t ch_pub = orb_advertise(ORB_ID(crops_health), &ch);

px4_pollfd_struct_t fds[] = {
    { .fd = sensor_gas_fd,   .events = POLLIN },
};

3) health_index作为植物健康的一般指标,由湿度、压力和温度的比例值组成。pred_longevity是上述 BSEC 分类模型使用来自 BME688 的实时样本的推理结果。


<mavlink>
    <include>development.xmlinclude>
    
    <dialect>1dialect>
    <messages>
        <message id="437" name="CROPS_HEALTH">
            <description>Mavlink Crop Health Metrics sampled and reported by flight controller FMUK66description>
            <field type="uint64_t" name="timestamp">time since system start (microseconds)field>
            <field type="char[20]" name="crop_type">crop typefield>
            <field type="float" name="temperature">temperaturefield>
            <field type="float" name="pressure">pressurefield>
            <field type="float" name="humidity">humidityfield>
            <field type="float" name="gas_resistance">gas resistancefield>
            <field type="float" name="health_index">health indexfield>
            <field type="uint8_t" name="pred_longevity">pred longevityfield>
        message>
    messages>
mavlink>

可以通过流式传输使用 QGC 上的视觉指示器来应用现场条件和标签。远程车辆接近数据样本和目视检查,因为它们被附近的标签识别。颜色编码的指标表示每种植物的健康状况,如下所示:(来自 QGC 直播的照片)

poYBAGSBNOyADA_nAAEe86aCwWg846.png
Crops Monitor App 通过 MAVLink 提供传感器指标和推理结果
 
crops_monitor [1360:100]
nsh> INFO  [crops_monitor] Crops monitor evaluate identified plant health using BME688 gas sensor metrics
INFO  [crops_monitor] Sensor Gas:     25.2710     46.7412    102259.9063
INFO  [crops_monitor] Sensor Gas:     25.2710     46.7476    102259.9063
INFO  [crops_monitor] Sensor Gas:     25.2760     46.7610    102263.6484
INFO  [crops_monitor] Sensor Gas:     25.2710     46.7603    102259.9063

1) 添加rcS文件以允许 Edge ML 订阅、解释、监控农作物健康状况。2) 添加 MAVLink stream 命令以启用包流以周期性速率到地面站和 NavQ+ 的串行/遥测(这两个文件都在ROMFS/px4fmu_common/init.d-posix 下)crops_monitorpx4-rc.mavlink

# custom CROPS_MONITOR startup stream for mavlink
mavlink stream -r 2 -s CROPS_MONITOR -d /dev/ttyS1
pYYBAGSBNPCAZusQAAEys4VwhAs491.png
 

项目事后分析

1. ROS2 集成:一个全面的发展战略,以实现哪种方法非常适合我们的家庭和商业农业用例。考虑到完成时间,硬件测试会有所限制。

2.使用 UCANS32K 板扩展 BME688 的环境感测(如 NXP Cup Demo 中采用的那样):虽然使用 FMUK-66 的机载感测在此处运行良好,但我们显着限制了传感器与被监控植物之间的探测和测量距离。一旦总线延伸超过几米,板载 I2C/SPI 噪声几乎呈指数增长。带有 CAN FD 的 UAVCAN 桥将有助于准确地进行机械探测,但会牺牲更多的外围设备。

3.对 YOLO3/MobileNet V3 的训练不足:只有导入 eIQ 用于 NavQ+ 视觉识别的模型是移动网络singleShotDetector ,它在大规模真实世界物体方面表现出色,但在没有进一步训练和监督的情况下无法识别物体类别。训练有素的转换网络可能足以满足我们的用例。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Buggy QXA3场地守护者开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);