<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hades.mech.northwestern.edu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PhilipLee</id>
	<title>Mech - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hades.mech.northwestern.edu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PhilipLee"/>
	<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php/Special:Contributions/PhilipLee"/>
	<updated>2026-04-20T20:44:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=NatNetLinux&amp;diff=22702</id>
		<title>NatNetLinux</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=NatNetLinux&amp;diff=22702"/>
		<updated>2014-03-07T21:30:03Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a C++ library to read raw NatNet packets into structured data fields on Linux systems. Please see the [https://github.com/rocketman768/NatNetLinux Github NatNetLinux page] for more detail.&lt;br /&gt;
&lt;br /&gt;
=NatNet=&lt;br /&gt;
&lt;br /&gt;
NatNet is a protocol specified by Optitrack. Below are some of the surprising details I learned about it.&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;latency&amp;#039; field of a NatNet packet is not latency of any sort. It is a timestamp added by Motive.&lt;br /&gt;
* The &amp;#039;latency&amp;#039; field is a float, meaning it has about 7 digits of precision. Since it starts at 0 when Motive starts, this means that it can give you .1 ms precision only for about 1,000 seconds afterward, and 1 ms precision for about 10,000 seconds. It&amp;#039;s useless.&lt;br /&gt;
* The &amp;#039;frame number&amp;#039; field of a NatNet packet is also useless in live mode. You may get many consecutive packets with the same frame number. This field is only defined in playback mode.&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22623</id>
		<title>FChronos</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22623"/>
		<updated>2014-02-14T15:14:02Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The fChronos is a custom device meant to be attached to the [[eSync]] device to address certain deficiencies of the latter.&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
&lt;br /&gt;
The purpose of this device is to provide a way to get the true acquisition time of a frame of motion capture data. We need to do this in a high-speed system, because you simply cannot assume the time that a packet arrives is the same time that the exposure captured the data. Since the latency introduced by UDP and the OS is a random process with unacceptable delay and jitter (ms or more), we need a way to get the time of the actual acquisition of the data with (hopefully) microsecond precision.&lt;br /&gt;
&lt;br /&gt;
It does this by synchronizing its system clock to microsecond precision with another computer on the same LAN using PTPv2 as a slave. Then, the device will generate timecodes which correspond to its own system clock and output the timecode along with a trigger pulse to the eSync. Since the eSync writes this timecode onto the NatNet packets, this allows direct translation of the NatNet timecode value to a system clock time when it arrives on the target computer.&lt;br /&gt;
&lt;br /&gt;
==Operation==&lt;br /&gt;
&lt;br /&gt;
[[Image:FChronos.svg|frame|c|right|fChronos timing diagram]]&lt;br /&gt;
&lt;br /&gt;
The device starts [http://ptpd.sourceforge.net/ ptpd] on boot as a clock slave. It will then synchronize to a master clock (which should be the control PC) to within about a microsecond of precision by doing a handshake with the master over the network at most once per second. It also starts a hard realtime process that reads its system time, and provides the trigger signal on GPIO 4, and the SMPTE timecode on GPIO 17 at 25 Hz. A full timing diagram is shown to the right, where the &amp;quot;Sync In&amp;quot; and &amp;quot;Timecode In&amp;quot; are the outputs of the fChronos to the [[eSync]].&lt;br /&gt;
&lt;br /&gt;
The sync and timecode signals are output at a rate of 25 Hz. The timecode has the logical format HH:MM:SS:FF, where the frames FF are in the range [0,24]. The [[eSync]] locks its internal clock to these frequencies, and allows us to specify a multiplicative factor to achieve a desired framerate. For our cameras, we find that this factor should be set to 14 (25 Hz * 14 = 350 fps) for best performance without dropping frames. This internal lock and multiplication gives the &amp;quot;eSync Internal Sync&amp;quot; signal in the diagram. The middle of the actual exposure happens at &amp;lt;math&amp;gt;T/2&amp;lt;/math&amp;gt; seconds after the internal clock pulse.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
It is a (model B) Raspberry Pi running the [http://www.machinoid.com/ Machinoid] hard RTOS distribution.&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
It runs a custom piece of software that reads system time, and bitbangs the trigger signal on GPIO 4, and the SMPTE timecode on GPIO 17 at 25 Hz.&lt;br /&gt;
&lt;br /&gt;
[[Image:GPIOs.png]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=File:FChronos.svg&amp;diff=22622</id>
		<title>File:FChronos.svg</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=File:FChronos.svg&amp;diff=22622"/>
		<updated>2014-02-14T14:56:27Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: fChronos and eSync timing diagram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;fChronos and eSync timing diagram&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22605</id>
		<title>FChronos</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22605"/>
		<updated>2014-02-12T16:50:56Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The fChronos is a custom device meant to be attached to the [[eSync]] device to address certain deficiencies of the latter.&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
&lt;br /&gt;
The purpose of this device is to provide a way to get the true acquisition time of a frame of motion capture data. We need to do this in a high-speed system, because you simply cannot assume the time that a packet arrives is the same time that the exposure captured the data. Since the latency introduced by UDP and the OS is a random process with unacceptable delay and jitter (ms or more), we need a way to get the time of the actual acquisition of the data with (hopefully) microsecond precision.&lt;br /&gt;
&lt;br /&gt;
It does this by synchronizing its system clock to microsecond precision with another computer on the same LAN using PTPv2 as a slave. Then, the device will generate timecodes which correspond to its own system clock and output the timecode along with a trigger pulse to the eSync. Since the eSync writes this timecode onto the NatNet packets, this allows direct translation of the NatNet timecode value to a system clock time when it arrives on the target computer.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
It is a (model B) Raspberry Pi running the [http://www.machinoid.com/ Machinoid] hard RTOS distribution.&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
It runs a custom piece of software that reads system time, and bitbangs the trigger signal on GPIO 4, and the SMPTE timecode on GPIO 17 at 25 Hz.&lt;br /&gt;
&lt;br /&gt;
[[Image:GPIOs.png]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22604</id>
		<title>FChronos</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=FChronos&amp;diff=22604"/>
		<updated>2014-02-12T16:49:33Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Created page with &amp;quot;The fChronos is a custom device meant to be attached to the eSync device to address certain deficiencies of the latter.  ==Purpose==  The purpose of this device is to prov...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The fChronos is a custom device meant to be attached to the [[eSync]] device to address certain deficiencies of the latter.&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
&lt;br /&gt;
The purpose of this device is to provide a way to get the true acquisition time of a frame of motion capture data. We need to do this in a high-speed system, because you simply cannot assume the time that a packet arrives is the same time that the exposure captured the data. Since the latency introduced by UDP and the OS is a random process with unacceptable delay and jitter (ms or more), we need a way to get the time of the actual acquisition of the data with (hopefully) microsecond precision.&lt;br /&gt;
&lt;br /&gt;
It does this by synchronizing its system clock to microsecond precision with another computer on the same LAN using PTPv2 as a slave. Then, the device will generate timecodes which correspond to its own system clock and output the timecode along with a trigger pulse to the eSync. Since the eSync writes this timecode onto the NatNet packets, this allows direct translation of the NatNet timecode value to a system clock time when it arrives on the target computer.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
It is a (model B) Raspberry Pi running the [http://www.machinoid.com/ Machinoid] hard RTOS distribution.&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
It runs a custom piece of software that reads system time, and bitbangs the trigger signal on GPIO 4, and the SMPTE timecode on GPIO 17.&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=File:GPIOs.png&amp;diff=22603</id>
		<title>File:GPIOs.png</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=File:GPIOs.png&amp;diff=22603"/>
		<updated>2014-02-12T16:49:09Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Raspberry Pi GPIO breakout headers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raspberry Pi GPIO breakout headers.&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=NatNetLinux&amp;diff=22602</id>
		<title>NatNetLinux</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=NatNetLinux&amp;diff=22602"/>
		<updated>2014-02-12T16:32:15Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Created page with &amp;quot;This is a C++ library to read raw NatNet packets into structured data fields on Linux systems. Please see the [https://github.com/rocketman768/NatNetLinux Github NatNetLinux p...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a C++ library to read raw NatNet packets into structured data fields on Linux systems. Please see the [https://github.com/rocketman768/NatNetLinux Github NatNetLinux page] for more detail.&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22601</id>
		<title>MRI Project</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22601"/>
		<updated>2014-02-12T16:30:36Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to create a platform for graduate students to perform research on a WAM arm with hand and fingertips that uses high speed control and vision.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
* [[eSync]]&lt;br /&gt;
&lt;br /&gt;
===Custom Hardware===&lt;br /&gt;
&lt;br /&gt;
* [[fChronos]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
* [[Motive]]&lt;br /&gt;
&lt;br /&gt;
===Custom Software===&lt;br /&gt;
&lt;br /&gt;
* [[NatNetLinux]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=ESync&amp;diff=22600</id>
		<title>ESync</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=ESync&amp;diff=22600"/>
		<updated>2014-02-12T16:03:02Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Created page with &amp;quot;The [http://www.naturalpoint.com/optitrack/products/esync/ eSync] is a [http://en.wikipedia.org/wiki/Power_over_Ethernet PoE]-powered device whose purpose is to put in phase t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [http://www.naturalpoint.com/optitrack/products/esync/ eSync] is a [http://en.wikipedia.org/wiki/Power_over_Ethernet PoE]-powered device whose purpose is to put in phase the exposures of all cameras on the LAN. It has the additional capabilities to be externally triggered, accept [http://en.wikipedia.org/wiki/Linear_timecode linear SMPTE timecodes], and output certain signals. The [http://www.naturalpoint.com/optitrack/static/documents/eSync%20Quick%20Start%20Guide.pdf NaturalPoint documentation] of the eSync is nearly nonexistent, and this document is intended to be a supplement.&lt;br /&gt;
&lt;br /&gt;
==Trigger Input==&lt;br /&gt;
&lt;br /&gt;
The device can accept trigger signals of several types:&lt;br /&gt;
# Hi-Z - 3.3V logic over short lines with high impedance&lt;br /&gt;
# Lo-Z - 3.3V logic over transmission line of 50 or 75-Ohm impedance&lt;br /&gt;
# Isolated - Logic levels higher than 3.3V, or with distinct ground potential&lt;br /&gt;
&lt;br /&gt;
The trigger signal&amp;#039;s frequency can be multiplied and divided by integer values using the [http://www.naturalpoint.com/optitrack/products/motive/tracker/ Motive:Tracker] software to provide the desired framerate. The resulting pulses demarcate the frame capture boundaries on either the rising or falling edge, which is also set in Motive:Tracker. The actual exposure of the frame is exactly centered inside the frame boundary. For example, if &amp;lt;math&amp;gt;T = 1/\text{fps}&amp;lt;/math&amp;gt; is the frame period, &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; is the time of the rising edge of the trigger pulse, and &amp;lt;math&amp;gt;E&amp;lt;T&amp;lt;/math&amp;gt; is the exposure time, then the exposure will start at &amp;lt;math&amp;gt;t_0 + T/2 - E/2&amp;lt;/math&amp;gt; and end at &amp;lt;math&amp;gt;t_0 + T/2 + E/2&amp;lt;/math&amp;gt; by default. Motive:Tracker also allows you to further delay the exposure by arbitrary amounts.&lt;br /&gt;
&lt;br /&gt;
==SMPTE Input==&lt;br /&gt;
&lt;br /&gt;
This port is intended to be used to write timecodes onto the NatNet packets, which contain the time that the images are originally taken (as opposed to the time when the 3D reconstruction is made). This allows the motion capture data to be accurately synchronized with video frame numbers in post-processing. The input format is [http://en.wikipedia.org/wiki/Linear_timecode linear SMPTE timecodes] encoded with [http://en.wikipedia.org/wiki/Biphase_mark_code biphase mark coding]. The timecodes should reflect 24/25/29.97/30 fps video. Since biphase mark coding guarantees a level transition for every bit of data, this allows the eSync to perform [http://en.wikipedia.org/wiki/Clock_recovery clock recovery] from the SMPTE input alone using a [http://en.wikipedia.org/wiki/Phase_locked_loop PLL] or similar circuit.&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22599</id>
		<title>MRI Project</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22599"/>
		<updated>2014-02-12T15:36:35Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to create a platform for graduate students to perform research on a WAM arm with hand and fingertips that uses high speed control and vision.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[eSync]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22598</id>
		<title>MRI Project</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22598"/>
		<updated>2014-02-12T15:34:57Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to create a platform for graduate students to perform research on a WAM arm with hand and fingertips that uses high speed control and vision.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[eSync Hub]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22597</id>
		<title>MRI Project</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=MRI_Project&amp;diff=22597"/>
		<updated>2014-02-12T15:34:41Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Created page with &amp;quot;=MRI Project=  The goal of this project is to create a platform for graduate students to perform research on a WAM arm with hand and fingertips that uses high speed control an...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=MRI Project=&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to create a platform for graduate students to perform research on a WAM arm with hand and fingertips that uses high speed control and vision.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
[[eSync Hub]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=Projects_and_miscellaneous&amp;diff=22596</id>
		<title>Projects and miscellaneous</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=Projects_and_miscellaneous&amp;diff=22596"/>
		<updated>2014-02-12T15:31:39Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Deleted test page link. Added MRI Project.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[ME 333 final projects]]&lt;br /&gt;
*[[The Gibbot]]&lt;br /&gt;
*[[Real-Time Linux for TrackCam]]&lt;br /&gt;
*[[NI-DAQ Cards on Linux]]&lt;br /&gt;
*[[Disk-on-Disk Rolling Manipulation Project]]&lt;br /&gt;
*[[PPOD Experiments with a Textured Plate]]&lt;br /&gt;
*[[VPOD 3DOF Vibratory Device]]&lt;br /&gt;
*[[Design and Control of a Pantograph Robot]]&lt;br /&gt;
*[[PIC Motor Control with EEPROM and Interactive Menu Example]]&lt;br /&gt;
*[[Swarm Robot Project Overview]]&lt;br /&gt;
*[[Robot Helicopter Project]]&lt;br /&gt;
*[[E-Puck Color Sensing Project]]&lt;br /&gt;
*[[Guitar Tuning Project]]&lt;br /&gt;
*[[Mohr&amp;#039;s Circle]]&lt;br /&gt;
*[[E-puck Mobile Robot]]&lt;br /&gt;
*[[Bearings]]&lt;br /&gt;
*[[Using the Basic Stamp Microcontroller]]&lt;br /&gt;
*[[Basic Stamp]]&lt;br /&gt;
*[[Solderboard]]&lt;br /&gt;
*[[Battery disaster]]&lt;br /&gt;
*[[LIMS Air Hockey Table]]&lt;br /&gt;
*[[Rotational Stiffness]]&lt;br /&gt;
*[[PIC USB]]&lt;br /&gt;
*[[MATLAB Motor Controller]]&lt;br /&gt;
*[[Flexure Characterization and Design]]&lt;br /&gt;
*[[Bouncing Polygon Simulator]]&lt;br /&gt;
*[[Control with TrackCam Vision Feedback and MATLAB]]&lt;br /&gt;
*[[High Speed Vision System and Object Tracking]]&lt;br /&gt;
*[[MonkeyBot Simulation Project]]&lt;br /&gt;
*[[PPOD-mini Project]]&lt;br /&gt;
*[[PPOD User Guide]]&lt;br /&gt;
*[[PIC32MX: High-speed Wireless Communication]]&lt;br /&gt;
*[[Setup, Use, and Modeling of Harmonic Drive Motors with Junus Amps]]&lt;br /&gt;
*[[Portable Sit-to-Stand Device]]&lt;br /&gt;
*[[MRI Project]]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
	<entry>
		<id>https://hades.mech.northwestern.edu//index.php?title=User:PhilipLee&amp;diff=22595</id>
		<title>User:PhilipLee</title>
		<link rel="alternate" type="text/html" href="https://hades.mech.northwestern.edu//index.php?title=User:PhilipLee&amp;diff=22595"/>
		<updated>2014-02-12T15:30:32Z</updated>

		<summary type="html">&lt;p&gt;PhilipLee: Created page with &amp;quot;[http://www.linkedin.com/in/philipgreggorylee/ Philip Greggory Lee]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.linkedin.com/in/philipgreggorylee/ Philip Greggory Lee]&lt;/div&gt;</summary>
		<author><name>PhilipLee</name></author>
	</entry>
</feed>