Skip to content

ISOXML task definition generation and real-time TLG (Time Log Generation) binary logging

License

Notifications You must be signed in to change notification settings

onlyhead/taskmap

Repository files navigation

TaskMap - ISOXML Generation and TLG Logging Library

A comprehensive C++ library for agricultural data interchange following ISO 11783 standards. TaskMap provides both ISOXML task definition generation and real-time TLG (Time Log Generation) binary logging capabilities.

Features

ISOXML Generation (taskmap/generate.hpp)

  • Complete ISOXML package generation with TASKDATA.XML and binary prescription files
  • Real farmtrax integration for automatic AB line and swath generation (not hardcoded coordinates)
    • Machine width-based swath calculation - specify implement width for accurate swath patterns
    • Automatic guidance pattern generation with configurable headland passes
    • Field angle optimization for maximum efficiency based on field geometry
  • Zoneout library integration for field boundaries and variable rate prescription grids
  • Multiple grid layer support for complex variable rate applications
  • ISO 11783 compliant XML structure with farms, partfields, guidance patterns, tasks, and treatment zones

ISOXML Object Model (taskmap/isoxml_model.hpp)

  • Lightweight C++ object model for core ISOXML elements (Farm, Partfield, Task)
  • Load/Save functionality for TASKDATA.XML files using rapidxml
  • Comprehensive validation system with error reporting and cross-reference checking
  • ID management and validation for all ISOXML element references
  • Extensible architecture for adding additional ISOXML element types

TLG Binary Logging (taskmap/logging.hpp)

  • ISO 11783-10 compliant TLG binary format for real-time field operation data
  • Position logging with WGS-84 coordinates and GPS status tracking
  • Process data logging with DDI (Data Dictionary Identifier) support
  • Multiple concurrent logging sessions for different operations
  • Proper binary record structure with packed structs for correct file format

Unified Interface (taskmap/taskmap.hpp)

  • Combined workflows supporting both generation and logging
  • Backward compatibility with legacy API maintained
  • TaskMap and Taskmap classes for different use cases

Architecture

taskmap/
├── common/           # Shared utilities
│   ├── xml_utils.hpp # XML generation and coordinate conversion
│   └── bin_utils.hpp # Binary file writing utilities
├── generate.hpp      # ISOXML generation module
├── isoxml_model.hpp  # ISOXML object model with load/save
├── logging.hpp       # TLG binary logging module  
└── taskmap.hpp       # Unified interface

Quick Start

Tutorial (Recommended)

Run the step-by-step tutorial to learn both the Generator and Object Model:

make config && make build
./build/tutorial

This tutorial covers:

  1. Creating field boundaries and zones
  2. Generating complete ISOXML packages with guidance patterns
  3. Working with the ISOXML object model directly
  4. Validation, save/load operations

ISOXML Generation with Machine Width

#include "taskmap/generate.hpp"

// Create zone with boundary and prescription data
zoneout::Zone zone("Field1", "agricultural", boundary, datum, 10.0);

// Generate complete ISOXML package with precise swath calculation
taskmap::ISOXMLGenerator generator;
generator.generate_from_zone(zone, "VRT Fertilization");

// Add guidance patterns with machine-specific parameters
double machine_width = 18.0;    // 18-meter sprayer width
double field_angle = 0.0;       // Auto-calculated or custom angle
int headland_passes = 2;        // Number of headland passes
generator.add_guidance_patterns(zone, machine_width, field_angle, headland_passes);

generator.write_taskdata_package("./output");

// Automatically includes:
// - Field boundary from zoneout polygon data
// - Machine width-based AB lines and swaths from farmtrax library
// - Treatment zones for each grid layer
// - Binary prescription files

ISOXML Object Model Usage

#include "taskmap/isoxml_model.hpp"

// Create new ISOXML document
taskmap::ISOXMLDocument doc;
doc.set_management_software("My FMIS", "2.0");

// Create farm structure
auto farm = std::make_shared<taskmap::Farm>("FRM1", "Demo Farm");
farm->city = "Farmville";
farm->country = "USA";

auto partfield = std::make_shared<taskmap::Partfield>("PFD1", "North Field", "FRM1");
partfield->area = "25.5"; // hectares

auto task = std::make_shared<taskmap::Task>("TSK1", "Spring Fertilization");
task->farm_id_ref = "FRM1";
task->partfield_id_ref = "PFD1";

// Add to document with automatic ID validation
doc.add_element(farm);
doc.add_element(partfield);
doc.add_element(task);

// Save to file
doc.save("./output/taskdata.xml");

// Load existing file
taskmap::ISOXMLDocument loaded_doc;
loaded_doc.load("./output/taskdata.xml");

// Validate structure
auto validation_messages = loaded_doc.validate();
for (const auto& msg : validation_messages) {
    std::cout << msg.to_string() << std::endl;
}

TLG Real-Time Logging

#include "taskmap/logging.hpp"

// Start field operation logging
taskmap::TaskLogger logger("./output/TLG");
auto* log = logger.start_logging_session("001");

// Log position and process data (WGS-84 coordinates)
logger.update_position(5654321.0, 654321.0, 2); // WGS-84 coords, DGPS quality
logger.log_process_data(taskmap::DDI::APPLICATION_RATE, 280.0);
logger.log_process_data(taskmap::DDI::MACHINE_SPEED, 14000); // mm/s

// Close session - generates TIM0001.TLG file
logger.close_session("001");

Combined Workflow

#include "taskmap/taskmap.hpp"

// Plan task and start execution
taskmap::TaskMap taskmap("./output");
auto* log = taskmap.plan_and_execute_task(zone, "Field Operation", "001");

// Execute field operation
taskmap.log_position(utm_north, utm_east, gps_status);
taskmap.log_process_data(taskmap::DDI::APPLICATION_RATE, rate);

// Finish operation
taskmap.finish_field_operation("001");

Building

Requirements

  • C++17 compiler
  • CMake 3.10+
  • Dependencies: zoneout, farmtrax, concord, rapidxml, doctest

Build Commands

make config     # Configure and generate build files
make build      # Build the project
make test       # Run all tests with verbose output
make run        # Run the main executable

Examples

./build/tutorial            # Step-by-step tutorial (RECOMMENDED START HERE)
./build/taskmap_example     # ISOXML generation example
./build/logging_example     # TLG logging example  
./build/isoxml             # ISOXML object model demonstration

Examples

Generation Example Output

ISOXML package generated successfully!
Output files:
- ./output/TASKDATA/TASKDATA.XML     # Complete task definition
- ./output/TASKDATA/Prescription.bin # Variable rate prescription data

Generated ISOXML Preview:
<?xml version="1.0" encoding="UTF-8"?>
<ISO11783_TaskData VersionMajor="3" VersionMinor="3">
  <FRM A="FRM1" B="TestField"/>
  <PFD A="PFD1" B="TestField_field" C="FRM1">
    <PLN A="BORDER" B="1">
      <PNT A="1" B="1" C="5653851.210384" D="710299.169043"/>
      <!-- Real coordinates from farmtrax AB line generation -->

Logging Example Output

TLG Logging Example
==================
Created TLG file: ./output/TLG/TIM0001.TLG
Field operation completed!
Total records logged: 173
TLG file created: ./output/TLG/TIM0001.TLG (3492 bytes)

Created TLG files:
  TIM0001.TLG (3492 bytes)  # Main operation log
  TIM0100.TLG (72 bytes)    # Additional session A
  TIM0200.TLG (72 bytes)    # Additional session B

Key Implementation Details

Real Farmtrax Integration

  • Uses farmtrax::Field(boundary, datum, true, 200000.0, false) for field partitioning
  • Calls field.gen_field(swath_width, angle_degrees, headland_count) for swath generation
  • Machine width parameter is critical - determines number of swaths across field
  • Field angle optimization - automatic or manual angle for maximum efficiency
  • Processes real field.get_parts() output for AB lines and headlands
  • No hardcoded coordinates - all guidance patterns from actual farmtrax calculations

ISOXML Object Model

  • Header-only implementation using templates and inline functions
  • Core elements: Farm, Partfield, Task with full attribute support
  • Validation system: Cross-reference checking with detailed error messages
  • XML parsing/generation: Uses rapidxml for high-performance processing
  • ID management: Automatic duplicate prevention and reference validation

Zoneout Zone Support

  • Constructor: zoneout::Zone(name, type, boundary, datum, resolution)
  • Multiple grid layer support: zone.grid_data_.getGrid(i) for each layer
  • Field boundary extraction: zone.poly_data_.getFieldBoundary()
  • Automatic treatment zone generation for each grid layer

TLG Binary Format (ISO 11783-10)

// File Structure (ISO Compliant)
[Header - 32 bytes]: "TLG\0" + version + reserved
[Position Records]: type(1) + timestamp(4) + WGS84_N(4) + WGS84_E(4) + GPS(1) + pad(3) = 17 bytes
[Process Data Records]: type(1) + timestamp(4) + DDI(2) + value(4) + device(1) + pad(1) = 13 bytes

// WGS-84 coordinates in 10^-7 degrees precision
// GPS quality: 0=No GPS, 1=GNSS, 2=DGPS, 3=PPS, 4=RTK, 5=Float RTK, 6=Estimated

DDI Support (ISO 11783-11)

  • DDI::APPLICATION_RATE = 6 (kg/ha)
  • DDI::MACHINE_SPEED = 148 (mm/s)
  • DDI::ACTUAL_WORK_STATE = 141 (0=not working, 1=working)
  • DDI::FUEL_CONSUMPTION = 183 (ml/h)
  • Full list of agricultural DDI constants provided

Testing

Test Coverage

  • test_generation.cpp: ISOXML generation with farmtrax integration
  • test_logging.cpp: ISO-compliant TLG binary format with WGS-84 coordinates
  • test_bin_utils.cpp: Type 1/Type 2 grid formats and binary compliance
  • test_integration.cpp: End-to-end workflows combining generation and logging
  • test_xml_utils.cpp: XML utilities and coordinate conversion
  • 443+ assertions covering ISO 11783-10 compliance verification

Running Tests

make test                    # Run all tests
./build/test_generation      # Test ISOXML generation
./build/test_logging         # Test TLG binary logging
./build/test_integration     # Test combined workflows

Legacy Compatibility

The original taskmap::Taskmap class is preserved for backward compatibility:

taskmap::Taskmap legacy; // Still works
legacy.generate_isoxml_package(zone, output_dir, "Task");

File Output Structure

output/
├── TASKDATA/                    # ISOXML package
│   ├── TASKDATA.XML            # Main task definition
│   ├── Prescription.bin        # Grid layer 0 prescription
│   └── Prescription_1.bin      # Additional grid layers
└── TLG/                        # Time log files
    ├── TIM0001.TLG            # Task execution log
    ├── TIM0002.TLG            # Additional operations
    └── ...

Use Cases

  1. Precision Agriculture: Generate variable rate application maps with machine width-based AB line guidance
  2. Fleet Management: Log real-time field operation data for analysis and compliance
  3. FMIS Integration: Create ISO 11783 compliant data for farm management systems
  4. Research Applications: Collect detailed field operation data with GPS tracking
  5. Equipment Integration: Interface with agricultural machinery for data exchange
  6. Task Controller Integration: Load/save TASKDATA.XML files for ISOBUS equipment
  7. Data Validation: Comprehensive validation of ISOXML structure and cross-references

License

See LICENSE file for details.

Contributing

  1. Follow the code style defined in .clang-format
  2. All functions must be fully implemented (no stubs)
  3. Preserve real farmtrax integration for AB line generation
  4. Maintain ISO compliance for both ISOXML and TLG formats
  5. Add tests for new functionality

Dependencies

  • zoneout: Field boundary and grid data management
  • farmtrax: Automatic AB line and swath generation
  • concord: Coordinate conversions and geometric operations
  • rapidxml: Fast XML parsing and generation
  • doctest: Unit testing framework

About

ISOXML task definition generation and real-time TLG (Time Log Generation) binary logging

Resources

License

Stars

Watchers

Forks

Packages

No packages published