anchor.diff:  
   [.text-center]
   .Zoomed in RTT for 40 devices
  -image::udp/rtt-linux-40x-zoomed.png[link="../images/udp/rtt-linux-40x-zoomed.png", width="100%"]
  +image::udp/rtt-linux-40x-zoomed.png[link="{imagesdir}/udp/rtt-linux-40x-zoomed.png", width="100%"]
   
   [.text-center]
   .RTT for 40 devices (90 min)
  -image::udp/rtt-linux-40x.png[link="../images/udp/rtt-linux-40x.png", width="100%"]
  +image::udp/rtt-linux-40x.png[link="{imagesdir}/udp/rtt-linux-40x.png", width="100%"]
   
   However, the amount of latency and jitter turned out to be worse than we anticipated. We expected most columns to start at around ~180us and end at ~280us. While this was sometimes the case, the majority of columns started above 300 us. After some initial research we suspected that this delay was mostly caused by the Linux https://en.wikipedia.org/wiki/New_API[NAPI] using polling mode rather than interrupts, and by using a low-cost network interface paired with suboptimal device drivers. While we expected the OS and driver stack to introduce additional latency and jitter, we were surprised by the order of magnitude.
   
  
positive.code: 
  [.text-center]
  .OS jitter of ChibiOS 2.6.8 on STM32F407 (24h)
  image::udp/os-jitter-embedded.png[link="../images/udp/os-jitter-embedded.png", width="100%"]
  
  The two figures below show the round-trip time for all packets and the corresponding percentile distribution. There were a total of 8.5 million messages. None of them were lost and none of them arrived out of order.
  
  [[img-rtt-24h]]
  [.text-center]
  .RTT for 200 byte payload (24h)
  image::udp/rtt-baseline.png[link="../images/udp/rtt-baseline.png", width="100%"]
  
  [.text-center]
  .Zoomed in view of RTT for 200 byte payload (10min)
  image::udp/rtt-baseline-zoomed.png[link="../images/udp/rtt-baseline-zoomed.png", width="100%"]
  
  90% of all packets arrived within 194us and a jitter of less than 1 microsecond. Roughly 80us of this time was spent on the wire, so using chips that support Gigabit (rather than 100Mbit) could lower the round-trip time to ~120us. Above the common case, there were three different periodically reoccuring modes that resulted in additional latency.
  
  
negative.code: 
  [.text-center]
  .HEBI Robotics I/O Board
  image::udp/io-board.jpg[link="{imagesdir}/udp/io-board.jpg", width="100%"]
  
  Our startup http://hebirobotics.com/[HEBI Robotics] builds a variety of building blocks that enable quick development of custom robotic systems. We mainly focus on actuators, but we've also developed other devices such as the I/O Board shown in the picture above. Each board has 48 pins that serve a variety of functions (analog and digitial I/O, PWM, Encoder input, etc.) that can be accessed remotely via network. We normally use them in conjunction with our actuators to interface with external devices, such as a gripper or pneumatic valve, or to get various sensor input into MATLAB.
  
  