ForgeTAK Integration
All Guides
Implementation Guides

TAK / ATAK Integration

Put your drone on the same map as everyone else. From zero to a live drone icon on ATAK in under an hour.

Jargon Buster

TAK

Team Awareness Kit. Situational awareness platform used by US military, law enforcement, fire, SAR. Shows positions, tracks, and data on a shared map. The ecosystem: ATAK (Android), WinTAK (Windows), iTAK (iOS), WebTAK (browser).

CoT (Cursor-on-Target)

The XML message format TAK speaks. Everything on the map is a CoT event — a position + type + metadata. If your drone sends one CoT message, it appears on every connected TAK device.

TAK Server

Centralized server that relays CoT messages between TAK clients. Free/open-source version available. Without it, CoT goes via multicast on local network only.

2525C / MIL-STD-2525

The military symbol standard. CoT "type" codes map to 2525C symbology. a-f-A-M-H-Q = friendly air military helicopter. The icon on the map comes from this code.

ATAK Plugin

An Android app extension that runs inside ATAK. The UAS Tool plugin adds drone-specific features (telemetry overlay, video feed, mission planning). Available from TAK.gov.

Multicast vs Unicast

Multicast: broadcast CoT to everyone on the LAN (239.2.3.1:6969). Unicast: send to a specific TAK Server IP. Multicast is simpler but doesn't cross network boundaries. TAK Server handles routing across networks.

The Minimum Viable Drone-on-Map
One UDP packet. That's all it takes to put your drone on TAK.
# ═══ MINIMUM CoT EVENT — PUT A DRONE ON THE MAP ═══ # This XML is the entire message. Send it over UDP. <?xml version="1.0" encoding="UTF-8"?> <event version="2.0" uid="drone-01" type="a-f-A-M-H-Q" how="m-g" time="2026-03-20T18:30:00Z" start="2026-03-20T18:30:00Z" stale="2026-03-20T18:31:00Z"> <point lat="44.9778" lon="-93.2650" hae="300" ce="10" le="15"/> </event> # uid: Unique ID — same uid = same icon moves on map # type: a-f-A-M-H-Q = friendly, air, military, helicopter # how: m-g = machine GPS # stale: Remove from map after this time (set 30-60s for moving drone) # hae: Height above ellipsoid (meters, WGS84) # ce/le: Circular/linear error (meters, 90% confidence)CoT XML
# ═══ SEND CoT VIA PYTHON — WORKS ON ANY COMPANION COMPUTER ═══ # pip install pytak (or just use raw sockets) import socket, time, datetime def send_cot(lat, lon, alt, uid="drone-01", dest="239.2.3.1", port=6969): now = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") stale = (datetime.datetime.utcnow() + datetime.timedelta(seconds=60)).strftime("%Y-%m-%dT%H:%M:%SZ") cot = f'''<?xml version="1.0" encoding="UTF-8"?> <event version="2.0" uid="{uid}" type="a-f-A-M-H-Q" how="m-g" time="{now}" start="{now}" stale="{stale}"> <point lat="{lat}" lon="{lon}" hae="{alt}" ce="10" le="15"/> </event>''' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(cot.encode(), (dest, port)) sock.close() # Call in a loop with MAVROS position data: # while True: # pos = get_position_from_mavros() # send_cot(pos.lat, pos.lon, pos.alt) # time.sleep(1) # 1 Hz position updatesPython
That's it. Run this on your companion computer, open ATAK on your phone (connected to the same network), and your drone appears as a blue helicopter icon. Every 1-second update moves the icon in real time.
MAVROS → TAK Bridge (ROS Node)
# ═══ ROS NODE: SUBSCRIBE TO MAVROS, PUBLISH CoT ═══ # Install: pip install rospy pytak # This node reads position from MAVROS and sends CoT to TAK #!/usr/bin/env python3 import rospy, socket, datetime from sensor_msgs.msg import NavSatFix from geometry_msgs.msg import TwistStamped TAK_DEST = "239.2.3.1" # Multicast (or TAK Server IP) TAK_PORT = 6969 DRONE_UID = "wingman-01" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) def gps_callback(msg): now = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") stale = (datetime.datetime.utcnow() + datetime.timedelta(seconds=30)).strftime("%Y-%m-%dT%H:%M:%SZ") cot = f'<event version="2.0" uid="{DRONE_UID}" ' cot += f'type="a-f-A-M-H-Q" how="m-g" ' cot += f'time="{now}" start="{now}" stale="{stale}">' cot += f'<point lat="{msg.latitude}" lon="{msg.longitude}" ' cot += f'hae="{msg.altitude}" ce="10" le="15"/>' cot += '</event>' sock.sendto(cot.encode(), (TAK_DEST, TAK_PORT)) rospy.init_node('tak_bridge') rospy.Subscriber('/mavros/global_position/global', NavSatFix, gps_callback) rospy.spin()ROS Node
Video Feed to ATAK
# ═══ STREAM VIDEO TO ATAK VIA RTSP ═══ # On companion computer — create RTSP server with GStreamer: gst-launch-1.0 v4l2src device=/dev/video0 ! \ video/x-raw,width=1280,height=720,framerate=30/1 ! \ x264enc tune=zerolatency bitrate=1500 speed-preset=ultrafast ! \ rtph264pay ! \ udpsink host=239.2.3.1 port=5600 # In ATAK → Video → Add → Network → UDP # Address: 239.2.3.1 Port: 5600 # The video feed appears as a layer on the map # For TAK Server routing, use RTSP instead: # Install mediamtx (lightweight RTSP server) # Stream to: rtsp://companion-ip:8554/drone1 # ATAK connects to the RTSP URL directlyVideo
TAK Server (Optional)
Without a server, CoT only works on local network (multicast). A TAK Server lets devices across different networks see each other.
# ═══ FREE TAK SERVER (FreeTAKServer) ═══ # Runs on any Linux box, Raspberry Pi, or cloud VM pip install FreeTAKServer # Start: python3 -m FreeTAKServer.controllers.services.FTS # Default ports: # TCP 8087 — CoT input (devices connect here) # TCP 8443 — REST API # TCP 19023 — Federation # In ATAK: Settings → Network → TAK Server # Address: your-server-ip # Port: 8087 # Protocol: TCP # For your drone's CoT bridge, change dest to unicast: # TAK_DEST = "your-server-ip" # TAK_PORT = 8087 # Use TCP socket instead of UDPTAK Server
Official TAK Server: Available from tak.gov (requires .mil/.gov email or TAK Product Center account). More robust than FreeTAKServer, supports certs, federation, and enterprise features.
Back to Implementation Guides