Documentation

VisionMax - Technical documentation

Reference for integrators/developers: interfaces, SDK, and settings.

Ports (reference)

ServicePort
Web (static)8080
ROSBridge (WS)5010
HTTP video (MJPEG/H26x)8081+
RTSP5004+

Exact values depend on systemConfig/local/* (e.g. camera0_RtspServer.json).

MerioProtocol

MERIO communication chain: transport (serial/UDP) → frames (CRC/byte-stuffing) → payload → encode/decode based on a protocol definition file.

Transport

  • MerioTransportLayer: serial/UDP abstraction + framing + CRC16 + byte-stuffing.
  • Implementation: src/core_network_tourelle/include/merio_transport_layer.h

Decoding / application mapping

  • AppMerioProtocol: parses definitions (JSON) + encodes/decodes blocks.
  • Implementation: src/core_device_linker/src/app_merio_protocol.*
  • Protocol file (example): config/TemisXL8V2.json

Structure of protocol_file (JSON)

Files config/*.json define classes, categories (e.g. Commands, Status) and blocks identified by an id (often hex).

{
  "protocol": {
    "classes": {
      "VisionMax": {
        "classCode": 25,
        "Commands": {
          "FollowMe": { "id": "0x00", "item": [ { "name": "CamId", "type": "UInt8" } ] }
        },
        "Status": {
          "Telemetry": { "id": "0x80", "item": [ { "name": "MODE", "type": "Uint8" } ] }
        }
      }
    }
  }
}

Frame format (MERIO transport)

Details from src/core_network_tourelle/src/merio_transport_layer.cpp.

START: 0xAA
STUFF: 0x5A  (0xAA → 0x5A 0x00, 0x5A → 0x5A 0x5A)

Frame (unstuffed):
  LEN (uint8) = payload_len + 1
  CMD (uint8) = 0x00
  PAYLOAD (LEN-1 bytes)
  CRC16 (little-endian) over [LEN, CMD] + PAYLOAD, poly 0x1021, init 0

Topics (typical chaining)

Example from settings (see systemConfig/global/CommunicationInterface.json).

RX: network/receive_payload
TX: network/send_payload
Events: device_linker/data_changed, device_linker/data_changed_list
Command: device_linker/set_value

ROS 2 components (reference)

NetworkLayer (merio_communication)

Encapsulates/transports the MERIO payload over serial or UDP.

  • Parameters: transport_mode, address, port
  • Topics: input_topic → send, output_topic → receive

Example: systemConfig/local/gimbal_NetworkLayer.json (serial) and systemConfig/local/controlStation_NetworkLayer.json (UDP).

CommunicationInterface (device_linker)

Decodes/encodes the application payload via a protocol_file and publishes values (DeviceMessage).

  • Key parameters: protocol_file, send_period_ms
  • RX/TX: topic_rx / topic_tx (UInt8MultiArray)

Protocol examples: config/MilvusV2.json, config/VisionUnitV2.json.

ProxyGroundToGimbal (filter_proxy)

Multi-connection proxy with packet filtering (useful to relay only some IDs).

  • Parameters: proxy_connections (src→dst), filter_values
  • Format: a message can contain multiple packets [size][payload...]

Example: systemConfig/global/ProxyGroundToGimbal.json.

VisionMax includes a MAVLink v2 gimbal-oriented bridge via merio_gimbal_mavlink. Goal: exchange MAVLink commands/states with the VisionMax ecosystem.

Transport (UDP)

  • udp.bind_port: local listen port
  • udp.target_addr: target IP/hostname

IDs & heartbeat

  • ids.system_id_mode: follow_autopilot (adopts detected SYSID)
  • ids.system_id, ids.component_id

ROS interfaces

  • dvmsg_topic_in: default /gimbal/device_linker/data_changed (DeviceMessage)
  • dvmsg_topic_out: default /gimbal/device_linker/set_value (DeviceMessage)

Capabilities

  • caps.has_roll_axis
  • caps.supports_infinite_yaw
Example (activation)
ros2 run merio_gimbal_mavlink merio_gimbal_mavlink --ros-args \
  -p udp.bind_port:=<BIND_PORT> \
  -p udp.target_addr:="<TARGET_ADDR>" \
  -p udp.target_port:=<TARGET_PORT> \
  -p ids.system_id_mode:=follow_autopilot

MAVLink dialect reference: config/minimal.xml. Dependency: libmavlink-dev.

Need help?

Reach out if something blocks your integration.

Our technical team is here to help you integrate VisionMax into your systems.

    VisionMax technical documentation