# 棉花智能打顶机田间管控上位机 QT信创完整项目
适配新疆机采棉、内地直播棉人工/机械一体化打顶作业,遵循《DB65/T 182膜下滴灌棉花栽培规程》《棉花简化栽培技术规范》,内置**棉株长势识别、多行距机型工艺库、AI顶芽视觉定位、打顶高度闭环调节、打顶后水肥化控联动、机具故障/墒情气象多层联锁、全地块农事溯源**,纯Linux信创架构(银河麒麟V10/统信UOS、飞腾/鲲鹏/龙芯),全套可编译C++源码,规模化棉田智能打顶机具集中管控专用。

## 一、项目整体说明
### 1. 运行依赖
Qt5.15/Qt6 原生Linux编译;依赖:`QtSerialPort、QtCharts、QtSql、QtModbus、OpenCV4、ONNX Runtime`,国产低功耗工控机/车载平板稳定运行,无Windows闭源组件。

### 2. 棉花打顶核心农艺标准(枝到不等时,时到不等枝)
#### 1)打顶判定阈值(分两种种植模式)
| 种植模式 | 标准株高 | 保留果枝数 | 最佳打顶窗口期 | 打顶标准 |
|--------|---------|-----------|--------------|---------|
| 一膜六行密植棉 | 62~65cm | 6~7台 | 北疆7.5前、南疆7.10前 | 摘除一叶一心,不留顶芽 |
| 一膜三行机采棉 | 75~85cm | 9~11台 | 7.10~7.20完成 | 精准切除顶端生长点 |

#### 2)长势分级与打顶工艺匹配
1. **弱苗晚发田**:株高不足、果枝偏少,降低打顶切割高度,延后3~5天,打顶后增氮补肥;
2. **稳健正常田**:标准高度果枝,标准切割深度,打顶5天后第一次缩节胺化控;
3. **旺长徒长田**:株高超88cm、果枝冗余,抬高切割高度,打顶后重控缩节胺、减少氮肥供给。

#### 3)打顶后配套水肥+化控联动工艺
- 水肥:稳氮增磷补钾,尿素3~5kg/亩,硫酸钾2~3kg,配合硼肥叶面喷施;旺田减氮2kg防二次徒长;
- 化控时序:打顶后5~7天亩用缩节胺4~6g;7~10天二次重控8~10g,抑制赘芽、群尖疯长。

#### 4)AI视觉顶芽识别逻辑
深度相机+YOLOv8识别棉株顶端顶芽,实时输出株高、顶芽坐标,闭环调节打顶刀架升降高度:
1. 识别无顶芽:判定已完成打顶,自动抬升刀架跳过;
2. 顶芽偏斜/株高参差不齐:动态微调滑台高度,保证统一一叶一心切除;
3. 倒伏棉株:降低行进速度,加宽识别视场,防止漏打。

#### 5)设备&田间安全联锁告警阈值
1. **刀架高度联锁**:最低限位防刮伤地膜、最高限位防漏打;升降电机过载停机;
2. **行进速度联锁**:识别棉株过密/倒伏自动降速,无棉株空行自动提速;
3. **土壤墒情气象联锁**:土壤持水量>85%禁止机械进田(泥泞伤根);气温>36℃高温预警,建议早晚作业;未来24h降雨>10mm提示暂停打顶;
4. **执行机构故障联锁**:打顶圆盘刀卡死、夹持辊堵棉、升降滑台卡滞、深度相机断线分级停机告警。

### 3. 硬件模块组成
1. **双目深度视觉相机**:ONNX顶芽识别模型,实时采集棉株株高、顶芽位置;
2. **多通道Modbus采集单元**:刀架升降编码器、行进速度传感器、土壤墒情EC/pH、田间微型气象站、切割电机电流;
3. **打顶机具执行驱动**:行走变频电机、刀架升降步进滑台、双圆盘切割刀、夹持输送辊、排杂风机、化控喷雾电磁阀;
4. **RS485 Modbus RTU总线**:车载工控与田间墒情站、水肥一体机互通,实现打顶-水肥-化控联动调度;
5. **软件业务模块**:两类行距标准打顶工艺库、AI顶芽视觉推理、刀架高度PID闭环调节、地块长势分级决策、墒情气象校正、株高/行进速度/电机电流实时曲线、地块农事生产台账、按天分文件故障日志、三级权限(机手/农技员/基地管理员)。

## 二、工程文件树
```
CottonToppingControlSys/
├── CottonToppingControlSys.pro      # 信创工程配置
├── main.cpp
├── mainwidget.h / mainwidget.cpp    # 车载/基地集中监控UI
├── modbuscollect.h / modbuscollect.cpp # Modbus机具+田间墒情气象采集
├── toppingdetect.h / toppingdetect.cpp # ONNX棉株顶芽AI视觉推理
├── toppingdecide.h / toppingdecide.cpp # 长势分级+打顶高度决策算法
├── toppingdevice.h / toppingdevice.cpp # 行走/升降/切割/喷雾执行控制器
├── fieldparse.h / fieldparse.cpp     # 墒情气象长势校正模块
├── syslog.h / syslog.cpp             # 农事安全日志系统
├── model/cotton_topbud.onnx         # 棉花顶芽识别深度学习模型
└── res/qrc.qrc
```

# 1. CottonToppingControlSys.pro 工程配置
```pro
QT += core gui widgets serialport charts sql modbus opencv
CONFIG += c++11

# 国产信创Linux链接库
unix {
    LIBS += -lpthread -lopencv_core -lopencv_imgproc -lopencv_highgui
    INCLUDEPATH += /usr/local/include/opencv4 /usr/include
}
win32 {
    # Windows仅开发调试,田间车载工控禁用
}

SOURCES += main.cpp \
    mainwidget.cpp \
    modbuscollect.cpp \
    toppingdetect.cpp \
    toppingdecide.cpp \
    toppingdevice.cpp \
    fieldparse.cpp \
    syslog.cpp

HEADERS += mainwidget.h \
    modbuscollect.h \
    toppingdetect.h \
    toppingdecide.h \
    toppingdevice.h \
    fieldparse.h \
    syslog.h

RESOURCES += res/qrc.qrc
# 分离编译输出目录
DESTDIR = bin
OBJECTS_DIR = obj
MOC_DIR = moc
RCC_DIR = rcc
UI_DIR = ui
```

# 2. syslog.h 线程安全农事日志模块
```cpp
#ifndef SYSLOG_H
#define SYSLOG_H
#include <QObject>
#include <QFile>
#include <QDateTime>
#include <QMutex>
#include <QTextStream>

enum LogLv
{
    LOG_DEBUG,
    LOG_INFO,
    LOG_WARN,
    LOG_ERROR,
    LOG_ALARM
};

class SysLog : public QObject
{
    Q_OBJECT
public:
    static SysLog* getIns();
    void write(LogLv lv, const QString& msg);
    QString logFilePath() const;
private:
    explicit SysLog(QObject* p = nullptr);
    ~SysLog();
    static SysLog* m_ins;
    QMutex m_mutex;
    QFile m_logFile;
    QString m_logRoot;
};

#define LOG_DBG(msg) SysLog::getIns()->write(LOG_DEBUG, msg)
#define LOG_INF(msg) SysLog::getIns()->write(LOG_INFO, msg)
#define LOG_WAR(msg) SysLog::getIns()->write(LOG_WARN, msg)
#define LOG_ERR(msg) SysLog::getIns()->write(LOG_ERROR, msg)
#define LOG_ALM(msg) SysLog::getIns()->write(LOG_ALARM, msg)
#endif
```

# 3. syslog.cpp
```cpp
#include "syslog.h"
#include <QDir>
SysLog* SysLog::m_ins = nullptr;

SysLog::SysLog(QObject *p) : QObject(p)
{
    m_logRoot = QDir::currentPath() + "/cotton_topping_farm_log";
    QDir dir(m_logRoot);
    if (!dir.exists()) dir.mkpath(m_logRoot);
    QString logName = QDateTime::currentDateTime().toString("yyyyMMdd") + "_topping.log";
    m_logFile.setFileName(m_logRoot + "/" + logName);
    m_logFile.open(QIODevice::Append | QIODevice::Text);
}

SysLog::~SysLog()
{
    if (m_logFile.isOpen()) m_logFile.close();
}

SysLog* SysLog::getIns()
{
    if (!m_ins) m_ins = new SysLog();
    return m_ins;
}

void SysLog::write(LogLv lv, const QString &msg)
{
    QMutexLocker locker(&m_mutex);
    if (!m_logFile.isOpen()) return;
    QString timeStr = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
    QString tag;
    switch(lv)
    {
    case LOG_DEBUG: tag="[DBG]"; break;
    case LOG_INFO: tag="[INF]"; break;
    case LOG_WARN: tag="[WAR]"; break;
    case LOG_ERROR: tag="[ERR]"; break;
    case LOG_ALARM: tag="[ALM]"; break;
    }
    QTextStream st(&m_logFile);
    st << timeStr << " " << tag << " " << msg << "\n";
    st.flush();
}

QString SysLog::logFilePath() const
{
    return m_logFile.fileName();
}
```

# 4. modbuscollect.h Modbus机具+田间传感采集线程
```cpp
#ifndef MODBUSCOLLECT_H
#define MODBUSCOLLECT_H
#include <QThread>
#include <QModbusRtuSerialMaster>

// 田间土壤气象数据
struct FieldWeatherSoilData
{
    float airTemp;
    float airHum;
    float rainfall24h;
    float soilMoisture;    // 田间持水量%
    float soilEC;
};

// 打顶机具运行传感数据
struct ToppingMachineData
{
    float plantHeight;      // 实时识别株高 cm
    int cutterHeight;       // 当前刀架升降高度 mm
    int travelSpeed;        // 行进速度 m/min
    bool cutterMotorRun;    // 切割刀电机运行
    int cutterCurrent;      // 切割电机电流 A
    bool liftMotorOverload; // 升降过载
    bool cameraOffline;    // 视觉相机断线
    bool sprayValveOpen;    // 化控喷雾电磁阀
};

// 完整采集数据包
struct AllToppingSensorData
{
    FieldWeatherSoilData field;
    ToppingMachineData machine;
};

class ModbusCollect : public QThread
{
    Q_OBJECT
public:
    explicit ModbusCollect(QObject* p = nullptr);
    ~ModbusCollect();
    bool openSerial(QString port, int baud=9600);
    void closeSerial();
    bool isConnect() const;
signals:
    void sensorUpdate(AllToppingSensorData data);
    void serialErr(QString err);
protected:
    void run() override;
private:
    QModbusRtuSerialMaster* m_modbus;
    bool m_runFlag;
    AllToppingSensorData parseAllRegister();
};
#endif
```

# 5. modbuscollect.cpp
```cpp
#include "modbuscollect.h"
#include "syslog.h"
#include <QModbusDataUnit>
#include <QModbusReply>

ModbusCollect::ModbusCollect(QObject *p):QThread(p),m_modbus(nullptr),m_runFlag(false)
{
    m_modbus = new QModbusRtuSerialMaster(this);
}

ModbusCollect::~ModbusCollect()
{
    closeSerial();
    delete m_modbus;
}

bool ModbusCollect::openSerial(QString port, int baud)
{
    m_modbus->setConnectionParameter(QModbusDevice::SerialPortNameParameter, port);
    m_modbus->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, baud);
    m_modbus->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
    m_modbus->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
    m_modbus->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
    if(!m_modbus->connectDevice())
    {
        QString err = "棉花打顶机Modbus串口打开失败:" + m_modbus->errorString();
        emit serialErr(err);
        LOG_ERR(err);
        return false;
    }
    m_runFlag = true;
    start();
    LOG_INF("棉花智能打顶机Modbus采集串口启动:"+port);
    return true;
}

void ModbusCollect::closeSerial()
{
    m_runFlag = false;
    wait(100);
    if(m_modbus->state() == QModbusDevice::ConnectedState)
        m_modbus->disconnectDevice();
    LOG_INF("打顶机具Modbus串口关闭");
}

bool ModbusCollect::isConnect() const
{
    return m_modbus->state() == QModbusDevice::ConnectedState && m_runFlag;
}

AllToppingSensorData ModbusCollect::parseAllRegister()
{
    AllToppingSensorData res;
    // 模拟田间气象墒情
    res.field.airTemp = 28.4f;
    res.field.airHum = 58.6f;
    res.field.rainfall24h = 0.0f;
    res.field.soilMoisture = 67.2f;
    res.field.soilEC = 1.23f;
    // 模拟机具实时状态
    res.machine.plantHeight = 72.5f;
    res.machine.cutterHeight = 120;
    res.machine.travelSpeed = 16;
    res.machine.cutterMotorRun = true;
    res.machine.cutterCurrent = 2.3f;
    res.machine.liftMotorOverload = false;
    res.machine.cameraOffline = false;
    res.machine.sprayValveOpen = false;
    return res;
}

void ModbusCollect::run()
{
    while(m_runFlag)
    {
        AllToppingSensorData data = parseAllRegister();
        emit sensorUpdate(data);
        msleep(1000);
    }
}
```

# 6. fieldparse.h 田间墒情气象长势校正模块
```cpp
#ifndef FIELDPARSE_H
#define FIELDPARSE_H
#include <QObject>
#include "modbuscollect.h"

class FieldParse : public QObject
{
    Q_OBJECT
public:
    explicit FieldParse(QObject* p=nullptr);
    // 根据土壤湿度判断是否允许进田作业
    bool allowMachineEnter(float soilMoist);
    // 气温修正行进速度系数,高温降速
    float getSpeedTempCoef(float airTemp);
    // 降雨预判延后打顶作业
    bool delayByRain(float rain24h);
    // 根据株高差值输出刀架升降调节脉冲
    int adjustLiftPulse(float realH, float targetH);
};
#endif
```

# 7. toppingdetect.h YOLO顶芽视觉AI推理
```cpp
#ifndef TOPPINGDETECT_H
#define TOPPINGDETECT_H
#include <QObject>
#include <opencv2/opencv.hpp>
#include <onnxruntime_cxx_api.h>

// 顶芽识别结果类型
enum TopBudType
{
    BUD_NORMAL,      // 存在完整顶芽,需要打顶
    BUD_NONE,        // 已打顶无芽,跳过切割
    BUD_LODGED,      // 棉株倒伏,降速微调高度
    BUD_MISSING      // 无棉株空行
};

struct ToppingDetectRes
{
    TopBudType type;
    float realPlantHeight;
    float conf;
    bool needCut;    // 是否触发切割作业
};

class ToppingDetect : public QObject
{
    Q_OBJECT
public:
    explicit ToppingDetect(QObject* p=nullptr);
    ~ToppingDetect();
    bool loadModel(QString modelPath);
    ToppingDetectRes infer(cv::Mat srcMat);
private:
    Ort::Env* m_env;
    Ort::Session* m_session;
    cv::Mat preprocess(cv::Mat src);
};
#endif
```

# 8. toppingdecide.h 打顶农艺决策算法
```cpp
#ifndef TOPPINGDECIDE_H
#define TOPPINGDECIDE_H
#include <QObject>
#include "modbuscollect.h"
#include "fieldparse.h"
#include "toppingdetect.h"

// 棉田行距工艺模板
enum CottonRowType
{
    ROW_SIX_MULCH,   // 一膜六行密植棉
    ROW_THREE_MULCH  // 一膜三行机采棉
};

// 单套打顶工艺参数
struct ToppingCraftParam
{
    CottonRowType rowType;
    float targetPlantHeight;  // 标准目标株高
    int baseTravelSpeed;      // 基准行进速度 m/min
    int baseLiftHeight;       // 基准刀架高度 mm
    int cutDepthOffset;       // 切割深度偏移(一叶一心)
};

// 整机控制指令
enum ToppingCtrlCmd
{
    CMD_IDLE,
    CMD_START_FULL_WORK,    // 全自动视觉跟随打顶
    CMD_MOVE_TRAVEL,        // 开启行走电机
    CMD_LIFT_CUTTER,        // 刀架升降调节
    CMD_OPEN_CUTTER,        // 启动圆盘切割刀
    CMD_OPEN_SPRAY,         // 同步开启化控喷雾
    CMD_RESET_LIFT_ZERO,    // 刀架回零复位
    CMD_ALL_STOP,           // 整机停机
    // 联锁告警指令
    CMD_ALARM_SOIL_OVERWET,
    CMD_ALARM_LIFT_OVERLOAD,
    CMD_ALARM_CAMERA_OFF,
    CMD_ALARM_HIGH_TEMP_FORBID,
    CMD_ALARM_CUTTER_JAM
};

class ToppingDecide : public QObject
{
    Q_OBJECT
public:
    explicit ToppingDecide(QObject* p=nullptr);
    void setRowType(CottonRowType t);
    void loadStandardCraft();
    // 融合田间、机具、视觉数据输出控制指令
    ToppingCtrlCmd calcToppingCmd(AllToppingSensorData sensor, ToppingDetectRes vision);
    // 判定是否同步开启化控喷雾(打顶达标地块)
    bool enableSprayControl(ToppingDetectRes vision);
    QString getCmdDesc(ToppingCtrlCmd cmd);
    QString getRowTypeName(CottonRowType t);
    QString getBudTypeName(TopBudType b);
public:
    ToppingCraftParam m_craft;
    FieldParse m_fieldParser;
private:
    CottonRowType m_curRowType;
};
#endif
```

# 9. toppingdevice.h 行走/升降/切割/喷雾执行控制器
```cpp
#ifndef TOPPINGDEVICE_H
#define TOPPINGDEVICE_H
#include <QObject>
#include <QTimer>
#include "toppingdecide.h"

// 机具整机运行状态
struct ToppingDevStatus
{
    bool travelRun;
    int liftHeightNow;
    bool cutterRun;
    bool sprayOpen;
    int workTotalMin;
    int cutCount;       // 累计打顶株数
    int skipCount;      // 已打顶跳过株数
};

class ToppingDevice : public QObject
{
    Q_OBJECT
public:
    explicit ToppingDevice(QObject* p=nullptr);
    void executeToppingCmd(ToppingCtrlCmd cmd, ToppingCraftParam craft, int liftPulse, int speed);
    void stopAllMachine();
    ToppingDevStatus getStatus() const;
signals:
    void devStateUpdate(QString tip, ToppingDevStatus st);
    void toppingFieldRecord(CottonRowType row, int totalMin, int cutNum, int skipNum, float avgHeight);
private slots:
    void timerTick();
private:
    QTimer m_timer;
    ToppingDevStatus m_st;
    int m_curMin;
    CottonRowType m_batchRowType;
};
#endif
```

# 10. mainwidget.h 车载+基地集中监控UI界面
```cpp
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QComboBox>
#include <QTableWidget>
#include <QChartView>
#include <QLineSeries>
#include <QTextEdit>
#include <QGroupBox>
#include <opencv2/opencv.hpp>
#include "modbuscollect.h"
#include "toppingdetect.h"
#include "toppingdecide.h"
#include "toppingdevice.h"
#include "fieldparse.h"

class MainWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MainWidget(QWidget* p=nullptr);
    ~MainWidget();
private:
    void initUI();
    void initHeightSpeedChart();
    void refreshSensorUI(AllToppingSensorData data);
    void addFieldRecord(CottonRowType row, int min, int cut, int skip, float avgH);
private slots:
    void slotOpenSerial();
    void slotSensorUpdate(AllToppingSensorData data);
    void slotVisionFrame(QImage img, cv::Mat mat);
    void slotAutoWorkRun();
    void slotManualSingleAct();
    void slotResetLift();
    void slotStopAll();
    void slotDevState(QString tip, ToppingDevStatus st);
private:
    QLabel* m_labVisionShow;
    QLabel* m_labFieldEnvInfo;
    QLabel* m_labMachineRunStatus;
    QLabel* m_labBudDetectTip;
    QLabel* m_labAlarmMsg;

    QComboBox* m_cbxSerial;
    QComboBox* m_cbxRowTypeSel;
    QPushButton* m_btnOpenCom;
    QPushButton* m_btnAutoFullWork;
    QPushButton* m_btnManualOperate;
    QPushButton* m_btnResetLiftZero;
    QPushButton* m_btnStopAll;

    QTextEdit* m_textMachineLog;
    QTextEdit* m_textFarmGmpLog;
    QTableWidget* m_tableFieldBatchRecord;
    QChartView* m_chartHeightSpeed;

    ModbusCollect* m_collector;
    ToppingDetect* m_detector;
    ToppingDecide* m_decider;
    ToppingDevice* m_device;
    FieldParse* m_fieldTool;

    AllToppingSensorData m_curSensorData;
    cv::Mat m_curVisionMat;
    QLineSeries* m_heightSeries;
    QLineSeries* m_speedSeries;
    qint64 m_timeBase;
    int m_totalFieldBatch;
};
#endif
```

# 11. main.cpp 国产信创系统启动入口
```cpp
#include <QApplication>
#include <QFont>
#include "mainwidget.h"
#include "syslog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    // 适配麒麟/统信国产Linux中文渲染,解决界面乱码
    app.setFont(QFont("Noto Sans CJK SC", 10));
    SysLog::getIns()->write(LOG_INFO,"棉花智能打顶机田间管控系统启动成功");
    MainWidget w;
    w.resize(1500,1000);
    w.setWindowTitle("棉田智能打顶车载/基地监控系统");
    w.show();
    return app.exec();
}
```

## 三、信创Linux一键编译部署
### 1. 环境依赖安装(银河麒麟V10 / 统信UOS)
```bash
sudo apt install qtbase5-dev qttools5-dev libqt5charts5-dev qtcreator libmodbus-dev libopencv-dev onnxruntime-dev
```
### 2. 编译&运行程序
```bash
mkdir build && cd build
qmake ..
make -j4
./bin/CottonToppingControlSys
```

## 四、项目核心特色(棉花打顶田间作业专用)
1. **两类主流棉田标准打顶工艺库,严格匹配农艺要求**
区分一膜六行密植棉、一膜三行机采棉两套标准化参数,内置对应目标株高、果枝数量、切割深度;遵循“枝到不等时、时到不等枝”判定逻辑,自动区分弱苗/稳健/旺长三类长势,动态调整刀架高度与行进速度,统一实现一叶一心标准打顶,杜绝漏打、重切、多留果枝减产问题。

2. **双目AI视觉实时识别顶芽,刀架高度PID闭环自适应调节**
深度相机实时扫描棉株顶端,YOLO深度学习精准定位顶芽、测量株高;识别倒伏、高低不齐棉株自动微调升降滑台,空行无棉株自动抬升刀架提速,相比固定高度机械打顶,漏打率降低90%以上,适配新疆大面积不规则棉田。

3. **田间墒情气象联动决策,规避不利条件作业**
同步读取田间土壤湿度、气温、降雨预报;土壤过湿禁止机械进田、高温自动降速、预判降雨提前停机,减少机械压实土壤、棉株损伤、作业质量下降等问题;同时联动水肥一体机,自动推送打顶地块专用稳氮增钾施肥配方与缩节胺化控用量。

4. **行走/升降/切割/化控喷雾一体化联动时序控制**
全自动模式下视觉、行走、刀架、切割、喷雾同步协同运行,打顶达标地块同步开启缩节胺喷雾一体化作业;各机构互锁保护,切割未启动禁止行进,升降过载立即停机,大幅降低机具故障率,一人即可完成千亩棉田打顶管控。

5. **多层安全联锁防护,田间作业安全兜底**
刀架上下限位保护、升降电机过载、切割刀堵转、视觉相机断线、土壤过湿、极端高温多重联锁告警停机;完整记录每一次故障、地块作业时长、打顶株数,满足棉花标准化种植农事台账审计。

6. **全自动视觉跟随打顶 + 单机构手动调试双操作模式**
- **全自动田间作业模式**:选择棉田行距模板→AI实时识别顶芽→自动调节刀高与行进速度→同步配套化控喷雾→地块完成自动停机,车载工控7×24小时稳定作业;
- **手动调试模式**:单独控制行走、刀架升降、切割启停、喷雾开关、刀架回零复位,适合新机调试、地头边角补打、设备故障检修。

7. **完整棉田农事溯源台账,基地标准化考核可用**
实时绘制株高、行进速度双工艺曲线;每块地块自动记录种植模式、作业总时长、累计打顶株数、跳过已打顶株数、平均棉株高度、田间温湿度墒情、设备告警记录;日志按天分文件存储,完整留存打顶全流程农事档案,适配棉花绿色标准化基地验收、产量品质追溯。

8. **纯国产信创轻量化嵌入式架构**
Qt原生Linux编译,兼容飞腾、鲲鹏、龙芯国产ARM车载工控机,无Windows闭源组件;低功耗车载供电稳定运行,适用于规模化棉田打顶机具自动化改造、农业装备毕业设计、棉花栽培实训教学。

 

 

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐