<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Robotics Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/tag/robotics/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Fri, 24 Jul 2026 15:54:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Robotics Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</title>
		<link>https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/</link>
		
		<dc:creator><![CDATA[Will Todd]]></dc:creator>
		<pubDate>Tue, 26 May 2026 11:00:00 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Epson RC+]]></category>
		<category><![CDATA[Epson Robots]]></category>
		<category><![CDATA[Robotics]]></category>
		<category><![CDATA[Simulation]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=44526</guid>

					<description><![CDATA[<p>This blog is Part 4 of a multi-part series. Make sure to check out the other blogs on this topic: Summary This article is the fourth in a series to explain the basics of creating a base project using Epson RC+, Epson&#8217;s software for developing and simulating an industrial robotic application. Epson offers a wide [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/">Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-bcadade0 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<p class="wp-block-paragraph">This blog is <strong>Part 4</strong> of a multi-part series. Make sure to check out the other blogs on this topic:</p>



<ol class="wp-block-list">
<li><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/">Epson Robots Getting Started: Create a New Project in Epson RC+</a></li>



<li><a href="https://static.dmcinfo.com/wp-admin/post.php?post=43113&amp;action=edit">Epson RC+ Project Structure Explained: Files, Folders, and Flow</a></li>



<li><a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/">Epson Robots Commissioning Tools and Workflows in RC+</a></li>



<li><strong>Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</strong></li>
</ol>
</div>



<h2 class="wp-block-heading" id="h-summary">Summary</h2>



<p class="wp-block-paragraph">This article is the fourth in a series to explain the basics of creating a base project using Epson RC+, Epson&#8217;s software for developing and simulating an industrial robotic application. Epson offers a wide range of industrial robots for a variety of applications. Programming and configuring are done through their easy-to-use configuration software, Epson RC+, which offers many time-saving features and various add-on packages depending on the complexity of each application. In this article, we will cover the configuration of the Robot Simulator and demonstrate some useful features for simulating and testing the robot program prior to deployment in the field.</p>



<h2 class="wp-block-heading" id="h-set-up-virtual-controller">Set up Virtual Controller</h2>



<p class="wp-block-paragraph">The first step to simulate the robot is to configure a virtual controller. This is done through the <strong>Setup &gt; PC</strong> to Controller Communications menu. Here, you can add a new Controller as a virtual controller. Once added, the controller can be given a different name, and then click ‘Apply’.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-16f0d390 wp-block-columns-is-layout-flex" style="padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--40)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full has-custom-border"><img fetchpriority="high" decoding="async" width="461" height="151" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-1.png" alt="The image shows the Epson RC+ Integrated Development Environment (IDE) used for programming and managing Epson robot projects." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44550" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-1.png 461w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-1-300x98.png 300w" sizes="(max-width: 461px) 100vw, 461px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="491" height="364" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-2.png" alt="Image of PC to Controller Communications window for Epson RC+ software, used for configuring robot connections" class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44553" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-2.png 491w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-2-300x222.png 300w" sizes="(max-width: 491px) 100vw, 491px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="312" height="247" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-3.png" alt="Image of a dialog box in Epson RC+ used to configure communications between a computer and a robot controller, specifically for creating a simulation environment." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44552" style="width:361px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-3.png 312w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-3-300x238.png 300w" sizes="(max-width: 312px) 100vw, 312px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">For this demo, we utilized the Robot model LS6-B502S. Also, important for this demo are the points used in the program logic shown below.</p>



<figure class="wp-block-image aligncenter size-full has-custom-border" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="631" height="138" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-4.png" alt="The image displays a table of point data (robot1.pts) for an Epson RC+ environment. Each entry defines a specific position and configuration for the robot." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44556" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-4.png 631w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-4-300x66.png 300w" sizes="(max-width: 631px) 100vw, 631px" /></figure>



<p class="wp-block-paragraph">Using the <strong>Connection </strong>dropdown, select the new virtual controller that was created. This will start up the virtual controller and allow us to control the robot in the simulator. Open the <strong>Robot Simulator</strong> by using the toolbar icon.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-16f0d390 wp-block-columns-is-layout-flex" style="padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--40)">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignright size-full is-resized has-custom-border"><img decoding="async" width="436" height="157" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-5.png" alt="Screenshot of Device Connection Selector with &quot;Demo&quot; highlighted in the dropdown." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44557" style="aspect-ratio:2.777295608401319;width:578px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-5.png 436w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-5-300x108.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignleft size-full is-resized has-custom-border"><img decoding="async" width="443" height="184" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-6.png" alt="The image displays a toolbar from Epson RC+ program with the Simulator icon selected." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44558" style="aspect-ratio:2.407644270559025;width:474px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-6.png 443w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-6-300x125.png 300w" sizes="(max-width: 443px) 100vw, 443px" /></figure>
</div>
</div>



<h2 class="wp-block-heading">Robot Simulator Environment</h2>



<p class="wp-block-paragraph">The Robot simulator environment has several different features and functions to test parts of the robot application. The most basic use case is to import CAD shapes or models to create a simulated environment for the application. The first 4 icons in the Robot Simulator allow the user to add 2D and 3D objects to the workspace. By default, a 2D plane is generated, with the robot placed at the world origin. Often, a robot is mounted on a pedestal that requires the user to move it with some offset relative to the origin; however, we will keep the robot at the origin for simplicity in this example.</p>



<p class="wp-block-paragraph">The first objects we will add to the simulation will be two rectangles to emulate stations within the machine. Click on the <strong>SPlane_1</strong> object, then click on the layout box (purple cube) icon at the top. The size, position, and colors were modified as shown.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="378" height="379" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-7.png" alt="Screenshot showing the Layout Objects pane within the Epson Robot Simulator software." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44560" style="aspect-ratio:0.9974437206234024;object-fit:cover;width:320px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-7.png 378w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-7-300x300.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-7-150x150.png 150w" sizes="(max-width: 378px) 100vw, 378px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="323" height="319" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-8.png" alt="Screenshot of a table showing different values representing the robot's position in Station 1." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44561" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-8.png 323w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-8-300x296.png 300w" sizes="(max-width: 323px) 100vw, 323px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignleft size-full has-custom-border"><img decoding="async" width="298" height="318" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-9.png" alt="Screenshot of a table showing different values representing the robot's position in Station 2." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44562" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-9.png 298w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-9-281x300.png 281w" sizes="(max-width: 298px) 100vw, 298px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">Devices mounted to the robot arm, such as a camera, are configured as mounted devices. This means the device will move with the robot rather than remain in a fixed position. To attach a device to the robot, right-click on the device in the layout tree and select <strong>Part/Mounted Device Settings</strong>. Two cylinders were added to the layout to emulate a camera mounted to the end of the second robot arm. The smaller red cylinder is just added as a reference to show where the center of the camera&#8217;s field of view is located. For this cylinder, we have disabled the Collision check option, since it will not be physically present in the actual application.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-ec2c5d06 wp-block-columns-is-layout-flex" style="padding-top:0;padding-bottom:var(--wp--preset--spacing--40)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="408" height="418" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-10.png" alt="Image displaying a right-click context menu within Epson RC+. The menu options allow for managing a &quot;Camera (Mounted Device)&quot; within the simulation layout." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44565" style="aspect-ratio:0.9764431993055281;object-fit:cover;width:320px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-10.png 408w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-10-293x300.png 293w" sizes="(max-width: 408px) 100vw, 408px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="365" height="519" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-11.png" alt="Screenshot of a dialogue box in Epson RC+ allowing a user to configure a &quot;Camera&quot; object within a robot simulation environment." class="wp-image-44566" style="aspect-ratio:0.7032773217034377;width:311px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-11.png 365w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-11-211x300.png 211w" sizes="(max-width: 365px) 100vw, 365px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignleft size-full is-resized"><img decoding="async" width="366" height="517" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-12.png" alt="Screenshot of a dialogue box in Epson RC+ allowing a user to configure a &quot;Camera_FOV_Center&quot; object within a robot simulation environment." class="wp-image-44567" style="aspect-ratio:0.7079311791859001;width:310px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-12.png 366w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-12-212x300.png 212w" sizes="(max-width: 366px) 100vw, 366px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">CAD models can also be imported to the simulation environment using the CAD icon in the toolbar rather than relying solely on basic shapes. Supported file types include XV3, VRML, STEP, IGES, and DXF. The dialog offers options for Scale Units, rendering quality, and CAD-to-Point functionality. If CAD-to-Point is enabled, the user can generate robot points directly from the CAD model for use in the robot program. The CAD to Point function is in the toolbar at the top. Once selected, you can click on an edge, and the simulator will automatically generate points for the number of vertices found on the CAD model.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--30)">This example shows how the CAD model provides robot points for the two corners of the part tray by simply selecting the right edge of the tray&#8217;s cavity. The selected edge endpoints are shown as the yellow spheres in the screenshot below. We have exported these two points into the points file at indices 5 and 6.</p>



<figure class="wp-block-image aligncenter size-full is-resized has-custom-border" style="margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="997" height="811" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-13.png" alt="Epson RC+ Robot Simulator showing CAD‑to‑Point conversion, with a 3D model grid and a robot toolpath highlighted between two selected points." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44569" style="aspect-ratio:1.2276671476671477;width:724px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-13.png 997w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-13-300x244.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-13-768x625.png 768w" sizes="(max-width: 997px) 100vw, 997px" /></figure>



<figure class="wp-block-image aligncenter size-full is-resized has-custom-border" style="margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="718" height="251" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-14.png" alt="Point list table in Epson RC+ showing robot positions with X, Y, and Z coordinates, including labeled points and two selected rows for editing." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44571" style="aspect-ratio:2.816894501317967;width:724px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-14.png 718w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-14-300x105.png 300w" sizes="(max-width: 718px) 100vw, 718px" /></figure>



<p class="wp-block-paragraph" style="padding-bottom:0">The simulator can also import CAD models as ‘Hands’, which are the same as the robot&#8217;s end-of-arm tooling. The hands are treated as an extension of the robot, so they will move and rotate with the robot. When importing hands, you can adjust the mounting position and orientation to emulate the tooling assembly on the robot. Below is a CAD model imported that has different-style grippers on either end.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:35%">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="394" height="426" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-15.png" alt="Project browser tree in the Epson RC+ Robot Simulator showing the “Hands” component selected under Robot 1 for end‑of‑arm tooling configuration." class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-44574" style="width:320px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-15.png 394w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-15-277x300.png 277w" sizes="(max-width: 394px) 100vw, 394px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignleft size-full is-resized has-custom-border"><img decoding="async" width="781" height="481" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-16.png" alt="3D rendering of a SCARA (Selective Compliance Assembly Robot Arm)." class="wp-image-44575" style="border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;aspect-ratio:1.6145208429472389;width:633px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-16.png 781w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-16-300x185.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-image-16-768x473.png 768w" sizes="(max-width: 781px) 100vw, 781px" /></figure>
</div>
</div>



<h2 class="wp-block-heading" id="h-testing-your-epson-robot">Testing Your Epson Robot</h2>



<p class="wp-block-paragraph">Now that the 3D environment is set up, you can move the robot around using the robot manager, running a program function in the ‘Run’ window, or using the Robot Operation Panel in the Simulator environment. We put together a short demo program to move the robot between a couple of positions while enabling a trace of the Tool Center Point (TCP) with a green line.</p>



<figure style="padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--40)" class="wp-block-video"><video height="720" style="aspect-ratio: 1280 / 720;" width="1280" autoplay controls muted src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-video.mp4" playsinline></video></figure>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">The Robot simulator also has several other useful features, such as surveillance planes and areas, recording and playback options, rendering point locations in 3D space, and much more. For more assistance with Epson Robot programming and integration, please reach out to DMC’s Industrial Automation team!</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Need help with robotics programming software?</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" id="420">Automation</a> and <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/robotics-engineering/" id="524">Robotics</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-9243fccf wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70);padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<h2 class="wp-block-heading alignwide has-text-align-left" id="h-other-blogs-on-this-topic">Other Blogs on this Topic</h2>



<div class="wp-block-cb-carousel-v2 alignwide cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-44526 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-simulation">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-1 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/" target="_self" >Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43715 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-2 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/" target="_self" >Epson Robots Commissioning Tools and Workflows in RC+</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43113 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Epson RC+ Files, Folders, and Flow" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-3 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/" target="_self" >Epson RC+ Project Structure Explained: Files, Folders, and Flow</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-16530 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-6-axis tag-epson-rc tag-epson-robots tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Creating a New Project in Epson RC+" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-4 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/" target="_self" >Epson Robots Getting Started: Creating a New Project in Epson RC+</a></h4>
</li></ul>

</div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/">Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-robots-robot-simulator-video.mp4" length="2154039" type="video/mp4" />

			</item>
		<item>
		<title>Epson Robots Commissioning Tools and Workflows in RC+</title>
		<link>https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/</link>
		
		<dc:creator><![CDATA[Will Todd]]></dc:creator>
		<pubDate>Mon, 11 May 2026 11:00:00 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Epson RC+]]></category>
		<category><![CDATA[Epson Robots]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=43715</guid>

					<description><![CDATA[<p>This blog is Part 3 of a multi-part series. Make sure to check out the other blogs on this topic: Summary In the third entry in this series, we will be going over some useful tools for commissioning a new Epson robot and troubleshooting programs. We will discuss how to configure the robot controller, operate [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/">Epson Robots Commissioning Tools and Workflows in RC+</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-bcadade0 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<p class="wp-block-paragraph">This blog is <strong>Part 3</strong> of a multi-part series. Make sure to check out the other blogs on this topic:</p>



<ol class="wp-block-list">
<li><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/">Epson Robots Getting Started: Create a New Project in Epson RC+</a></li>



<li><a href="https://static.dmcinfo.com/wp-admin/post.php?post=43113&amp;action=edit">Epson RC+ Project Structure Explained: Files, Folders, and Flow</a></li>



<li><strong>Epson Robots Commissioning Tools and Workflows in RC+</strong></li>



<li><a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/">Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a></li>
</ol>
</div>



<h2 class="wp-block-heading" id="h-summary">Summary</h2>



<p class="wp-block-paragraph">In the third entry in this series, we will be going over some useful tools for commissioning a new Epson robot and troubleshooting programs. We will discuss how to configure the robot controller, operate the robot manually, teach and configure the points and coordinates required for the application, and highlight useful tools for troubleshooting and testing the robot program.</p>



<h2 class="wp-block-heading" id="h-system-configuration-defining-controller-behavior">System Configuration: Defining Controller Behavior</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph">The first step in commissioning an Epson robot is to configure the controller through the <strong>System Configuration</strong> menu. You can access this window by navigating to the toolbar and selecting <strong>Setup</strong>, then <strong>System Configuration</strong>. This area defines how the controller behaves at startup and establishes several foundational settings that impact safety, operability, and overall workflow during commissioning and production.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="533" height="191" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-1.png" alt="Epson RC+ Setup menu dropdown." class="has-border-color wp-image-43771" style="border-color:#eeeeee;aspect-ratio:2.717654557042702;width:500px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-1.png 533w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-1-300x108.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">When the <strong>System Configuration</strong> window opens, it defaults to the <strong>Startup</strong> tab. While this tab may seem simple, the selections you make here play a critical role in how the robot transitions from power-on to operation and how engineers interact with the system during early testing.</p>



<h3 class="wp-block-heading" id="h-startup">Startup</h3>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph">In the <strong>Startup</strong> tab, there are two primary setup modes, &#8216;Auto&#8217; and &#8216;Program&#8217;, as well as an option to require a password on startup.</p>



<p class="wp-block-paragraph">Selecting &#8216;Auto&#8217; means that when the robot is powered on, it will enter Auto mode and begin running its programs automatically. If you select &#8216;Program&#8217;, the robot will be stopped upon startup and wait for commands from the Epson RC+ 7.0 software. This setting is typically used in fully commissioned calls where the robot is integrated with external equipment like a PLC, safety system, or HMI.</p>



<p class="wp-block-paragraph">Select &#8216;Program&#8217; mode for initial commissioning. Only set the robot to &#8216;Auto&#8217; mode after teaching positions and thoroughly testing programs to avoid collisions or unexpected behavior.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="794" height="456" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-2.png" alt="Epson RC+ System Configuration window." class="wp-image-43772" style="border-style:none;border-width:0px;border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-2.png 794w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-2-300x172.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-2-768x441.png 768w" sizes="(max-width: 794px) 100vw, 794px" /></figure>
</div>
</div>



<h3 class="wp-block-heading" id="h-controller">Controller</h3>



<p class="wp-block-paragraph">After confirming your startup behavior in <strong>System Configuration</strong>, the next step is to focus on the <strong>Controller</strong> section of the project tree. This area is essentially the ‘hub’ for how the controller communicates with the outside world and interprets commands. During commissioning, many issues that appear to stem from the program (robot won’t start, IO won’t respond, remote start won’t work) trace back to controller settings.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border" style="margin-right:0"><img decoding="async" width="747" height="414" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-3.png" alt="Epson RC+ Controller menu." class="has-border-color wp-image-43778" style="border-color:#eeeeee;border-width:8px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-3.png 747w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-3-300x166.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph" style="padding-left:var(--wp--preset--spacing--40)">To access these settings, expand the <strong>Controller</strong> drop-down by clicking the ‘+’ immediately to the left of Controller. This opens a set of tabs that let you define network parameters, configure device control, set up multi-robot configurations, and map fieldbus bits used for remote program selection.</p>



<p class="wp-block-paragraph" style="padding-left:var(--wp--preset--spacing--40)">Spending a few moments reviewing these sections can help ensure your controller aligns with your cell architecture before you start troubleshooting motion, IO, or PLC handshakes.</p>



<p class="wp-block-paragraph" style="padding-left:var(--wp--preset--spacing--40)">Here is a quick summary of the important sections under <strong>Controller</strong>.</p>
</div>
</div>



<ul class="wp-block-list">
<li style="padding-bottom:var(--wp--preset--spacing--40)"><strong>Configuration Tab</strong>: This is where you will set the IP Address and Gateway. You can also select a control device from ‘Remote IO’ or ‘PC’. Selecting ‘Remote IO’ tells the robot to listen to the remote I/O, and selecting PC tells the robot to listen to commands from the Epson RC+ 7.0 software on the connected computer.</li>



<li style="padding-bottom:var(--wp--preset--spacing--40)"><strong>Robots Tab:</strong> In this tab, you can add or remove robots when you have multiple robots tied to a single controller. Press the ‘Add’ button on the right, and the following window will appear, where you can add the details of your robot.</li>



<li style="padding-bottom:var(--wp--preset--spacing--40)"><strong>Inputs/Outputs Tab</strong>: This tab lets you set the byte sizes of your inputs and outputs. For your Fieldbus I/O, depending on how you are communicating with your robot, you will need to configure the byte size here.</li>



<li style="padding-bottom:var(--wp--preset--spacing--40)"><strong>Remote Control Tab</strong>: Map your program control to bits in the fieldbus space using the ‘Remote Control Tab’. There are separate tabs for inputs and outputs.</li>
</ul>



<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="24" data-cb-speed="300" data-cb-navigation="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="5000" data-cb-pause-on-mouse-enter="true" data-cb-disable-on-interaction="true" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:2,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="741" height="414" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-4.png" alt="Epson RC+ Controller Configure tab." class="has-border-color wp-image-43779" style="border-color:#eeeeee;border-top-left-radius:2px;border-top-right-radius:2px;border-bottom-left-radius:2px;border-bottom-right-radius:2px;aspect-ratio:1.778511156947309;width:692px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-4.png 741w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-4-300x168.png 300w" sizes="(max-width: 741px) 100vw, 741px" /><figcaption class="wp-element-caption"><em><strong>Configuration Tab</strong></em></figcaption></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="765" height="434" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-6.png" alt="Epson RC+ Robots Tab." class="has-border-color wp-image-43782" style="border-color:#eeeeee;aspect-ratio:1.7522009877603608;width:650px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-6.png 765w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-6-300x170.png 300w" sizes="(max-width: 765px) 100vw, 765px" /><figcaption class="wp-element-caption"><strong><em>Robots Tab</em></strong></figcaption></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="609" height="516" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-5.png" alt="Epson RC+ 'Add a New Robot' pop-up window." class="has-border-color wp-image-43780" style="border-color:#eeeeee;aspect-ratio:1.180245344802307;object-fit:cover;width:502px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-5.png 609w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-5-300x254.png 300w" sizes="(max-width: 609px) 100vw, 609px" /><figcaption class="wp-element-caption"><strong><em>&#8216;</em></strong><em><strong>Add a New Robot&#8217; Dialog Box</strong></em></figcaption></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="768" height="434" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-7.png" alt="Epson RC+ Inputs/Outputs Tab" class="has-border-color wp-image-43783" style="border-color:#eeeeee;aspect-ratio:1.759009412017321;object-fit:cover;width:705px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-7.png 768w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-7-300x170.png 300w" sizes="(max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption"><strong><em>Inputs / Outputs Tab</em></strong></figcaption></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border is-style-default"><img decoding="async" width="780" height="451" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-8.png" alt="Epson RC+ System Configuration 'Remote Control' tab" class="has-border-color wp-image-43784" style="border-color:#eeeeee;border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;width:705px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-8.png 780w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-8-300x173.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-8-768x444.png 768w" sizes="(max-width: 780px) 100vw, 780px" /><figcaption class="wp-element-caption"><strong><em>Remote Control Tab</em></strong></figcaption></figure>
</div>
</div></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>



<h2 class="wp-block-heading" id="h-robot-manager-controlling-power-amp-movement" style="padding-top:var(--wp--preset--spacing--30)">Robot Manager: Controlling Power &amp; Movement</h2>



<p class="wp-block-paragraph">The robot manager is the primary interface for manually interacting with the robot from your PC. In the pop-up dialog, there are several tabs where you can control the robot&#8217;s power, move the robot, teach positions and coordinate systems, configure tools, set motion limits, and more. To access the robot manager, you need to first connect the robot to the internet. Then, click the <strong>robot arm icon</strong> in the toolbar to launch the window. From there, there are a number of features that allow you to manually control your robot&#8217;s motion.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-control-panel-tab">Control Panel Tab</h3>



<p class="wp-block-paragraph">This is the primary screen of the <strong>Robot Manager</strong>. Here you can view the status of the controller&#8217;s power and safety signals, turn the motors on or off, select your power mode, and clear any errors. In addition, you can free any axis if you want to be able to move it by hand. For 6-axis applications, you can control whether certain joints are locked or unlocked.</p>



<p class="wp-block-paragraph">The top row shows the selected robot, the local coordinate system, the tool number, and the external center point (ECP). When teaching points, be sure the correct values are selected, as the taught positions depend on them.</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="1518" height="1044" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-9-e1777390961187.png" alt="Epson RC+ Robot Manager window." class="wp-image-43801" style="border-style:none;border-width:0px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-9-e1777390961187.png 1518w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-9-e1777390961187-300x206.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-9-e1777390961187-1024x704.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-9-e1777390961187-768x528.png 768w" sizes="(max-width: 1518px) 100vw, 1518px" /></figure>
</div>
</div>



<h3 class="wp-block-heading" id="h-jog-amp-teach-tab">Jog &amp; Teach Tab</h3>



<p class="wp-block-paragraph">To manually move the robot and teach positions, navigate the <strong>Jog &amp; Teach</strong> tab. This feature is frequently used during commissioning and point setup, as it allows you to view the robot’s current position, control its motion, and save taught points.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="683" height="468" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11.png" alt="Epson RC+ Jog &amp; Teach settings interface." class="wp-image-43805" style="border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11.png 683w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11-300x206.png 300w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph">On the right side of the window, you can see the robot’s current position and arm orientation, along with controls for jog-distance and speed. Position data can be displayed using different coordinates, including World, Joint, or Pulse. World coordinates are the standard Cartesian values; Joint is the angle of each axis in the robot; and Pulse is the encoder reading.</p>



<p class="wp-block-paragraph">On the left side, you can jog the robot using the arrow buttons. The <strong>Mode </strong>dropdown lets you choose whether to jog along a linear path or control individual axes. To teach a point, first jog the robot to the desired location, then select the appropriate point file and name, and press &#8216;Teach&#8217; to save the position.</p>



<p class="wp-block-paragraph">To navigate to a previously taught position, select the <strong>Execute Motion</strong> tab.</p>
</div>
</div>



<p class="wp-block-paragraph">Available motion command options will vary based on the robot model you are using, but ’Go’ and ‘Move’ are the most basic. The ‘Go’ command will move your robot from its current position to the selected destination using a joint move, meaning that any combination of 1-6 robot joints could move at the same time. This type of movement will mostly be non-linear. The ‘Move’ command will move your robot linearly from its current position to the selected destination.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignright size-full has-custom-border"><img decoding="async" width="588" height="112" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11-1.png" alt="Epson RC+ Execution Motion window." class="has-border-color wp-image-43806" style="border-color:#eeeeee" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11-1.png 588w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-11-1-300x57.png 300w" sizes="(max-width: 588px) 100vw, 588px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="397" height="246" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-12.png" alt="Epson RC+ 'Go' command." class="has-border-color wp-image-43811" style="border-color:#eeeeee" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-12.png 397w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-12-300x186.png 300w" sizes="(max-width: 397px) 100vw, 397px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">After selecting the desired command and destination, press &#8216;Execute&#8217; to start the motion. While the robot is moving, a pop-up window will appear, showing which point it is moving to and providing a stop button that lets you halt its motion immediately if needed.</p>



<div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-points-tab">Points Tab</h3>



<p class="wp-block-paragraph">The <strong>Points</strong> tab displays all point files and taught positions stored on the robot. This view allows you to review, edit, and manage the positional data used by motion commands throughout the program. Each point includes X, Y, and Z values in millimeters and U, V, and W values in degrees.</p>



<p class="wp-block-paragraph">From this tab, you can manually adjust point values and save changes directly to the controller. Because points are referenced symbolically in the program, any updates made here automatically apply wherever the point is used, simplifying updates during commissioning and long-term maintenance.</p>
</div>



<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized" style="margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="690" height="475" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-13-e1777393213972.png" alt="Epson RC+ Robot Manager 'Points' tab" class="wp-image-43812" style="width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-13-e1777393213972.png 690w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-13-e1777393213972-300x207.png 300w" sizes="(max-width: 690px) 100vw, 690px" /></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="689" height="474" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-14.png" alt="Epson RC+ Robot Manager 'Locals' tab interface" class="wp-image-43814" style="aspect-ratio:1.453593563536975;object-fit:cover;width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-14.png 689w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-14-300x206.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-locals-tab">Locals Tab</h3>



<p class="wp-block-paragraph">A local coordinate system is a coordinate frame that is rotated relative to the robot’s default world coordinate system. Defining local coordinates can be useful when a robot repeatedly interacts with a specific area of a cell—especially if motion does not align cleanly with the world axes. It can also greatly simplify programming by allowing moves to be defined relative to a task rather than the global frame.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">To define local coordinate systems, navigate to the <strong>Locals</strong> tab. There is a <strong>Local Wizard</strong> that walks you through the process of defining a new local based on taught points. If you already know the desired origin and orientation, you can manually enter it into the table. Press &#8216;Apply&#8217; after using the wizard or manually adding values to save your changes to the robot.</p>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-tools-tab">Tools Tab</h3>



<p class="wp-block-paragraph">The <strong>Tools</strong> tab is very similar to the <strong>Locals</strong> tab. Here you can define coordinate systems for your end effector. A tool wizard can walk you through setting up a tool coordinate system, or you can manually enter a coordinate system in the table. Tools are useful when used with a device at the end of the robot that is not centered on the robot arm. When commanded to move to a position with a different tool selected, the robot will move so that the tool&#8217;s center is in the correct position, rather than the robot arm.</p>
</div>



<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized" style="margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="687" height="474" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-15.png" alt="Epson RC+ Robot Manager 'Tools' tab interface" class="wp-image-43815" style="aspect-ratio:1.4494088745585751;object-fit:cover;width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-15.png 687w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-15-300x207.png 300w" sizes="(max-width: 687px) 100vw, 687px" /></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="687" height="473" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-16.png" alt="Epson RC+ Robot Manager 'XYZ Limites' tab interface" class="wp-image-43816" style="aspect-ratio:1.4524752856098782;object-fit:cover;width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-16.png 687w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-16-300x207.png 300w" sizes="(max-width: 687px) 100vw, 687px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading">XYZ Limits Tab</h3>



<p class="wp-block-paragraph">In the <strong>XYZ Limits</strong> tab, you can set limits for the X, Y, and Z axes within which your robot is allowed to move. You will need to set this up when commissioning a robot for the first time. The ‘Read’ button at the bottom of the pop-up dialog will capture the current position of the selected axis limit.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">You can free all joints on your robot and move it by hand to the maximum and minimum positions to record these points. This can help quickly define the space your robot is allowed to move in. Alternatively, you can manually enter or modify any of the values.</p>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-range-tab">Range Tab</h3>



<p class="wp-block-paragraph">The next tab we will look at is the <strong>Range</strong> tab. Here you can define the limits for the encoder pulses for each joint. Similarly to the <strong>XYZ Limits</strong> tab, you can read the current robot’s position as the maximums or minimums for any joint. Joint limits differ from XYZ limits in that they monitor each robot axis rather than the tooling position.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="685" height="474" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-17.png" alt="Epson RC+ Robot Manager 'Range' tab values" class="wp-image-43857" style="width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-17.png 685w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-17-300x208.png 300w" sizes="(max-width: 685px) 100vw, 685px" /></figure>
</div>
</div>



<h3 class="wp-block-heading" id="h-home-config-tab">Home Config Tab</h3>



<p class="wp-block-paragraph">The last tab we will go over is <strong>Home Config</strong>. In this tab, you can set the home encoder positions for each of your joints. To set your desired joint home position in the left column <strong>Home Position</strong>, you can read the current position of a joint or manually enter its encoder value. In the right column under <strong>Home Order</strong>, you can send which order you would like each of the joints to home in. Leaving them all set to &#8216;Step 1&#8217; means they will all return home simultaneously.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">To test the home function, navigate to the <strong>Control Panel</strong> tab and click ‘Home’.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-25f67431 wp-block-columns-is-layout-flex" style="padding-bottom:var(--wp--preset--spacing--50)">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="780" height="543" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-18-1.png" alt="Epson RC+ Robot Manager 'Home Configuration' tab parameters" class="has-border-color wp-image-43864" style="border-color:#eeeeee" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-18-1.png 780w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-18-1-300x209.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-18-1-768x535.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="800" height="564" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-19-1-e1777410750543.png" alt="Epson RC+ Control Panel 'Home' button" class="has-border-color wp-image-43866" style="border-color:#eeeeee" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-19-1-e1777410750543.png 800w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-19-1-e1777410750543-300x212.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-19-1-e1777410750543-768x541.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>
</div>
</div>



<h2 class="wp-block-heading" id="h-testing-amp-troubleshooting-tools">Testing &amp; Troubleshooting Tools</h2>



<p class="wp-block-paragraph">Once the robot is configured and programs are written, effective testing and troubleshooting become critical to a successful commissioning process. Epson RC+ provides several built-in tools that allow you to test logic, monitor execution, and diagnose issues without repeatedly running the full application.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-command-window">Command Window</h3>



<p class="wp-block-paragraph">The next feature we&#8217;ll review is the <strong>Command Window</strong>. To access the program&#8217;s editable command window, select the <strong>white icon with a carrot or greater than sign (&gt;)</strong> in the main toolbar.</p>



<p class="wp-block-paragraph">The program&#8217;s <strong>Command Window</strong> will open, allowing you to execute any SPEL+ commands for testing. For example, if you wrote a custom function called ‘Motion’, you could execute that function by typing in ‘Call Motion()’ and pressing enter. For more information on SPEL+ commands, you can reference the help document found by accessing Help &gt; Manuals &gt; SPEL+ Language Reference.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40%">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="720" height="559" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-20-1.png" alt="Epson RC+ empty Command Window" class="wp-image-43874" style="width:400px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-20-1.png 720w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-20-1-300x233.png 300w" sizes="(max-width: 720px) 100vw, 720px" /></figure>
</div>
</div>



<h3 class="wp-block-heading" id="h-run-window">Run Window</h3>



<p class="wp-block-paragraph">The <strong>Run Window</strong> includes controls for running programs in the current project and can be accessed by clicking the <strong>grey-and-white square icon</strong> in the main toolbar. During commissioning, this tool gives engineers direct visibility into robot execution, allowing them to run programs, observe behavior in real time, and make targeted adjustments without leaving RC+. Built-in status feedback helps quickly identify pauses or faults, streamlining troubleshooting and reducing time to production.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40%">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="518" height="370" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-21.png" alt="Epson RC+ empty Run Window" class="wp-image-43873" style="width:400px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-21.png 518w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-21-300x214.png 300w" sizes="(max-width: 518px) 100vw, 518px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<p class="wp-block-paragraph">The image shows what the run window looks like when it is opened. The white area will display all outputs from your programs and any errors that occurred. You can run specific functions by selecting the function drop-down and the desired function. This is a great tool for testing smaller portions of your program, allowing you to debug your robot without running the entire program.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">If you have &#8216;Remote IO&#8217; selected as the control device in your controller configuration under system configuration, the &#8216;Enable Remote I/O&#8217; button will then wait for the program start command from the fieldbus input. If &#8216;Remote IO&#8217; is not selected as the control device, the button will say ‘Start’, which immediately executes the selected function.</p>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-i-o-monitor">I/O Monitor</h3>



<p class="wp-block-paragraph">The <strong>I/O Monitor</strong> provides real‑time visibility into all configured controller inputs and outputs, along with their current states. This tool is especially useful during commissioning and debugging, as it allows you to quickly verify whether signals are being received and set as expected. The <strong>I/O Monitor&#8217;s</strong> interface opens when you click the <strong>icon of circles arranged in a square.</strong></p>



<p class="wp-block-paragraph">From the <strong>I/O Monitor</strong>, you can confirm that the fieldbus and local I/O are mapped correctly and that inputs change state when external devices, such as sensors or PLCs, are actuated. This helps isolate whether an issue is related to wiring, I/O configuration, or program logic.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="754" height="622" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-22.png" alt="Epson RC+ I/O Monitor window" class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-43875" style="width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-22.png 754w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-22-300x247.png 300w" sizes="(max-width: 754px) 100vw, 754px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">Assigned I/O and their symbolic names can be viewed and managed in the <strong>I/O Label Editor</strong>, ensuring the values displayed in the monitor align with the labels used in your program. Using the <strong>I/O Monitor</strong> alongside the <strong>Run Window</strong> makes it easier to validate handshakes, troubleshoot start conditions, and confirm outputs are being driven correctly during program execution.</p>



<h3 class="wp-block-heading" id="h-task-manager">Task Manager</h3>



<p class="wp-block-paragraph">To access the <strong>Task Manager</strong>, click the <strong>icon with three documents</strong> layered over one another. After starting your robot, <strong>Task Manager</strong> is a useful place to keep track of which tasks are currently running, paused, or aborted. If a task is paused or waiting, it will show you which line it is waiting on.</p>



<p class="wp-block-paragraph">After starting your robot, the <span style="box-sizing: border-box; margin: 0px; padding: 0px;"><strong>Task Manager</strong>&nbsp;is a useful place to keep track of which tasks are currently running, paused, or&nbsp;</span>aborted. If a task is paused or waiting, it will show you which line it is waiting on.</p>



<figure class="wp-block-image aligncenter size-full has-custom-border" style="margin-bottom:var(--wp--preset--spacing--70)"><img decoding="async" width="952" height="406" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-23.png" alt="Epson RC+ Task Manager window" class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-43881" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-23.png 952w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-23-300x128.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-23-768x328.png 768w" sizes="(max-width: 952px) 100vw, 952px" /></figure>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-display-variables">Display Variables</h3>



<p class="wp-block-paragraph">While running your robot program, it is useful to monitor the current value of any variables you may have defined in your programs. This is especially important during commissioning, when you are verifying logic, tuning motion, and validating system behavior against real hardware. Monitoring variable values lets you confirm that inputs, calculations, and state changes occur as expected, making it easier to identify and correct issues early.</p>



<p class="wp-block-paragraph">You can do this in the <strong>Display Variables</strong> window. To access it, click ‘Run’ in the main toolbar and select ‘Display Variables’ from the drop-down. Here you can see your ‘Global’, ‘Preserved’, ‘Module’, and ‘Local’ variables, their data types, and current values.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="544" height="354" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-24.png" alt="Epson RC+ Display Variables window" class="has-border-color has-custom-light-gray-neutral-2-border-color wp-image-43919" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-24.png 544w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-24-300x195.png 300w" sizes="(max-width: 544px) 100vw, 544px" /></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img decoding="async" width="778" height="492" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-25.png" alt="Epson RC+ System History window" class="has-border-color wp-image-43918" style="border-color:#eeeeee;width:550px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-25.png 778w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-25-300x190.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-commissioning-image-25-768x486.png 768w" sizes="(max-width: 778px) 100vw, 778px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading" id="h-system-history">System History</h3>



<p class="wp-block-paragraph">One last useful tool for testing and troubleshooting is the <strong>System History</strong> window. This is a log of errors or events that have occurred on the robot controller and can be useful for troubleshooting the robot if it stops mid-run, especially if you are at a stage in your project where you are not always connected to the robot controller using RC+. To access this window, select ‘View’ from the toolbar and click ‘System History’.</p>
</div>
</div>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">All these tools can be used with the virtual controller, and I would suggest testing them in the simulated environment first. This allows you to familiarize yourself with the configuration changes, which robot is used, how to perform manual moves and operations, set up the various configurations through the robot manager, and ultimately test the robot program you have developed. Using these tools with the simulated controller will also help with the first-time commissioning of the actual robotic application.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Need help with robotics programming software?</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" id="420">Automation</a> and <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/robotics-engineering/" id="524">Robotics</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-9243fccf wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70);padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<h2 class="wp-block-heading alignwide has-text-align-left" id="h-other-blogs-on-this-topic">Other Blogs on this Topic</h2>



<div class="wp-block-cb-carousel-v2 alignwide cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-44526 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-simulation">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-5 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/" target="_self" >Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43715 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-6 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/" target="_self" >Epson Robots Commissioning Tools and Workflows in RC+</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43113 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Epson RC+ Files, Folders, and Flow" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-7 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/" target="_self" >Epson RC+ Project Structure Explained: Files, Folders, and Flow</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-16530 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-6-axis tag-epson-rc tag-epson-robots tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Creating a New Project in Epson RC+" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-8 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/" target="_self" >Epson Robots Getting Started: Creating a New Project in Epson RC+</a></h4>
</li></ul>

</div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/">Epson Robots Commissioning Tools and Workflows in RC+</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Epson RC+ Project Structure Explained: Files, Folders, and Flow</title>
		<link>https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/</link>
		
		<dc:creator><![CDATA[Will Todd]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 11:00:00 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Epson RC+]]></category>
		<category><![CDATA[Epson Robots]]></category>
		<category><![CDATA[Robotics]]></category>
		<category><![CDATA[SCARA]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=43113</guid>

					<description><![CDATA[<p>This blog is Part 2 of a multi-part series. Make sure to check out the other blogs on this topic: This article is the second in a series that explains the basics of creating a base project using Epson RC+, Epson&#8217;s software for developing and simulating an industrial robotic application. Epson offers a wide range [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/">Epson RC+ Project Structure Explained: Files, Folders, and Flow</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-container-core-group-is-layout-2a32d455 wp-block-group-is-layout-constrained" style="border-style:none;border-width:0px;border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;margin-top:0;margin-bottom:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0">
<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-bcadade0 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<p class="wp-block-paragraph">This blog is <strong>Part 2</strong> of a multi-part series. Make sure to check out the other blogs on this topic:</p>



<ol class="wp-block-list">
<li><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/">Epson Robots Getting Started: Create a New Project in Epson RC+</a></li>



<li><strong>Epson RC+ Project Structure Explained: Files, Folders, and Flow</strong></li>



<li><a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/">Epson Robots Commissioning Tools and Workflows in RC+</a></li>



<li><a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/">Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a></li>
</ol>
</div>
</div>



<p class="wp-block-paragraph" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:0">This article is the second in a series that explains the basics of creating a base project using Epson RC+, Epson&#8217;s software for developing and simulating an industrial robotic application. Epson offers a wide range of industrial robots for a variety of applications.</p>



<p class="wp-block-paragraph">The programming and configuration of the robots are done through the easy-to-use configuration software, Epson RC+, which offers many time-saving features and various add-on packages depending on the complexity of each application. We will cover the overall project structure, types of files, and how they all work together in the application.</p>



<h2 class="wp-block-heading" id="h-program-files">Program Files</h2>



<p class="wp-block-paragraph">This will contain all the logic for the robot application. You can define functions to call from within the robot program or leverage an external trigger, such as a PLC. When developing the robot application, you must have a function called “Main”. If this function is not defined, the compiler will throw an error. The main function is called when none of the 6 program bits are set. See the table below for the main functions that can be selected from the remote inputs.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="629" height="242" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-1.jpg" alt="6-bit binary selection system used to execute specific functions (Main through Main63)." class="wp-image-43182" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-1.jpg 629w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-1-300x115.jpg 300w" sizes="(max-width: 629px) 100vw, 629px" /></figure>



<p class="wp-block-paragraph">The entire robot program can be written in a single program file or across many.&nbsp; For organizational purposes, we generally like to separate functions into multiple programs for easier navigation, and based on which program tasks are executed.&nbsp;</p>



<h2 class="wp-block-heading" id="h-include-files">Include Files</h2>



<p class="wp-block-paragraph">Include files are generally used to define constants that can be used across the user program. To create an include file, right-click on “Include Files” in the project tree and select “New”. Fill out the dialog window as follows. We have added two constants for max parts and max speed, which can now be used in the robot program.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-098f8bcc wp-block-columns-is-layout-flex" style="padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="306" height="342" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-2.jpg" alt="Dialog box from Epson's software." class="wp-image-43183" style="aspect-ratio:0.8947808165766167;width:253px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-2.jpg 306w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-2-268x300.jpg 268w" sizes="(max-width: 306px) 100vw, 306px" /></figure>
</div>



<div class="wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="718" height="197" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-3.jpg" alt="Text file named Constants.inc open in a basic text editor." class="wp-image-43184" style="aspect-ratio:3.6447828451557767;width:747px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-3.jpg 718w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-3-300x82.jpg 300w" sizes="(max-width: 718px) 100vw, 718px" /></figure>
</div>
</div>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--30)">By putting all the constants into a single include file, we can use a single line at the top of the program file to give the functions access to use these constants. In the screenshot below, the first line contains an ‘include’ statement that references the constants file we just created. This allows the main function to use the defined constant values instead of hard-coded numbers.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="689" height="452" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-4-1.jpg" alt="SPEL+ used for Epson industrial robots." class="wp-image-43186" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-4-1.jpg 689w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-4-1-300x197.jpg 300w" sizes="(max-width: 689px) 100vw, 689px" /></figure>



<h2 class="wp-block-heading" id="h-point-files">Point Files</h2>



<p class="wp-block-paragraph">Point files are table-style views of all defined points for use in the robot program. The points can be manually adjusted from the programming environment, taught using robot manager, and assigned calculated values during program execution. Each point file contains points numbered from 0 to 999, and there can be multiple point files per robot. There can even be multiple robots per controller, depending on the application requirements.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--20)">In this example, we have simply added the two points ‘ptStart’ and ‘ptEnd’. The point files contain data for the most complicated examples, but depending on the application, some are not used. This example uses a SCARA robot, which only uses the X/Y/Z/U positions, since it is a 4-axis robot. Also included in this view is the Local coordinate system used and which Hand (Righty/Lefty) configuration the robot is in for that point.</p>



<figure class="wp-block-image aligncenter size-full is-resized" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--70)"><img decoding="async" width="1717" height="321" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5.jpg" alt="Industrial automation or CAD software, defining coordinates and orientations for a robotic arm." class="wp-image-43188" style="width:1035px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5.jpg 1717w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5-300x56.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5-1024x191.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5-768x144.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-5-1536x287.jpg 1536w" sizes="(max-width: 1717px) 100vw, 1717px" /></figure>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">In the program, the points can be used symbolically as shown below. The Go instruction is a move command for the robot, and the operator can simply use the point label defined in the Points file to access the robot&#8217;s positional data.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="469" height="148" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-6.jpg" alt="Code snippet describes a simple sequence for controlling a robotic arm or automated system using SPEL+" class="wp-image-43200" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-6.jpg 469w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-6-300x95.jpg 300w" sizes="(max-width: 469px) 100vw, 469px" /></figure>



<h2 class="wp-block-heading" id="h-io-labels">IO Labels</h2>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">IO labels are used to assign symbolic names to integer values that represent input and output memory locations. These are useful when performing Input and Output mapping in the user program, rather than leveraging the hardcoded bit/byte/word values in the IO space. Below, we define 2 input bits and 2 output bits to simulate reading and writing to digital IO. The standard I/O is used for local IO on the robot, such as devices on the end-of-arm tooling.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignright size-full is-resized" style="margin-bottom:var(--wp--preset--spacing--40)"><img decoding="async" width="401" height="196" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-7.jpg" alt="Configuration screen for PLC I/O mapping." class="wp-image-43199" style="aspect-ratio:2.046017161515681;width:393px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-7.jpg 401w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-7-300x147.jpg 300w" sizes="(max-width: 401px) 100vw, 401px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image alignleft size-full is-resized"><img decoding="async" width="408" height="207" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-8.jpg" alt="I/O Configuration interface for a robot controller such as ABB or FANUC." class="wp-image-43201" style="aspect-ratio:1.9711006522995624;width:375px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-8.jpg 408w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-8-300x152.jpg 300w" sizes="(max-width: 408px) 100vw, 408px" /></figure>
</div>
</div>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--30)">To use these labels in the program, the user must use the proper input and output functions. Below is an example of using the Sw() function to read the status of the input bits and the On/Off functions to assign the output bit value. Notice how the IO Labels are used with these functions to make the logic more readable.</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="368" height="330" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-9.jpg" alt="Function handling the synchronization between logical program variables and physical input/output (I/O) hardware" class="wp-image-43202" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-9.jpg 368w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-9-300x269.jpg 300w" sizes="(max-width: 368px) 100vw, 368px" /></figure>



<h2 class="wp-block-heading" id="h-user-errors" style="padding-top:var(--wp--preset--spacing--30)">User Errors</h2>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--30)">User errors define an error space for the user to create custom error messages. The error codes reserved for this are from 8000 to 8999. When using these error messages, we can communicate the issue to an operator via the message field. This message will appear in the Status window when an error occurs in the program logic. This error code can also be used to communicate with the PLC controlling it, enabling easier diagnostics when the robot is not performing properly. A good example of this is communicating issues with tooling actuation controlled locally by the robot controller, even though the robot is part of a larger automation cell.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="534" height="193" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-10.jpg" alt="Software interface titled &quot;User Errors,&quot; which lists specific error codes, labels, and messages, currently highlighting error 8002." class="wp-image-43203" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-10.jpg 534w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-10-300x108.jpg 300w" sizes="(max-width: 534px) 100vw, 534px" /></figure>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--20)">This example below shows the Error function used with the ‘ToolingError’ User Error we just created. When the Function fcVacuum_ON is called from elsewhere in the user program, it turns on the vacuum gripper&#8217;s output and waits for 2 seconds for the vacuum switch input to turn on. The TW value will be true if the 2-second timeout is reached, which is why the Error is thrown within the if statement in this example.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="517" height="255" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-11.jpg" alt="A function written in Epson RC+ (SPEL+) language, used for controlling a robotic vacuum gripper." class="wp-image-43204" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-11.jpg 517w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-11-300x148.jpg 300w" sizes="(max-width: 517px) 100vw, 517px" /></figure>



<h2 class="wp-block-heading" id="h-tasks" style="padding-top:var(--wp--preset--spacing--30)">Tasks</h2>



<p class="wp-block-paragraph">Tasks are useful for executing the program on different threads within the robot controller&#8217;s CPU.&nbsp; This allows the robot controller to process different pieces of logic simultaneously.&nbsp;The most useful example of this is having logic that performs Input and Output mapping in a separate task from the logic that controls the robot motion or tooling actuation. It is often desired to keep the functions used to read and write to IO running all the time, but to have the motion commands and functional logic in a task that can be paused or aborted during an Emergency Stop.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">The example below shows how to start the IO monitoring function and motion logic in separate tasks. To start a new task, the ‘xqt’ instruction is used with the function that starts in the new task, and the task behavior when a Pause or Emergency Stop is issued. The IO function is set up to continuously run on Emergency Stop, where the motion logic function is set to Normal, which will respond normally to a Pause or Emergency Stop command.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-bottom:var(--wp--preset--spacing--40)"><img decoding="async" width="570" height="153" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-12.jpg" alt="Code written in SPEL+" class="wp-image-43205" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-12.jpg 570w, https://static.dmcinfo.com/wp-content/uploads/2026/04/epson-robots-getting-started-guide-image-12-300x81.jpg 300w" sizes="(max-width: 570px) 100vw, 570px" /></figure>



<h2 class="wp-block-heading" id="h-conclusion" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:0">Conclusion</h2>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">Now you have a basic understanding of how to organize an Epson RC+ project, and you have all the tools needed to get started creating your own application. The most important starting point is to create a ‘Main’ function in a program file and define a few robot points to use in the program. Then I would suggest adding constants with include files and user errors for better troubleshooting. Finally, you could start adding different task executions for different functions. Understanding how all these components interact is vital to developing higher-quality robot programs.</p>



<div class="wp-block-group alignfull wp-elements-9 has-global-padding is-layout-constrained wp-container-core-group-is-layout-b68f1877 wp-block-group-is-layout-constrained" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-78e40fa4 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:80%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Have an upcoming project? DMC can help you take the next step.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" type="page" id="420">Automation</a> and <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/robotics-engineering/" type="page" id="524">Robotics</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%">
<div class="wp-block-buttons is-horizontal is-content-justification-right is-layout-flex wp-container-core-buttons-is-layout-a048f62a wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
</div>



<div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-9243fccf wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70);padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<h2 class="wp-block-heading alignwide has-text-align-left" id="h-other-blogs-on-this-topic">Other Blogs on this Topic</h2>



<div class="wp-block-cb-carousel-v2 alignwide cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-44526 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-simulation">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/epson-rc-getting-started-robot-simulator-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-10 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/44526/epson-rc-plus-robot-simulator-setup-testing-and-debugging/" target="_self" >Epson RC+ 7.0 Robot Simulator: Setup, Testing, and Debugging</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43715 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/commissioning-epson-robots-tools-checks-workflows-hero-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-11 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43715/epson-robots-rc-commissioning-tools/" target="_self" >Epson Robots Commissioning Tools and Workflows in RC+</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43113 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-epson-rc tag-epson-robots tag-robotics tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Epson RC+ Files, Folders, and Flow" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/Epson-RC-Files-Folders-Flow-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-12 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/" target="_self" >Epson RC+ Project Structure Explained: Files, Folders, and Flow</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-16530 post type-post status-publish format-standard has-post-thumbnail hentry category-manufacturing-automation-intelligence tag-6-axis tag-epson-rc tag-epson-robots tag-scara">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1156" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Creating a New Project in Epson RC+" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC.jpg 1156w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-300x130.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-1024x443.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2024/03/Creating-New-Project-in-Epson-RC-768x332.jpg 768w" sizes="(max-width: 1156px) 100vw, 1156px" /></figure>

<h4 class="has-link-color wp-elements-13 wp-block-post-title"><a href="https://static.dmcinfo.com/blog/16530/epson-robots-getting-started-guide-part-1-creating-a-new-project/" target="_self" >Epson Robots Getting Started: Creating a New Project in Epson RC+</a></h4>
</li></ul>

</div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/43113/epson-robots-rc-plus-project-structure/">Epson RC+ Project Structure Explained: Files, Folders, and Flow</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Top Five Fanuc HandlingPRO Tips </title>
		<link>https://static.dmcinfo.com/blog/19261/top-five-fanuc-handlingpro-tips/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Fri, 25 Jun 2021 11:56:29 +0000</pubDate>
				<category><![CDATA[Motion Control]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19261/top-five-fanuc-handlingpro-tips/</guid>

					<description><![CDATA[<p>FANUC HandlingPRO is great for visualizing tool paths and planning installation locations. It allows you to import computer-aided design (CAD) models and even run simulated robot programs. This is especially helpful for avoiding potential interference issues in tight environments. &#160; Here are my top five&#160;tools and suggestions to get you started with HandlingPRO:&#160; Joint Jog Tool This [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19261/top-five-fanuc-handlingpro-tips/">Top Five Fanuc HandlingPRO Tips </a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">FANUC HandlingPRO is great for visualizing tool paths and planning installation locations. It allows you to import computer-aided design (CAD) models and even run simulated robot programs. This is especially helpful for avoiding potential interference issues in tight environments. &nbsp;</p>

<p class="wp-block-paragraph">Here are my top five&nbsp;tools and suggestions to get you started with HandlingPRO:&nbsp;</p>

<ul class="wp-block-list">
 <li style="line-height:38px;font-size:30px"><a href="#Joint Jog Tool">Joint Jog Tool</a></li>
 <li style="line-height:38px;font-size:30px"><a href="#Fine Joint Position Control">Fine Joint Position Control</a></li>
 <li style="line-height:38px;font-size:30px"><a href="#Change Views">Change Views</a></li>
 <li style="line-height:38px;font-size:30px"><a href="#Move to Toolbar">Move to Toolbar</a></li>
 <li style="line-height:38px;font-size:30px"><a href="#Fanuc Tutorials">Fanuc Tutorials</a></li>
</ul>

<h2 class="wp-block-heading"><a id="Joint Jog Tool" name="Joint Jog Tool"></a>Joint Jog Tool</h2>

<p class="wp-block-paragraph">This tool gives you handles that you can use to move the robot joints, but more importantly, it shows the limits of the robotic arm movements. Sometimes, it&rsquo;s difficult to understand which joint is at its maximum and is causing you to reach a position limit.   &nbsp;</p>

<p class="wp-block-paragraph"><img decoding="async" alt="Fanuc Joint Jog Tool" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-1.png"  /><br />
<br />
To enable this tool, navigate to <strong>Robot &gt; Show Joint Jog Tool. </strong>&nbsp;&nbsp;</p>

<p class="wp-block-paragraph"> &nbsp;<img decoding="async" alt="Robot &gt; Show Joint Jog Tool" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-2.png"  /></p>

<h2 class="wp-block-heading"><a id="Fine Joint Position Control" name="Fine Joint Position Control"></a>Fine Joint Position Control</h2>

<p class="wp-block-paragraph">Moving the robot arm around with the joint jog tool is great for getting a broad understanding of the robot movement. If you want to dial in the movements to the millimeter, you should use the teach pendant. &nbsp; &nbsp;</p>

<p class="wp-block-paragraph">To do so you should click the <strong>position </strong>button on the bottom right half of the screen. &nbsp;</p>

<p class="wp-block-paragraph"><img decoding="async" alt="Fine Joint Position Control button indication" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-3.png"  />&nbsp;</p>

<p class="wp-block-paragraph">Next, enable the teach pendant by clicking the <strong>ON/OFF</strong> switch on the left so that it&apos;s in the <strong>ON </strong>position. &nbsp;</p>

<p class="wp-block-paragraph"> &nbsp;<img decoding="async" alt="Fine Joint Position Control ON indication" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-4_1.png"  /></p>

<p class="wp-block-paragraph"><em>Note: The teach pendant-enabled switch will turn off when testing your programs and inhibits many of the editing tools, make sure that this is <strong>ON </strong>whenever developing on the teach pendant.</em>  &nbsp;</p>

<p class="wp-block-paragraph">Now that the teach pendant is on, you can either jog the robot with reference to the tool tip in the XYZ plane (or XYZ angles) using the <strong>blue button</strong> on the right of the teach pendant, or you can press the <strong>REPRE</strong> button on the bottom right to switch to the second mode (Joint Position Control). In this mode,&nbsp;you can jog each one of the individual joints by, again, using the<strong> </strong>blue<strong> </strong>buttons on the right of the teach pendant. &nbsp;</p>

<p class="wp-block-paragraph"> &nbsp;<img decoding="async" alt="Fine Joint Position Control jogging individual joints 1 and 2" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-5_1.png"  /></p>

<h2 class="wp-block-heading"><a id="Change Views" name="Change Views"></a>Change Views</h2>

<p class="wp-block-paragraph">You can change your rotational axis by left-clicking anything in the window and can even select different surfaces of an object. Right-click to then rotate around that. &nbsp;</p>

<h2 class="wp-block-heading"><a id="Move to Toolbar" name="Move to Toolbar"></a>Move to Toolbar</h2>

<p class="wp-block-paragraph">With this toolbar, you get access to a bunch of helpful tools such as<strong> move to surface</strong> or <strong>move to points </strong>that you have set up in your program.&nbsp;&nbsp;</p>

<p class="wp-block-paragraph"> &nbsp;<img decoding="async" alt="Move To Tool Bar " src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-6.png"  /></p>

<p class="wp-block-paragraph">To enable the <strong>move to toolbar</strong>, click this button: &nbsp;&nbsp;</p>

<p class="wp-block-paragraph"><img decoding="async" alt="Move To Toolbar button indicator" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fanuc-handlingpro-tips-7.png"  /> &nbsp;</p>

<h2 class="wp-block-heading"><a id="Fanuc Tutorials" name="Fanuc Tutorials"></a>Fanuc Tutorials</h2>

<p class="wp-block-paragraph">Lastly, Fanuc includes some helpful <a href="https://www.fanucamerica.com/support/training/robot/elearn" target="_blank">eLearn Training</a> through tutorials. Some of these are built&nbsp;into the Help documentation and you can find them under the help tab.  &nbsp;</p>

<p class="wp-block-paragraph"><strong>Learn more about DMC&rsquo;s <a href="/services/manufacturing-automation-and-intelligence/robotics">Robotic Integration and Automation</a> and <a href="/contact">contact us</a>&nbsp;today to get started on your next project. &nbsp;</strong></p>

<p class="wp-block-paragraph">&nbsp;</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19261/top-five-fanuc-handlingpro-tips/">Top Five Fanuc HandlingPRO Tips </a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Implementing Custom Link Kinematics in Energid’s Actin SDK</title>
		<link>https://static.dmcinfo.com/blog/22369/implementing-custom-link-kinematics-in-energids-actin-sdk/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Fri, 14 Dec 2018 15:47:27 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22369/implementing-custom-link-kinematics-in-energids-actin-sdk/</guid>

					<description><![CDATA[<p>Actin SDK from Energid, now Universal Robotics, is a C++ robotic control toolkit that can be used to model and simulate almost any type of manipulator. Users can define a robotic system, specify tasks and constraints (such as dynamic collision avoidance), and the Actin system will determine the necessary joint motions. One of Actin’s advantages [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22369/implementing-custom-link-kinematics-in-energids-actin-sdk/">Implementing Custom Link Kinematics in Energid’s Actin SDK</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Actin SDK from Energid, now Universal Robotics, is a C++ robotic control toolkit that can be used to model and simulate almost any type of manipulator. Users can define a robotic system, specify tasks and constraints (such as dynamic collision avoidance), and the Actin system will determine the necessary joint motions.</p>



<p class="wp-block-paragraph">One of Actin’s advantages is its compatibility with many different types of robots. One feature I found particularly useful when using the SDK to control a non-traditional robotic device was the ability to define custom link kinematics. While Actin has standard link kinematics (such as prismatic or rotational) implemented, my task required an oval track joint where the robot would travel along an oval-shaped track. Fortunately, the Actin SDK provides a general base class, <i>EcLinkKinematics</i>, that can be used to implement custom link kinematics.</p>



<p class="wp-block-paragraph"><strong>In this blog post, I will demonstrate how to use <i>EcLinkKinematics</i> by implementing a circle track joint class.</strong></p>



<h2 id="h-the-base-class-eclinkkinematics" class="wp-block-heading">The Base Class, <i>EcLinkKinematics</i></h2>



<p class="wp-block-paragraph">A custom link kinematic class is derived from Actin’s base class <i>EcLinkKinematics</i>, which can support any definable joint type with 1 degree of freedom.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef ecLinkKinematics_H_
#define ecLinkKinematics_H_
//------------------------------------------------------------------------------
// Copyright (c) 2003-2013 Energid Technologies. All rights reserved.
//
/// @file ecLinkKinematics.h
/// @class EcLinkKinematics
/// @brief Holds a description of a base class for link motion.
//
//------------------------------------------------------------------------------
#include &lt;actinCore/actinCore_config.h>  // Required to be first header.
#include &lt;xml/ecBaseExpTreeElement.h>
#include &lt;foundCommon/ecCoordSysXForm.h>
#include &lt;foundCommon/ecGeneralMotion.h>

// forward declarations
class EcArticulatedBodyDynamics;
class EcArticulatedBodyInertia;
class EcGeneralForce;
class EcJointActuator;

/// Holds a description of a base class for link motion. It supports general joint types 
/// with one degree of freedom.
class EC_ACTINCORE_MANIPULATOR_DECL EcLinkKinematics : public EcBaseExpressionTreeElement
{
public:
   /// unit type enumeration
   enum {LINEAR, ANGULAR, OTHER};

   /// default constructor - should not be used
   EcLinkKinematics ();

   /// destructor
   virtual ~EcLinkKinematics ();

   /// copy constructor
   EcLinkKinematics (const EcLinkKinematics&amp; orig);

   /// assignment operator
   EcLinkKinematics&amp; operator= (const EcLinkKinematics&amp; orig);

   /// equality operator
   EcBoolean operator== (const EcLinkKinematics&amp; orig) const;

   /// register components in this class
   virtual void registerComponents ();

   /// test for approximate equality
   virtual EcBoolean approxEq (const EcLinkKinematics&amp; dh2, EcReal tol) const;

   /// kinematics functions

	/// get Primary Frame, which is the primary frame for the link represented in the
	/// link's DH frame

   /**
	\return The primary frame for this link. 
	This frame is used to specify physical extent, mass properties, and end effectors.
   */
   virtual const EcCoordinateSystemTransformation&amp; primaryFrame () const;

   /// get Primary Frame Inverse
   virtual const EcCoordinateSystemTransformation&amp; primaryFrameInverse () const;

   /// set Primary Frame
   virtual void setPrimaryFrame (const EcCoordinateSystemTransformation&amp; value);

   /// calculate transformation
   /**
   \param&#91;in&#93; jointValue The joint value used to calculate the link transformation.
   \return The link transformation at jointValue.
   */
   virtual const EcCoordinateSystemTransformation&amp; calculateTransform
      (
      EcReal jointValue
      ) const=0;

   /// transform an inboard transformation to the link's frame
   /**
   \param&#91;in,out&#93; xform The output transformation which is
	xform*calculateTransform(jointValue).
   \param&#91;in&#93; jointValue The joint value used to calculate the transformation.
   */
   virtual void transformBy
      (
      EcCoordinateSystemTransformation&amp; xform,
      EcReal jointValue
      ) const=0;

   ///  get the general motion of the frame (locally represented).
   /**
	The default frame velocity calculation. 
	The velocity is the relative speed of the current frame to the parent frame
	represented in the current frame.  The default method will do a differentiation of
	the transformation, which is not as accurate if the close form solution of the frame
	velocity can be implemented in the child class.
   \param&#91;in&#93; jointValue The joint value.
   \param&#91;in&#93; jointVelocity The joint velocity.
   */
   virtual const EcGeneralMotion&amp; calculateVelocity
      (
      EcReal jointValue,
      EcReal jointVelocity
      ) const;

   ///  get the general acceleration of the frame (locally represented).
   /**
	The default frame velocity calculation. The acceleration is the relative acceleration
	of the current frame to the parent frame represented in the current frame.  The
	default method will do a differentiation of the velocity, which is not as accurate if
	the close form solution of the frame acceleration can be implemented in the child
	class.
   \param&#91;in&#93; jointValue The joint value.
   \param&#91;in&#93; jointVelocity The joint velocity.
   \param&#91;in&#93; jointAcceleration The joint acceleration.
   */
   virtual const EcGeneralAcceleration&amp; calculateAcceleration
      (
      EcReal jointValue,
      EcReal jointVelocity,
      EcReal jointAcceleration
      ) const;

   /// get the torque required to produce a unit acceleration of an
   /// articulated rigid body
   /**
   \param&#91;in&#93; jointValue The joint value.
   \param&#91;in&#93; inertia The articulated body inertia attached to the link.
   \return The torque required to produce a unit acceleration.
   */
   virtual EcReal unitAccelerationTorque
      (
      EcReal jointValue,
      const EcArticulatedBodyInertia&amp; inertia
      ) const;

   /// get the torque required to exert the specified general force
   /**
   \param&#91;in&#93; jointValue The joint value.
   \param&#91;in&#93; exertedGeneralForce The desired general force.
   \return The torque required to exert the desired force.
   */
   virtual EcReal torqueRequiredToExert
      (
      EcReal jointValue,
      const EcGeneralForce&amp; exertedGeneralForce
      ) const;

   /// compute an upper-bound distance between this DH
   /// and the parent
   virtual EcReal upperBoundDhFrameDistance
      (
      const EcJointActuator&amp; jointActuator
      )const=0;

   /// add child arbd to parent's arbd
   virtual EcBoolean addChildArbdToParent
      (
      EcArticulatedBodyDynamics&amp; parentArbd,
      const EcArticulatedBodyDynamics&amp; childArbd,
      const EcReal jointValue,
      const EcReal jointTorque,
      const EcReal effectiveMotorInertia
      ) const;

   /// scale the kinematics by the specified distance-scale value
   /// (scaleFactor=1.0 does not change the object)
   virtual void scaleBy (EcReal scaleFactor)=0;

   /// transform this by a general coordinate system transformation.  This
   /// transformation is inserted before the link placement.  If the
   /// kinematics class has a precursor P, the P=XForm*P;
   virtual void transformBy (const EcCoordinateSystemTransformation&amp; xform)=0;

   /// return the scale factor for the joint parameter (=1 for
   /// a distance-based parameter, 0 for non-distance-based)
   virtual EcReal jointParameterScalability ()const=0;

   /// change the inboard frame by an offset.
   /// This is to account for uncertainty in link measurements, both linear and angular.
   /// If offset is identity, then this does nothing.
   virtual void changeInboardFrameBy (const EcCoordinateSystemTransformation&amp; offset)=0;

   /// return the unit type of the link kinematics (joint).
   virtual EcU32 unitType () const=0;

protected:

   /// the primary frame for the link represented in the link's DH frame
   EcCoordinateSystemTransformation m_PrimaryFrame;

   /// non-XML data below

   /// the inverse of the primary frame for the link represented in the link's DH frame
   /// this is stored for easy access
   EcCoordinateSystemTransformation m_PrimaryFrameInverse;

   /// a value for the transformation
   mutable EcCoordinateSystemTransformation m_FrameTransform;

   /// a value for the frame velocity
   mutable EcGeneralMotion m_FrameVelocity;

   /// a value for the frame Acceleration
   mutable EcGeneralAcceleration m_FrameAcceleration;

   // temporary variables for speed
   mutable EcGeneralMotion m_GMotion0;    /// First utility EcGeneralMotion
   mutable EcGeneralMotion m_GMotion1;    /// Second utility EcGeneralMotion
   mutable EcGeneralMotion m_GMotion2;    /// Third utility EcGeneralMotion
   /// First utility EcCoordinateSystemTransformation
   mutable EcCoordinateSystemTransformation m_XForm0;
      /// Second utility EcCoordinateSystemTransformation
   mutable EcCoordinateSystemTransformation m_XForm1;
};

#endif // ecLinkKinematics_H_</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">#ifndef</span><span style="color: #569CD6"> ecLinkKinematics_H_</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> ecLinkKinematics_H_</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Copyright (c) 2003-2013 Energid Technologies. All rights reserved.</span></span>
<span class="line"><span style="color: #6A9955">//</span></span>
<span class="line"><span style="color: #6A9955">/// </span><span style="color: #569CD6">@file</span><span style="color: #6A9955"> ecLinkKinematics.h</span></span>
<span class="line"><span style="color: #6A9955">/// </span><span style="color: #569CD6">@class</span><span style="color: #6A9955"> EcLinkKinematics</span></span>
<span class="line"><span style="color: #6A9955">/// </span><span style="color: #569CD6">@brief</span><span style="color: #6A9955"> Holds a description of a base class for link motion.</span></span>
<span class="line"><span style="color: #6A9955">//</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;actinCore/actinCore_config.h&gt;</span><span style="color: #569CD6">  </span><span style="color: #6A9955">// Required to be first header.</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;xml/ecBaseExpTreeElement.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;foundCommon/ecCoordSysXForm.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;foundCommon/ecGeneralMotion.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// forward declarations</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcArticulatedBodyDynamics</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcArticulatedBodyInertia</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcGeneralForce</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcJointActuator</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/// Holds a description of a base class for link motion. It supports general joint types </span></span>
<span class="line"><span style="color: #6A9955">/// with one degree of freedom.</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> EC_ACTINCORE_MANIPULATOR_DECL </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4"> : </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBaseExpressionTreeElement</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #569CD6">public:</span></span>
<span class="line"><span style="color: #6A9955">   /// unit type enumeration</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">enum</span><span style="color: #D4D4D4"> {</span><span style="color: #4FC1FF">LINEAR</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">ANGULAR</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">OTHER</span><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// default constructor - should not be used</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #DCDCAA">EcLinkKinematics</span><span style="color: #D4D4D4"> ();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// destructor</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> ~</span><span style="color: #DCDCAA">EcLinkKinematics</span><span style="color: #D4D4D4"> ();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// copy constructor</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #DCDCAA">EcLinkKinematics</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcLinkKinematics&amp; orig);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// assignment operator</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">operator=</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">orig</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// equality operator</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">operator==</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">orig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// register components in this class</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4"> ();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// test for approximate equality</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">approxEq</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dh2</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tol</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// kinematics functions</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">	/// get Primary Frame, which is the primary frame for the link represented in the</span></span>
<span class="line"><span style="color: #6A9955">	/// link&apos;s DH frame</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">	</span><span style="color: #569CD6">\return</span><span style="color: #6A9955"> The primary frame for this link. </span></span>
<span class="line"><span style="color: #6A9955">	This frame is used to specify physical extent, mass properties, and end effectors.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">primaryFrame</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// get Primary Frame Inverse</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">primaryFrameInverse</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// set Primary Frame</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setPrimaryFrame</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// calculate transformation</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value used to calculate the link transformation.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\return</span><span style="color: #6A9955"> The link transformation at jointValue.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation&amp; calculateTransform</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// transform an inboard transformation to the link&apos;s frame</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">,</span><span style="color: #569CD6">out</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">xform</span><span style="color: #6A9955"> The output transformation which is</span></span>
<span class="line"><span style="color: #6A9955">	xform*calculateTransform(jointValue).</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value used to calculate the transformation.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> transformBy</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcCoordinateSystemTransformation&amp; xform,</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   ///  get the general motion of the frame (locally represented).</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">	The default frame velocity calculation. </span></span>
<span class="line"><span style="color: #6A9955">	The velocity is the relative speed of the current frame to the parent frame</span></span>
<span class="line"><span style="color: #6A9955">	represented in the current frame.  The default method will do a differentiation of</span></span>
<span class="line"><span style="color: #6A9955">	the transformation, which is not as accurate if the close form solution of the frame</span></span>
<span class="line"><span style="color: #6A9955">	velocity can be implemented in the child class.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointVelocity</span><span style="color: #6A9955"> The joint velocity.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralMotion&amp; calculateVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   ///  get the general acceleration of the frame (locally represented).</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">	The default frame velocity calculation. The acceleration is the relative acceleration</span></span>
<span class="line"><span style="color: #6A9955">	of the current frame to the parent frame represented in the current frame.  The</span></span>
<span class="line"><span style="color: #6A9955">	default method will do a differentiation of the velocity, which is not as accurate if</span></span>
<span class="line"><span style="color: #6A9955">	the close form solution of the frame acceleration can be implemented in the child</span></span>
<span class="line"><span style="color: #6A9955">	class.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointVelocity</span><span style="color: #6A9955"> The joint velocity.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointAcceleration</span><span style="color: #6A9955"> The joint acceleration.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralAcceleration&amp; calculateAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointVelocity,</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// get the torque required to produce a unit acceleration of an</span></span>
<span class="line"><span style="color: #6A9955">   /// articulated rigid body</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">inertia</span><span style="color: #6A9955"> The articulated body inertia attached to the link.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\return</span><span style="color: #6A9955"> The torque required to produce a unit acceleration.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> EcReal unitAccelerationTorque</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcArticulatedBodyInertia&amp; inertia</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// get the torque required to exert the specified general force</span></span>
<span class="line"><span style="color: #6A9955">   /**</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">jointValue</span><span style="color: #6A9955"> The joint value.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\param</span><span style="color: #6A9955">&#91;</span><span style="color: #569CD6">in</span><span style="color: #6A9955">&#93; </span><span style="color: #9CDCFE">exertedGeneralForce</span><span style="color: #6A9955"> The desired general force.</span></span>
<span class="line"><span style="color: #6A9955">   </span><span style="color: #569CD6">\return</span><span style="color: #6A9955"> The torque required to exert the desired force.</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> EcReal torqueRequiredToExert</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralForce&amp; exertedGeneralForce</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// compute an upper-bound distance between this DH</span></span>
<span class="line"><span style="color: #6A9955">   /// and the parent</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> EcReal upperBoundDhFrameDistance</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcJointActuator&amp; jointActuator</span></span>
<span class="line"><span style="color: #D4D4D4">      )</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// add child arbd to parent&apos;s arbd</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> EcBoolean addChildArbdToParent</span></span>
<span class="line"><span style="color: #D4D4D4">      (</span></span>
<span class="line"><span style="color: #D4D4D4">      EcArticulatedBodyDynamics&amp; parentArbd,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcArticulatedBodyDynamics&amp; childArbd,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal jointTorque,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal effectiveMotorInertia</span></span>
<span class="line"><span style="color: #D4D4D4">      ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// scale the kinematics by the specified distance-scale value</span></span>
<span class="line"><span style="color: #6A9955">   /// (scaleFactor=1.0 does not change the object)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">scaleBy</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">scaleFactor</span><span style="color: #D4D4D4">)=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// transform this by a general coordinate system transformation.  This</span></span>
<span class="line"><span style="color: #6A9955">   /// transformation is inserted before the link placement.  If the</span></span>
<span class="line"><span style="color: #6A9955">   /// kinematics class has a precursor P, the P=XForm*P;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">)=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// return the scale factor for the joint parameter (=1 for</span></span>
<span class="line"><span style="color: #6A9955">   /// a distance-based parameter, 0 for non-distance-based)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">jointParameterScalability</span><span style="color: #D4D4D4"> ()</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// change the inboard frame by an offset.</span></span>
<span class="line"><span style="color: #6A9955">   /// This is to account for uncertainty in link measurements, both linear and angular.</span></span>
<span class="line"><span style="color: #6A9955">   /// If offset is identity, then this does nothing.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">changeInboardFrameBy</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">)=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// return the unit type of the link kinematics (joint).</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcU32</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">unitType</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">protected:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// the primary frame for the link represented in the link&apos;s DH frame</span></span>
<span class="line"><span style="color: #D4D4D4">   EcCoordinateSystemTransformation m_PrimaryFrame;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// non-XML data below</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// the inverse of the primary frame for the link represented in the link&apos;s DH frame</span></span>
<span class="line"><span style="color: #6A9955">   /// this is stored for easy access</span></span>
<span class="line"><span style="color: #D4D4D4">   EcCoordinateSystemTransformation m_PrimaryFrameInverse;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// a value for the transformation</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation m_FrameTransform;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// a value for the frame velocity</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcGeneralMotion m_FrameVelocity;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// a value for the frame Acceleration</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcGeneralAcceleration m_FrameAcceleration;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   // temporary variables for speed</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcGeneralMotion m_GMotion0;</span><span style="color: #6A9955">    /// First utility EcGeneralMotion</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcGeneralMotion m_GMotion1;</span><span style="color: #6A9955">    /// Second utility EcGeneralMotion</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcGeneralMotion m_GMotion2;</span><span style="color: #6A9955">    /// Third utility EcGeneralMotion</span></span>
<span class="line"><span style="color: #6A9955">   /// First utility EcCoordinateSystemTransformation</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation m_XForm0;</span></span>
<span class="line"><span style="color: #6A9955">      /// Second utility EcCoordinateSystemTransformation</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation m_XForm1;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#endif</span><span style="color: #6A9955"> // ecLinkKinematics_H_</span></span></code></pre></div>



<h2 id="h-the-mathematical-model-the-transformation-for-the-circle-joint" class="wp-block-heading">The Mathematical Model – The Transformation for the Circle Joint</h2>



<p class="wp-block-paragraph">At the heart of link kinematics is the equation that defines the transformation from the inner frame to the outer frame using a single <i>joint angle</i> parameter. In Actin, the inner frame is rigidly attached to the parent link, while the outer frame is rigidly attached to the link&#8217;s physical extent. A frame is a coordinate system which defines a position and orientation, and a transformation defines the conversion between frames. In Actin, both concepts are represented through the <i>EcCoordinateSystemTransformation</i> class.</p>



<p class="wp-block-paragraph">For our example, let the inner frame sit in the center of the circle, while the outer frame will travel along the circle’s perimeter while pointing its X-axis towards the center. The joint angle parameter will be the linear distance traveled along the circle’s perimeter. This transformation is defined in the <i>transformBy</i> method as shown below.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/////////////////////////////////////////////////////////////////////////
// Function:     transformBy
// Description:  transform an inboard transformation to the link's frame
//               The output is xform*FrameTrans(jointValue).
/////////////////////////////////////////////////////////////////////////
void CircleJoint::transformBy
(
	EcCoordinateSystemTransformation&amp; xform,     // transformation
	EcReal jointValue                            	 // joint value
) const
{

	EcOrientation orientation;
	EcVector translation;

	// set to the precursor.
	xform *= precursor();

	translation.setX(m_Radius*cos(jointValue/m_Radius));
	translation.setY(m_Radius*sin(jointValue/m_Radius));
	translation.setZ(0);

	orientation.setFrom123Euler(0, 0, jointValue / m_Radius);

	// multiply by the transformation
	xform.outboardTransformBy(translation, orientation);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #6A9955">// Function:     transformBy</span></span>
<span class="line"><span style="color: #6A9955">// Description:  transform an inboard transformation to the link&apos;s frame</span></span>
<span class="line"><span style="color: #6A9955">//               The output is xform*FrameTrans(jointValue).</span></span>
<span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::transformBy</span></span>
<span class="line"><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">	EcCoordinateSystemTransformation&amp; xform,</span><span style="color: #6A9955">     // transformation</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointValue</span><span style="color: #6A9955">                            	 // joint value</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	EcOrientation orientation;</span></span>
<span class="line"><span style="color: #D4D4D4">	EcVector translation;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">	// set to the precursor.</span></span>
<span class="line"><span style="color: #D4D4D4">	xform *= </span><span style="color: #DCDCAA">precursor</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setX</span><span style="color: #D4D4D4">(m_Radius*</span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(jointValue/m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setY</span><span style="color: #D4D4D4">(m_Radius*</span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(jointValue/m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">orientation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setFrom123Euler</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, jointValue / m_Radius);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">	// multiply by the transformation</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">outboardTransformBy</span><span style="color: #D4D4D4">(translation, orientation);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">In this method definition, there is a reference to the precursor member variable, which is a transformation that occurs before the link kinematic&#8217;s transformation. Without the precursor, this joint would always rotate about the inner frame’s Z-axis and move on the XY plane. However, with the precursor, this joint can rotate about a different axis. For example, to rotate about the Y-axis, the precursor transformation can be set to a 90° rotation about the X-axis.</p>



<p class="wp-block-paragraph">The velocity and acceleration methods do not need to be defined explicitly, as Actin can automatically calculate them discretely, but they can be implemented for efficiency as shown below.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/////////////////////////////////////////////////////////////////////////
// Function:     calculateVelocity
// Description:  Returns a general velocity calculated from the joint 
//				 value and joint velocity
/////////////////////////////////////////////////////////////////////////
const EcGeneralMotion&amp;
CircleJoint::calculateVelocity
(
	EcReal jointValue,
	EcReal jointVelocity
) const
{

	m_FrameVelocity.setLinearX(-jointVelocity * sin(jointValue / m_Radius));
	m_FrameVelocity.setLinearY(jointVelocity*cos(jointValue / m_Radius));
	m_FrameVelocity.setLinearZ(0);

	m_FrameVelocity.setAngular(EcVector(0, 0, jointVelocity / m_Radius));

	return m_FrameVelocity;
}

/////////////////////////////////////////////////////////////////////////
// Function:     calculateAcceleration
// Description:  Returns a general acceleration calculated from the joint 
//				 value, joint velocity, and joint acceleration
/////////////////////////////////////////////////////////////////////////
const EcGeneralAcceleration&amp;
CircleJoint::calculateAcceleration
(
	EcReal jointValue,
	EcReal jointVelocity,
	EcReal jointAcceleration
) const
{

	m_FrameAcceleration.setLinearX(-jointAcceleration * sin(jointValue / m_Radius)
		- pow(jointVelocity, 2) / m_Radius * cos(jointValue / m_Radius));
	m_FrameAcceleration.setLinearY(jointAcceleration*cos(jointValue / m_Radius)
		- pow(jointVelocity, 2) / m_Radius * sin(jointValue / m_Radius));
	m_FrameAcceleration.setLinearZ(0);

	m_FrameAcceleration.setAngular(EcVector(0, 0, jointAcceleration / m_Radius));

	return m_FrameAcceleration;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #6A9955">// Function:     calculateVelocity</span></span>
<span class="line"><span style="color: #6A9955">// Description:  Returns a general velocity calculated from the joint </span></span>
<span class="line"><span style="color: #6A9955">//				 value and joint velocity</span></span>
<span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralMotion&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::calculateVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearX</span><span style="color: #D4D4D4">(-jointVelocity * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(jointValue / m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearY</span><span style="color: #D4D4D4">(jointVelocity*</span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(jointValue / m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setAngular</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">EcVector</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, jointVelocity / m_Radius));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_FrameVelocity;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #6A9955">// Function:     calculateAcceleration</span></span>
<span class="line"><span style="color: #6A9955">// Description:  Returns a general acceleration calculated from the joint </span></span>
<span class="line"><span style="color: #6A9955">//				 value, joint velocity, and joint acceleration</span></span>
<span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralAcceleration&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::calculateAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointVelocity,</span></span>
<span class="line"><span style="color: #D4D4D4">	EcReal jointAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearX</span><span style="color: #D4D4D4">(-jointAcceleration * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(jointValue / m_Radius)</span></span>
<span class="line"><span style="color: #D4D4D4">		- </span><span style="color: #DCDCAA">pow</span><span style="color: #D4D4D4">(jointVelocity, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) / m_Radius * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(jointValue / m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearY</span><span style="color: #D4D4D4">(jointAcceleration*</span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(jointValue / m_Radius)</span></span>
<span class="line"><span style="color: #D4D4D4">		- </span><span style="color: #DCDCAA">pow</span><span style="color: #D4D4D4">(jointVelocity, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) / m_Radius * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(jointValue / m_Radius));</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setAngular</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">EcVector</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, jointAcceleration / m_Radius));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_FrameAcceleration;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 id="h-xml-methods-saving-and-loading-the-custom-link-kinematics" class="wp-block-heading">XML Methods: Saving and Loading the Custom Link Kinematics</h2>



<p class="wp-block-paragraph">The <i>EcLinkKinematics</i> class derives from Actin’s <i>EcXmlCompoundType</i>, which has built-in XML functionality. This allows Actin to read and write our custom link kinematics class to an XML file, which Actin uses to save its models. Without this functionality, we would have to re-add the custom link kinematics to an Actin model file every time we load it.</p>



<p class="wp-block-paragraph">For the member variables that must be saved to the XML file (in this example, the circle radius and precursor frame), XML tags need to be defined through the <i>EcToken</i> class (which holds a tag and a namespace), as shown in the header file below. These tokens are used by Actin’s XML parser to identify the data.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef CircleJointTokens_H_
#define CircleJointTokens_H_

#include &lt;xml/ecToken.h>

namespace CircleJointNamespace
{
	const EcString NS = " CircleJointNamespace#";

	// Elements
	const EcToken CircleJointToken = NS + "CircleJoint";
	const EcToken CircleJointPrecursor = NS + "CircleJointPrecursor";
	const EcToken CircleJointRadiusToken = NS + "CircleJointRadius";

}

#endif // CircleJointTokens_H_</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">#ifndef</span><span style="color: #569CD6"> CircleJointTokens_H_</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> CircleJointTokens_H_</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;xml/ecToken.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJointNamespace</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcString NS = </span><span style="color: #CE9178">&quot; CircleJointNamespace#&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">	// Elements</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointToken = NS + </span><span style="color: #CE9178">&quot;CircleJoint&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointPrecursor = NS + </span><span style="color: #CE9178">&quot;CircleJointPrecursor&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointRadiusToken = NS + </span><span style="color: #CE9178">&quot;CircleJointRadius&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#endif</span><span style="color: #6A9955"> // CircleJointTokens_H_</span></span></code></pre></div>



<p class="wp-block-paragraph">The member variable tokens are then registered using the <i>registerComponents</i> method.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/////////////////////////////////////////////////////////////////////////
// Functions:    registerComponents()
// Description:  registers all the components for this class that are
//               read and written to XML files.
/////////////////////////////////////////////////////////////////////////
void CircleJoint::registerComponents()
{
	// call parent
	EcLinkKinematics::registerComponents();

	registerComponent(CircleJointPrecursor, &amp;m_Precursor);
	registerComponent(CircleJointRadiusToken, &amp;m_Radius);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #6A9955">// Functions:    registerComponents()</span></span>
<span class="line"><span style="color: #6A9955">// Description:  registers all the components for this class that are</span></span>
<span class="line"><span style="color: #6A9955">//               read and written to XML files.</span></span>
<span class="line"><span style="color: #6A9955">/////////////////////////////////////////////////////////////////////////</span></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #6A9955">	// call parent</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #DCDCAA">registerComponent</span><span style="color: #D4D4D4">(CircleJointPrecursor, &amp;m_Precursor);</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #DCDCAA">registerComponent</span><span style="color: #D4D4D4">(CircleJointRadiusToken, &amp;m_Radius);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">The class token can be defined using the ECXML_DEFINE_TOKENS macro.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ECXML_DEFINE_TOKENS(CircleJoint, CircleJointNamespace::CircleJointToken)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ECXML_DEFINE_TOKENS</span><span style="color: #D4D4D4">(CircleJoint, </span><span style="color: #4EC9B0">CircleJointNamespace</span><span style="color: #D4D4D4">::CircleJointToken)</span></span></code></pre></div>



<p class="wp-block-paragraph">Actin can now read and write the class to an XML file, as shown below.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> &lt;mynamespace:circlejoint library="CircleJoint.ecp" xmlns:mynamespace="MyNameSpace">
  &lt;mynamespace:circlejointprecursor>
    &lt;cr:orientation q0=".7071067811865476" q1=".7071067811865475" q2="-0" q3="0" xmlns:cr="http://www.energid.com/namespace/cr">
    &lt;translation x="0" y="0" z="0">
  &lt;/translation>&lt;/cr:orientation>&lt;/mynamespace:circlejointprecursor>
  &lt;mynamespace:circlejointradius>2&lt;/mynamespace:circlejointradius>
  &lt;primaryframe>
    &lt;cr:orientation q0="1" q1="0" q2="0" q3="0" xmlns:cr="http://www.energid.com/namespace/cr">
    &lt;translation x="0" y="0" z="0">
  &lt;/translation>&lt;/cr:orientation>&lt;/primaryframe>
&lt;/mynamespace:circlejoint></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">mynamespace:circlejoint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">library</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;CircleJoint.ecp&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xmlns:mynamespace</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;MyNameSpace&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">mynamespace:circlejointprecursor</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">cr:orientation</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q0</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;.7071067811865476&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q1</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;.7071067811865475&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q2</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;-0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q3</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xmlns:cr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;http://www.energid.com/namespace/cr&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">translation</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">translation</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">cr:orientation</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">mynamespace:circlejointprecursor</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">mynamespace:circlejointradius</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">mynamespace:circlejointradius</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">primaryframe</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">cr:orientation</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q0</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;1&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q1</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q2</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">q3</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xmlns:cr</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;http://www.energid.com/namespace/cr&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">translation</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">translation</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">cr:orientation</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">primaryframe</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">mynamespace:circlejoint</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">The <i>primaryFrame</i> data is inherited from the base <i>EcLinkKinematics</i> class and used as a general reference for all links in Actin. Link parameters such as mass properties are defined relative to this frame.</p>



<h2 id="h-creating-an-xml-object-library-loading-the-custom-link-kinematics-in-actinviewer" class="wp-block-heading">Creating an XML Object Library – Loading the Custom Link Kinematics in ActinViewer</h2>



<p class="wp-block-paragraph">To avoid always including the source code, the custom link kinematics can be saved as a library. This library can also be used by ActinViewer (which is Energid’s Actin GUI Interface) to load and display the custom link kinematics. To save the library using Actin’s build system, we must define a <i>libraryAttribute</i> method.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>EcXmlObject* CircleJoint::libraryAttribute()
{
	m_LibraryAttribute = "CircleJoint.ecp";
	return &amp;m_LibraryAttribute;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">EcXmlObject</span><span style="color: #569CD6">*</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">libraryAttribute</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">	m_LibraryAttribute = </span><span style="color: #CE9178">&quot;CircleJoint.ecp&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &amp;m_LibraryAttribute;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">The custom kinematics can be built into a library using Actin’s CMake macros.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">DSL</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ecProject(CircleJoint)

ecIncludeSolutions(
	stableFoundation
	foundation
	actinCore
	actin
)

ecExternIncludeDirs(Boost)

ecProjectLinkLibraries(
	actinCore - foundCommon
	stableFoundation - xmlReaderWriter
)

ecSourceFiles(
	CircleJoint.cpp
)

ecXmlObjectLibraryAndPlugin(
	CircleJoint
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">ecProject(CircleJoint)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">ecIncludeSolutions(</span></span>
<span class="line"><span style="color: #D4D4D4">	stableFoundation</span></span>
<span class="line"><span style="color: #D4D4D4">	foundation</span></span>
<span class="line"><span style="color: #D4D4D4">	actinCore</span></span>
<span class="line"><span style="color: #D4D4D4">	actin</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">ecExternIncludeDirs(Boost)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">ecProjectLinkLibraries(</span></span>
<span class="line"><span style="color: #D4D4D4">	actinCore - foundCommon</span></span>
<span class="line"><span style="color: #D4D4D4">	stableFoundation - xmlReaderWriter</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">ecSourceFiles(</span></span>
<span class="line"><span style="color: #D4D4D4">	CircleJoint.cpp</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">ecXmlObjectLibraryAndPlugin(</span></span>
<span class="line"><span style="color: #D4D4D4">	CircleJoint</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">When built, this will generate a <i>libecCircleJoint.so</i> file.</p>



<h2 id="h-adding-the-custom-link-kinematics-into-a-manipulator" class="wp-block-heading">Adding the Custom Link Kinematics into a Manipulator</h2>



<p class="wp-block-paragraph">Since our custom link kinematics is not part of the ActinViewer interface, we have to add it to a manipulator programmatically. This can be accomplished by defining a <i>CircleJoint</i> class and setting it as the link kinematics to the desired manipulator link.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//Create a manipulator link object
EcManipulatorLink link;

//Define our custom kinematics
CircleJoint cj;
cj.setRadius(2);
EcOrientation ori;
ori.setFrom123Euler(EcPi / 2, 0, 0);
EcCoordinateSystemTransformation xform;
xform.setOrientation(ori);
cj.setPrecursor(xform);

//Set as the link's kinematics
link.setLinkKinematics(cj);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">//Create a manipulator link object</span></span>
<span class="line"><span style="color: #D4D4D4">EcManipulatorLink link;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//Define our custom kinematics</span></span>
<span class="line"><span style="color: #D4D4D4">CircleJoint cj;</span></span>
<span class="line"><span style="color: #9CDCFE">cj</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setRadius</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">EcOrientation ori;</span></span>
<span class="line"><span style="color: #9CDCFE">ori</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setFrom123Euler</span><span style="color: #D4D4D4">(EcPi / </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">EcCoordinateSystemTransformation xform;</span></span>
<span class="line"><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setOrientation</span><span style="color: #D4D4D4">(ori);</span></span>
<span class="line"><span style="color: #9CDCFE">cj</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setPrecursor</span><span style="color: #D4D4D4">(xform);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//Set as the link&apos;s kinematics</span></span>
<span class="line"><span style="color: #9CDCFE">link</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinkKinematics</span><span style="color: #D4D4D4">(cj);</span></span></code></pre></div>



<p class="wp-block-paragraph">When compiling this code, the <i>Circle Joint</i> library must be linked through the <i>ecProjectLinkLibraries</i> CMake macro.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">DSL</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ecProjectLinkLibraries(examples-CircleJoint)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">ecProjectLinkLibraries(examples-CircleJoint)</span></span></code></pre></div>



<p class="wp-block-paragraph">I created the circle joint as a project within Actin’s <i>examples</i> solution (solutions are declared by the <i>ecSolution()</i> CMake macro), but the general form to this macro is <i>ecProjectLinkLibraries</i><em>(&lt;solution name&gt;-&lt;project name&gt;)</em>.</p>



<h2 id="h-complete-class" class="wp-block-heading">Complete Class</h2>



<p class="wp-block-paragraph">The above instructions summarize the basic steps to create a custom link kinematics in the Actin SDK. Included below is the full <i>Circle Joint</i> code.</p>



<h3 id="h-tokens-header-file" class="wp-block-heading">Tokens Header File</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// ----------------------------------------------------------------------------------
// Company: DMC
// Engineer: Sophia Dolan
//
// Create Date: 8/2017
// Module Name: CircleJoint – circleJointTokens.h
// Project Name: Example Custom Link Kinematics
// Description: A link kinematics that represents a circular track joint
// ----------------------------------------------------------------------------------

#ifndef CircleJointTokens_H_
#define CircleJointTokens_H_

#include &lt;xml/ecToken.h>

namespace CircleJointNamespace
{
    const EcString NS = "CircleJointNamespace#";

    // Elements
    const EcToken CircleJointToken        = NS + "CircleJoint";
    const EcToken CircleJointPrecursor    = NS + "CircleJointPrecursor";
    const EcToken CircleJointRadiusToken  = NS + "CircleJointRadius";
}

#endif // CircleJointTokens_H_</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Company: DMC</span></span>
<span class="line"><span style="color: #6A9955">// Engineer: Sophia Dolan</span></span>
<span class="line"><span style="color: #6A9955">//</span></span>
<span class="line"><span style="color: #6A9955">// Create Date: 8/2017</span></span>
<span class="line"><span style="color: #6A9955">// Module Name: CircleJoint – circleJointTokens.h</span></span>
<span class="line"><span style="color: #6A9955">// Project Name: Example Custom Link Kinematics</span></span>
<span class="line"><span style="color: #6A9955">// Description: A link kinematics that represents a circular track joint</span></span>
<span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#ifndef</span><span style="color: #569CD6"> CircleJointTokens_H_</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> CircleJointTokens_H_</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;xml/ecToken.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJointNamespace</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcString NS = </span><span style="color: #CE9178">&quot;CircleJointNamespace#&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // Elements</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointToken        = NS + </span><span style="color: #CE9178">&quot;CircleJoint&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointPrecursor    = NS + </span><span style="color: #CE9178">&quot;CircleJointPrecursor&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcToken CircleJointRadiusToken  = NS + </span><span style="color: #CE9178">&quot;CircleJointRadius&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#endif</span><span style="color: #6A9955"> // CircleJointTokens_H_</span></span></code></pre></div>



<h3 id="h-class-header-file" class="wp-block-heading">Class Header File</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// ----------------------------------------------------------------------------------
// Company: DMC
// Engineer: Sophia Dolan
//
// Create Date : 08/2017
// Module Name : CircleJoint
// File Name   : ecCircleJoint.h
// Project     : Example Custom Link Kinematics
// Description :
//     A custom link kinematics implementation that represents a
//     circular track joint.
// ----------------------------------------------------------------------------------

#ifndef EC_CIRCLEJOINT_H_
#define EC_CIRCLEJOINT_H_

#include &lt;actinCore/actinCore_config.h>      // Must be included first
#include &lt;foundCommon/ecCoordSysXForm.h>
#include &lt;manipulator/ecJointActuator.h>
#include &lt;manipulator/ecLinkKinematics.h>
#include &lt;xml/ecXmlVectorType.h>

/// A joint that follows a geometrically defined circular rail.
class EC_ACTINCORE_MANIPULATOR_DECL CircleJoint : public EcLinkKinematics
{
   EC_XMLOBJECT_PLUGIN_DECLARE(CircleJoint);

public:

   /// Initialize XML components for serialization.
   virtual EcBoolean xmlInit();

   /// Register XML components with the parent object.
   virtual void registerComponents();

   /// Factory method.
   static EcXmlObject* creator();

   /// Get precursor transformation.
   virtual const EcCoordinateSystemTransformation&amp; precursor() const;

   /// Set precursor transformation.
   virtual void setPrecursor(
      const EcCoordinateSystemTransformation&amp; value
   );

   /// Get circular track radius (meters).
   EcReal radius() const;

   /// Set circular track radius.
   void setRadius(EcReal radius);

   /// Calculate the D-H transformation for the supplied joint value.
   virtual const EcCoordinateSystemTransformation&amp; calculateTransform(
      EcReal jointValue
   ) const;

   /// Transform an inboard transformation to the link's D-H frame.
   /// Result:
   ///
   ///     xform = xform * DH(jointValue)
   ///
   virtual void transformBy(
      EcCoordinateSystemTransformation&amp; xform,
      EcReal jointValue
   ) const;

   /// Calculate joint velocity.
   virtual const EcGeneralMotion&amp; calculateVelocity(
      EcReal jointValue,
      EcReal jointVelocity
   ) const;

   /// Calculate joint acceleration.
   virtual const EcGeneralAcceleration&amp; calculateAcceleration(
      EcReal jointValue,
      EcReal jointVelocity,
      EcReal jointAcceleration
   ) const;

   using EcLinkKinematics::approxEq;

   /// Test for approximate equality.
   virtual EcBoolean approxEq(
      const CircleJoint&amp; other,
      EcReal tolerance
   ) const;

   /// Compute the upper-bound D-H frame distance for this joint.
   virtual EcReal upperBoundDhFrameDistance(
      const EcJointActuator&amp; jointActuator
   ) const;

   /// Scale the kinematics by the specified factor.
   ///
   /// scaleFactor = 1.0 leaves the object unchanged.
   virtual void scaleBy(EcReal scaleFactor);

   /// Apply a coordinate transformation before link placement.
   ///
   /// For precursor P:
   ///
   ///     P = xform * P
   ///
   virtual void transformBy(
      const EcCoordinateSystemTransformation&amp; xform
   );

   /// Return the parameter scalability factor.
   ///
   /// Returns:
   ///   1.0 for distance-based parameters
   ///   0.0 for non-distance-based parameters
   ///
   virtual EcReal jointParameterScalability() const;

   /// Modify the inboard frame by an offset transformation.
   ///
   /// Used to account for uncertainty in link measurements,
   /// both translational and rotational.
   virtual void changeInboardFrameBy(
      const EcCoordinateSystemTransformation&amp; offset
   );

   /// Read object from XML.
   virtual EcBoolean read(EcXmlReader&amp; stream);

   /// Write object to XML.
   virtual EcBoolean write(EcXmlWriter&amp; stream) const;

   /// Return a default/empty object.
   static CircleJoint nullObject();

   /// Return unit type identifier.
   virtual EcU32 unitType() const;

   /// Run internal validation tests.
   EcBoolean selfTest() const;

private:

   /// Precursor transformation.
   EcCoordinateSystemTransformation m_Precursor;

   /// Radius of the circular track.
   EcXmlReal m_Radius;

   /// Cached joint value associated with the stored transform.
   mutable EcReal m_JointValueForStoredTransform;
};

#endif // EC_CIRCLEJOINT_H_</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Company: DMC</span></span>
<span class="line"><span style="color: #6A9955">// Engineer: Sophia Dolan</span></span>
<span class="line"><span style="color: #6A9955">//</span></span>
<span class="line"><span style="color: #6A9955">// Create Date : 08/2017</span></span>
<span class="line"><span style="color: #6A9955">// Module Name : CircleJoint</span></span>
<span class="line"><span style="color: #6A9955">// File Name   : ecCircleJoint.h</span></span>
<span class="line"><span style="color: #6A9955">// Project     : Example Custom Link Kinematics</span></span>
<span class="line"><span style="color: #6A9955">// Description :</span></span>
<span class="line"><span style="color: #6A9955">//     A custom link kinematics implementation that represents a</span></span>
<span class="line"><span style="color: #6A9955">//     circular track joint.</span></span>
<span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#ifndef</span><span style="color: #569CD6"> EC_CIRCLEJOINT_H_</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> EC_CIRCLEJOINT_H_</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;actinCore/actinCore_config.h&gt;</span><span style="color: #569CD6">      </span><span style="color: #6A9955">// Must be included first</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;foundCommon/ecCoordSysXForm.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;manipulator/ecJointActuator.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;manipulator/ecLinkKinematics.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;xml/ecXmlVectorType.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/// A joint that follows a geometrically defined circular rail.</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> EC_ACTINCORE_MANIPULATOR_DECL </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4"> : </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #DCDCAA">EC_XMLOBJECT_PLUGIN_DECLARE</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">public:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Initialize XML components for serialization.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">xmlInit</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Register XML components with the parent object.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Factory method.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcXmlObject</span><span style="color: #569CD6">*</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">creator</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Get precursor transformation.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">precursor</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Set precursor transformation.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setPrecursor</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span></span>
<span class="line"><span style="color: #D4D4D4">   );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Get circular track radius (meters).</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">radius</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Set circular track radius.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setRadius</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Calculate the D-H transformation for the supplied joint value.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">calculateTransform</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Transform an inboard transformation to the link&apos;s D-H frame.</span></span>
<span class="line"><span style="color: #6A9955">   /// Result:</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   ///     xform = xform * DH(jointValue)</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Calculate joint velocity.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcGeneralMotion</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">calculateVelocity</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointValue</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Calculate joint acceleration.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcGeneralAcceleration</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">calculateAcceleration</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointValue</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointVelocity</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::approxEq;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Test for approximate equality.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">approxEq</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tolerance</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Compute the upper-bound D-H frame distance for this joint.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">upperBoundDhFrameDistance</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcJointActuator</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointActuator</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Scale the kinematics by the specified factor.</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   /// scaleFactor = 1.0 leaves the object unchanged.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">scaleBy</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">scaleFactor</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Apply a coordinate transformation before link placement.</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   /// For precursor </span><span style="color: #569CD6">P:</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   ///     P = xform * P</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xform</span></span>
<span class="line"><span style="color: #D4D4D4">   );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Return the parameter scalability factor.</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   /// Returns:</span></span>
<span class="line"><span style="color: #6A9955">   ///   1.0 for distance-based parameters</span></span>
<span class="line"><span style="color: #6A9955">   ///   0.0 for non-distance-based parameters</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">jointParameterScalability</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Modify the inboard frame by an offset transformation.</span></span>
<span class="line"><span style="color: #6A9955">   ///</span></span>
<span class="line"><span style="color: #6A9955">   /// Used to account for uncertainty in link measurements,</span></span>
<span class="line"><span style="color: #6A9955">   /// both translational and rotational.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">changeInboardFrameBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span></span>
<span class="line"><span style="color: #D4D4D4">   );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Read object from XML.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">read</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcXmlReader</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">stream</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Write object to XML.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcXmlWriter</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">stream</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Return a default/empty object.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">nullObject</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Return unit type identifier.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">virtual</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcU32</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">unitType</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Run internal validation tests.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">selfTest</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">private:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Precursor transformation.</span></span>
<span class="line"><span style="color: #D4D4D4">   EcCoordinateSystemTransformation m_Precursor;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Radius of the circular track.</span></span>
<span class="line"><span style="color: #D4D4D4">   EcXmlReal m_Radius;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">   /// Cached joint value associated with the stored transform.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">mutable</span><span style="color: #D4D4D4"> EcReal m_JointValueForStoredTransform;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#endif</span><span style="color: #6A9955"> // EC_CIRCLEJOINT_H_</span></span></code></pre></div>



<h3 id="h-class-implementation-file" class="wp-block-heading">Class Implementation File</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C++</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// ----------------------------------------------------------------------------------
// Company: DMC
// Engineer: Sophia Dolan
//
// Create Date : 08/2017
// Module      : CircleJoint
// File        : circleJoint.cpp
// Project     : Example Custom Link Kinematics
// Description :
//     Custom link kinematics representing a circular track joint.
// ----------------------------------------------------------------------------------

#include "circleJoint.h"
#include "circleJointTokens.h"

#include &lt;foundCore/ecMacros.h>
#include &lt;foundCore/ecMath.h>
#include &lt;manipulator/ecJointActuator.h>
#include &lt;manipulator/ecManipulatorTokens.h>
#include &lt;math.h>
#include &lt;xmlReaderWriter/ecXmlObjectReaderWriter.h>

using namespace CircleJointNamespace;

ECXML_DEFINE_TOKENS(
    CircleJoint,
    CircleJointNamespace::CircleJointToken
)

EcXmlObject* CircleJoint::libraryAttribute()
{
    m_LibraryAttribute = "CircleJoint.ecp";
    return &amp;m_LibraryAttribute;
}

//------------------------------------------------------------------------------
// Constructors / Destructor
//------------------------------------------------------------------------------

CircleJoint::CircleJoint() :
    EcLinkKinematics(),
    m_Precursor(EcCoordinateSystemTransformation::nullObject()),
    m_Radius(3.0),
    m_JointValueForStoredTransform(0.0)
{
}

CircleJoint::~CircleJoint()
{
}

CircleJoint::CircleJoint(const CircleJoint&amp; other) :
    EcLinkKinematics(other),
    m_Precursor(other.m_Precursor),
    m_Radius(other.m_Radius),
    m_JointValueForStoredTransform(other.m_JointValueForStoredTransform)
{
}

CircleJoint&amp; CircleJoint::operator=(const CircleJoint&amp; other)
{
    if (this == &amp;other)
    {
        return *this;
    }

    EcLinkKinematics::operator=(other);

    m_Precursor = other.m_Precursor;
    m_Radius = other.m_Radius;
    m_JointValueForStoredTransform =
        other.m_JointValueForStoredTransform;

    return *this;
}

EcBoolean CircleJoint::operator==(const CircleJoint&amp; other) const
{
    return
        EcLinkKinematics::operator==(other) &amp;&amp;
        m_Precursor == other.m_Precursor &amp;&amp;
        m_Radius == other.m_Radius;
}

//------------------------------------------------------------------------------
// XML Support
//------------------------------------------------------------------------------

EcXmlObject* CircleJoint::creator()
{
    return new CircleJoint();
}

EcBoolean CircleJoint::xmlInit()
{
    return EcLinkKinematics::xmlInit();
}

void CircleJoint::registerComponents()
{
    EcLinkKinematics::registerComponents();

    registerComponent(
        CircleJointPrecursor,
        &amp;m_Precursor
    );

    registerComponent(
        CircleJointRadiusToken,
        &amp;m_Radius
    );
}

//------------------------------------------------------------------------------
// Accessors
//------------------------------------------------------------------------------

const EcCoordinateSystemTransformation&amp;
CircleJoint::precursor() const
{
    return m_Precursor;
}

void CircleJoint::setPrecursor(
    const EcCoordinateSystemTransformation&amp; value
)
{
    m_Precursor = value;
}

EcReal CircleJoint::radius() const
{
    return m_Radius;
}

void CircleJoint::setRadius(EcReal radius)
{
    m_Radius = radius;
}

//------------------------------------------------------------------------------
// Kinematics
//------------------------------------------------------------------------------

const EcCoordinateSystemTransformation&amp;
CircleJoint::calculateTransform(
    EcReal jointValue
) const
{
    m_JointValueForStoredTransform = jointValue;

    m_FrameTransform.setToIdentity();

    transformBy(
        m_FrameTransform,
        m_JointValueForStoredTransform
    );

    return m_FrameTransform;
}

void CircleJoint::transformBy(
    EcCoordinateSystemTransformation&amp; xform,
    EcReal jointValue
) const
{
    EcOrientation orientation;
    EcVector translation;

    xform *= precursor();

    const EcReal angle = jointValue / m_Radius;

    translation.setX(
        m_Radius * cos(angle)
    );

    translation.setY(
        m_Radius * sin(angle)
    );

    translation.setZ(0.0);

    orientation.setFrom123Euler(
        0.0,
        0.0,
        angle
    );

    xform.outboardTransformBy(
        translation,
        orientation
    );
}

//------------------------------------------------------------------------------
// Velocity / Acceleration
//------------------------------------------------------------------------------

const EcGeneralMotion&amp;
CircleJoint::calculateVelocity(
    EcReal jointValue,
    EcReal jointVelocity
) const
{
    const EcReal angle = jointValue / m_Radius;

    m_FrameVelocity.setLinearX(
        -jointVelocity * sin(angle)
    );

    m_FrameVelocity.setLinearY(
         jointVelocity * cos(angle)
    );

    m_FrameVelocity.setLinearZ(0.0);

    m_FrameVelocity.setAngular(
        EcVector(
            0.0,
            0.0,
            jointVelocity / m_Radius
        )
    );

    return m_FrameVelocity;
}

const EcGeneralAcceleration&amp;
CircleJoint::calculateAcceleration(
    EcReal jointValue,
    EcReal jointVelocity,
    EcReal jointAcceleration
) const
{
    const EcReal angle = jointValue / m_Radius;
    const EcReal velocitySquared =
        jointVelocity * jointVelocity;

    m_FrameAcceleration.setLinearX(
        -jointAcceleration * sin(angle)
        - velocitySquared / m_Radius * cos(angle)
    );

    m_FrameAcceleration.setLinearY(
         jointAcceleration * cos(angle)
        - velocitySquared / m_Radius * sin(angle)
    );

    m_FrameAcceleration.setLinearZ(0.0);

    m_FrameAcceleration.setAngular(
        EcVector(
            0.0,
            0.0,
            jointAcceleration / m_Radius
        )
    );

    return m_FrameAcceleration;
}

//------------------------------------------------------------------------------
// Utility Functions
//------------------------------------------------------------------------------

EcBoolean CircleJoint::approxEq(
    const CircleJoint&amp; other,
    EcReal tol
) const
{
    const EcBoolean parentEqual =
        EcLinkKinematics::approxEq(
            other,
            tol
        );

    const EcBoolean frameEqual =
        primaryFrame().approxEq(
            other.primaryFrame(),
            tol
        );

    const EcBoolean radiusEqual =
        fabs(m_Radius - other.radius()) &lt;
        fabs(tol);

    return
        parentEqual &amp;&amp;
        frameEqual &amp;&amp;
        radiusEqual;
}

void CircleJoint::scaleBy(
    EcReal scaleFactor
)
{
    m_Precursor.setTranslation(
        m_Precursor.translation() *
        scaleFactor
    );

    m_Radius *= scaleFactor;
}

void CircleJoint::transformBy(
    const EcCoordinateSystemTransformation&amp; xform
)
{
    m_Precursor =
        xform * m_Precursor;
}

EcReal CircleJoint::jointParameterScalability() const
{
    return 1.0;
}

//------------------------------------------------------------------------------
// XML Read / Write
//------------------------------------------------------------------------------

EcBoolean CircleJoint::read(
    EcXmlReader&amp; stream
)
{
    EcBoolean result =
        EcXmlCompoundType::read(stream);

    m_PrimaryFrameInverse =
        m_PrimaryFrame.inverse();

    return result;
}

EcBoolean CircleJoint::write(
    EcXmlWriter&amp; stream
) const
{
    return EcXmlCompoundType::write(stream);
}

//------------------------------------------------------------------------------
// Miscellaneous
//------------------------------------------------------------------------------

CircleJoint CircleJoint::nullObject()
{
    return CircleJoint();
}

EcU32 CircleJoint::unitType() const
{
    return LINEAR;
}

EcReal CircleJoint::upperBoundDhFrameDistance(
    const EcJointActuator&amp; jointActuator
) const
{
    return EcMath::maximum(
        calculateTransform(
            jointActuator.upperLimit()
        ).translation().mag(),

        calculateTransform(
            jointActuator.lowerLimit()
        ).translation().mag()
    );
}

void CircleJoint::changeInboardFrameBy(
    const EcCoordinateSystemTransformation&amp; offset
)
{
    m_Precursor *= offset;
}

//------------------------------------------------------------------------------
// Self Test
//------------------------------------------------------------------------------

EcBoolean CircleJoint::selfTest() const
{
    CircleJoint original;
    original.setRadius(200.0);

    const EcString filename =
        "CircleJointSelfTest.xml";

    EcXmlObjectReaderWriter::writeToFile(
        original,
        filename
    );

    CircleJoint loaded;

    EcXmlObjectReaderWriter::readFromFile(
        loaded,
        filename
    );

    if (!(original == loaded))
    {
        EcPrint(Error)
            &lt;&lt; "CircleJoint self-test failed"
            &lt;&lt; std::endl;

        return EcFalse;
    }

    return EcTrue;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Company: DMC</span></span>
<span class="line"><span style="color: #6A9955">// Engineer: Sophia Dolan</span></span>
<span class="line"><span style="color: #6A9955">//</span></span>
<span class="line"><span style="color: #6A9955">// Create Date : 08/2017</span></span>
<span class="line"><span style="color: #6A9955">// Module      : CircleJoint</span></span>
<span class="line"><span style="color: #6A9955">// File        : circleJoint.cpp</span></span>
<span class="line"><span style="color: #6A9955">// Project     : Example Custom Link Kinematics</span></span>
<span class="line"><span style="color: #6A9955">// Description :</span></span>
<span class="line"><span style="color: #6A9955">//     Custom link kinematics representing a circular track joint.</span></span>
<span class="line"><span style="color: #6A9955">// ----------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&quot;circleJoint.h&quot;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&quot;circleJointTokens.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;foundCore/ecMacros.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;foundCore/ecMath.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;manipulator/ecJointActuator.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;manipulator/ecManipulatorTokens.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;math.h&gt;</span></span>
<span class="line"><span style="color: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;xmlReaderWriter/ecXmlObjectReaderWriter.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJointNamespace</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">ECXML_DEFINE_TOKENS</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    CircleJoint,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">CircleJointNamespace</span><span style="color: #D4D4D4">::CircleJointToken</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcXmlObject</span><span style="color: #569CD6">*</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">libraryAttribute</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_LibraryAttribute = </span><span style="color: #CE9178">&quot;CircleJoint.ecp&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &amp;m_LibraryAttribute;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Constructors / Destructor</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">CircleJoint</span><span style="color: #D4D4D4">() :</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">EcLinkKinematics</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_Precursor</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">nullObject</span><span style="color: #D4D4D4">()),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_Radius</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3.0</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_JointValueForStoredTransform</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::~</span><span style="color: #DCDCAA">CircleJoint</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">CircleJoint</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> CircleJoint&amp; other) :</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">EcLinkKinematics</span><span style="color: #D4D4D4">(other),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_Precursor</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Precursor</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_Radius</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Radius</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">m_JointValueForStoredTransform</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_JointValueForStoredTransform</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #C586C0">operator=</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4"> == &amp;other)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> *</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::operator=(other);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    m_Precursor = </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Precursor</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    m_Radius = </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Radius</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    m_JointValueForStoredTransform =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_JointValueForStoredTransform</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> *</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #C586C0">operator==</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::operator==(other) &amp;&amp;</span></span>
<span class="line"><span style="color: #D4D4D4">        m_Precursor == </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Precursor</span><span style="color: #D4D4D4"> &amp;&amp;</span></span>
<span class="line"><span style="color: #D4D4D4">        m_Radius == </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">m_Radius</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// XML Support</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcXmlObject</span><span style="color: #569CD6">*</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">creator</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CircleJoint</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">xmlInit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">xmlInit</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">registerComponents</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">registerComponent</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        CircleJointPrecursor,</span></span>
<span class="line"><span style="color: #D4D4D4">        &amp;m_Precursor</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">registerComponent</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        CircleJointRadiusToken,</span></span>
<span class="line"><span style="color: #D4D4D4">        &amp;m_Radius</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Accessors</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">precursor</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_Precursor;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setPrecursor</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_Precursor = value;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">radius</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_Radius;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setRadius</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_Radius = radius;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Kinematics</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcCoordinateSystemTransformation&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">calculateTransform</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_JointValueForStoredTransform = jointValue;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameTransform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setToIdentity</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        m_FrameTransform,</span></span>
<span class="line"><span style="color: #D4D4D4">        m_JointValueForStoredTransform</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_FrameTransform;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointValue</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    EcOrientation orientation;</span></span>
<span class="line"><span style="color: #D4D4D4">    EcVector translation;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    xform *= </span><span style="color: #DCDCAA">precursor</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal angle = jointValue / m_Radius;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setX</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        m_Radius * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setY</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        m_Radius * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">translation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">orientation</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setFrom123Euler</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        angle</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">xform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">outboardTransformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        translation,</span></span>
<span class="line"><span style="color: #D4D4D4">        orientation</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Velocity / Acceleration</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralMotion&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">calculateVelocity</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointVelocity</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal angle = jointValue / m_Radius;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearX</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        -jointVelocity * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearY</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">         jointVelocity * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameVelocity</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setAngular</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">EcVector</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            jointVelocity / m_Radius</span></span>
<span class="line"><span style="color: #D4D4D4">        )</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_FrameVelocity;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcGeneralAcceleration&amp;</span></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">calculateAcceleration</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointValue,</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointVelocity,</span></span>
<span class="line"><span style="color: #D4D4D4">    EcReal jointAcceleration</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal angle = jointValue / m_Radius;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcReal velocitySquared =</span></span>
<span class="line"><span style="color: #D4D4D4">        jointVelocity * jointVelocity;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearX</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        -jointAcceleration * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">        - velocitySquared / m_Radius * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearY</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">         jointAcceleration * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">        - velocitySquared / m_Radius * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(angle)</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setLinearZ</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_FrameAcceleration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setAngular</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">EcVector</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            jointAcceleration / m_Radius</span></span>
<span class="line"><span style="color: #D4D4D4">        )</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> m_FrameAcceleration;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Utility Functions</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">approxEq</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tol</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcBoolean parentEqual =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">EcLinkKinematics</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">approxEq</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            other,</span></span>
<span class="line"><span style="color: #D4D4D4">            tol</span></span>
<span class="line"><span style="color: #D4D4D4">        );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcBoolean frameEqual =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">primaryFrame</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">approxEq</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">primaryFrame</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">            tol</span></span>
<span class="line"><span style="color: #D4D4D4">        );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcBoolean radiusEqual =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">fabs</span><span style="color: #D4D4D4">(m_Radius - </span><span style="color: #9CDCFE">other</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">radius</span><span style="color: #D4D4D4">()) &lt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">fabs</span><span style="color: #D4D4D4">(tol);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span></span>
<span class="line"><span style="color: #D4D4D4">        parentEqual &amp;&amp;</span></span>
<span class="line"><span style="color: #D4D4D4">        frameEqual &amp;&amp;</span></span>
<span class="line"><span style="color: #D4D4D4">        radiusEqual;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">scaleBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">scaleFactor</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">m_Precursor</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setTranslation</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">m_Precursor</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">translation</span><span style="color: #D4D4D4">() *</span></span>
<span class="line"><span style="color: #D4D4D4">        scaleFactor</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    m_Radius *= scaleFactor;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">transformBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xform</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_Precursor =</span></span>
<span class="line"><span style="color: #D4D4D4">        xform * m_Precursor;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">jointParameterScalability</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// XML Read / Write</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">read</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcXmlReader</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">stream</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    EcBoolean result =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">EcXmlCompoundType</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">read</span><span style="color: #D4D4D4">(stream);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    m_PrimaryFrameInverse =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">m_PrimaryFrame</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">inverse</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> result;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcXmlWriter</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">stream</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcXmlCompoundType</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(stream);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Miscellaneous</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">nullObject</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CircleJoint</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcU32</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">unitType</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> LINEAR;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcReal</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">upperBoundDhFrameDistance</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcJointActuator</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jointActuator</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcMath</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">maximum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">calculateTransform</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">jointActuator</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">upperLimit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        ).</span><span style="color: #DCDCAA">translation</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">mag</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">calculateTransform</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">jointActuator</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">lowerLimit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        ).</span><span style="color: #DCDCAA">translation</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">mag</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">changeInboardFrameBy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EcCoordinateSystemTransformation</span><span style="color: #569CD6">&amp;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    m_Precursor *= offset;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #6A9955">// Self Test</span></span>
<span class="line"><span style="color: #6A9955">//------------------------------------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="color: #4EC9B0">EcBoolean</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircleJoint</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">selfTest</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">const</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    CircleJoint original;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">original</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setRadius</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">200.0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> EcString filename =</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;CircleJointSelfTest.xml&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcXmlObjectReaderWriter</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">writeToFile</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        original,</span></span>
<span class="line"><span style="color: #D4D4D4">        filename</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    CircleJoint loaded;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">EcXmlObjectReaderWriter</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">readFromFile</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        loaded,</span></span>
<span class="line"><span style="color: #D4D4D4">        filename</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!(original == loaded))</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">EcPrint</span><span style="color: #D4D4D4">(Error)</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;&lt; </span><span style="color: #CE9178">&quot;CircleJoint self-test failed&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;&lt; </span><span style="color: #4EC9B0">std</span><span style="color: #D4D4D4">::endl;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> EcFalse;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> EcTrue;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Learn more about <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/robotics" target="_blank">DMC&#8217;s Robotic Automation and Integration services</a>.&nbsp;Or,&nbsp;<a href="https://static.dmcinfo.com/contact">contact us</a>&nbsp;to get started on a project today.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/22369/implementing-custom-link-kinematics-in-energids-actin-sdk/">Implementing Custom Link Kinematics in Energid’s Actin SDK</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ABB Vision-Guided Movement – These ARE the Droids You’re Looking For</title>
		<link>https://static.dmcinfo.com/blog/22600/abb-vision-guided-movement-these-are-the-droids-youre-looking-for/</link>
		
		<dc:creator><![CDATA[Keith Janson]]></dc:creator>
		<pubDate>Wed, 03 Oct 2018 14:29:46 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[Robotics]]></category>
		<category><![CDATA[Vision Inspection]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22600/abb-vision-guided-movement-these-are-the-droids-youre-looking-for/</guid>

					<description><![CDATA[<p>Of all the unanswered questions of the universe, the one that consistently keeps me up at night is this: In Star Wars: Episode IV &#8211; A New Hope, if recovering the Death Star plans were so vital to the security of the Galactic Empire, why would you send Storm Troopers to do a job that [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22600/abb-vision-guided-movement-these-are-the-droids-youre-looking-for/">ABB Vision-Guided Movement – These ARE the Droids You’re Looking For</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Of all the unanswered questions of the universe, the one that consistently keeps me up at night is this: In Star Wars: Episode IV &#8211; A New Hope, if recovering the Death Star plans were so vital to the security of the Galactic Empire, why would you send Storm Troopers to do a job that a machine could do just as well, especially if the machine would be immune to Jedi mind tricks?&nbsp;</p>



<p class="wp-block-paragraph">To prove to myself that it could not have been an issue of technological limitations (and to have an excuse to play&nbsp;with a Cognex camera, <a href="https://new.abb.com/products/robotics/robotstudio" target="_blank">ABB&#8217;s RobotStudio</a>, and the Star Wars toys I keep on my desk), I decided to spin up a quick tutorial to show that I could, in fact, locate and retrieve the droid I was looking for.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Cognex-Camera-and-BB8.jpg" alt="Cognex camera pointed at BB8 toy"/></figure>



<h2 class="wp-block-heading" id="h-robotstudio-integrated-vision">RobotStudio Integrated Vision</h2>



<p class="wp-block-paragraph">The ABB RobotStudio&#8217;s &#8220;Integrated Vision&#8221; feature is essentially a &#8220;Cognex In-Sight Lite,&#8221; and as of publication, this is only functional on the 32-bit version of robot studio.<br>
<br>
To access the Integrated Vision tab, expand your robot controller (physical or virtual) in the left-hand controller pane and right-click on the <strong>Vision System</strong>&nbsp;item. Right-clicking will open the <strong>Integrated Vision tab </strong>of RobotStudio.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Integrated-Vision-Tab.jpg" alt="Screenshot of controller menu with Vision System"/></figure>



<h2 class="wp-block-heading" id="h-connecting-to-the-camera">Connecting to the Camera</h2>



<p class="wp-block-paragraph">Connect the camera to the robot controller service port switch. Once connected, the camera should appear under <strong>Vision System</strong> in the left-hand controller tree.<br>
<br>
If not, then from the vision tab, select <strong>Connect/Add Senor</strong>. In this window, you should be able to see all cameras physically connected to the network and can change network settings of the cameras accordingly.</p>



<p class="MsoNormal wp-block-paragraph">If you are connecting a camera (or an emulated camera) to a virtual robot controller, you will need to define the <strong>virtual programming port</strong>&nbsp;of the virtual controller to which the camera is connecting.<br>
<br>
To do so, find the <strong>vc_network_definition.xml </strong>file in the <strong>RobotStudio/Systems/Controller Name/Home/IV folder</strong>. In this XML file, set the <strong>IP Address/Subnet</strong> to that of the NIC connected to the camera.</p>



<p class="wp-block-paragraph">Warm restart the virtual controller you are using,&nbsp;and an unconfigured camera should appear under <strong>Vision System </strong>in the system tree.</p>



<h2 class="wp-block-heading" id="h-calibration">Calibration</h2>



<p class="wp-block-paragraph">Now that the camera is connected, you need to calibrate the images from the camera to real-world units of measurement <strong>(pixels to millimeters</strong>). The easiest way to do this is with the <strong>grid calibration</strong>&nbsp;method.<br>
<br>
To do so, select the <strong>Calibrate</strong>&nbsp;button from the top ribbon, then select <strong>Grid</strong>&nbsp;from the <strong>Calibration Type </strong>drop-down in the context menu. Selecting grid will pull up the configuration options for the grid calibration sizing.<br>
<br>
Verify the selection of <strong>Checkerboard, with fiducial</strong>&nbsp;for the grid type. The other options can be left as is (see below).<br>
<br>
The only option that may need adjustment would be the <strong>lens model</strong>. Select <strong>radial </strong>for straight-on pictures (for example, top-down) view, or choose <strong>projection </strong>if the camera is not parallel with the target object (for example, being mounted perpendicular to it).</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Abb-Blog-Congex-Calibration-Selection-Menu.jpg" alt="Vision Tool Calibration Menu - Lens Mode selection"/></figure>



<p class="wp-block-paragraph">Once the grid parameters have been set up, select <strong>Print Grid</strong>&nbsp;to print off a copy of the grid.<br>
<br>
Verify the spacing of the checkers on the grid matches the selection in the previous view.<br>
<br>
Center the grid within the field of view of the camera, and tape it in place (it&#8217;ll be important later that the grid does not move after the calibration image has been taken).<br>
<br>
Once in place, select <strong>Next</strong>&nbsp;in the context menu with the grid setup, and then select <strong>Acquire Image</strong>&nbsp;within the context menu.<br>
<br>
Once the image has been acquired, and the camera can recognize the calibration image, select the <strong>Calibrate</strong>&nbsp;button to load the calibration data into the active camera job. If the camera does not recognize the calibration image, it may require adjusting the camera <strong>position</strong>, <strong>exposure</strong>, or <strong>focus</strong>.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Camera-Calibration-Window.jpg" alt="Calibration Window"/></figure>



<p class="wp-block-paragraph">Now that the camera is calibrated, you will need to align the <strong>origin </strong>and <strong>orientation </strong>of the camera image (defined by the location of the fiducial in the calibration grid), with a workobject defined in the robot.<br>
<br>
To do so, using a defined calibration pointing tool, define the camera workobject along the same X/Y axis as is on the taped calibration grid (only calibrate the user frame, as the object frame will then be used to shift the coordinate system to move to identified objects). At this point, the camera and robot workobject coordinate systems should be aligned.</p>



<h2 class="wp-block-heading" id="h-identifying-part-location">Identifying Part Location</h2>



<p class="wp-block-paragraph">Once the camera and robot are calibrated, you can begin setting up your part location tools to locate your target objects. Several tools are available in the <strong>Add Part Location Tool</strong>&nbsp;menu, all of which will report back <strong>part location </strong>(X,Y coordinate) and <strong>orientation </strong>(for brevity&#8217;s sake, I won&#8217;t discuss the individual configuration of each tool).<br>
<br>
Once a location tool has been selected and configured to locate the desired part, the next step is configuring the output parameters to the robot RAPID program.<br>
<br>
To do so, select the <strong>Output to Rapid</strong>&nbsp;button at the top, which will open the <strong>Setup Communication</strong>&nbsp;context menu. Using this menu, you can define which parameters (Result) of which tools (Group) you want to reference in the RAPID program.<br>
<br>
At a minimum, you should send the <strong>Fixture.X</strong>, <strong>Fixture.Y</strong>, <strong>Fixture</strong><strong>.Angle</strong>, and <strong>Pass </strong>or <strong>Fail </strong>parameters (I&#8217;ve also included the Fixture.Score parameter for reference to show how closely the tool models match the captured images).</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Identifying-Part-Location.jpg" alt="Identifying part location"/></figure>



<h2 class="wp-block-heading" id="h-rapid-configuration">RAPID Configuration</h2>



<p class="wp-block-paragraph">Once the vision job has been set up and calibrated, and the camera workobject has been defined to align coordinate systems with the camera, the actual part identification/movement can be done.<br>
<br>
Using one of the out-of-the-box code snippets available in RobotStudio as a starting point (RAPID/Snippet/Integrated Vision), set up a procedure to execute a camera job. After the job is complete, set the camera object frame to be vision coordinates of the camera result.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">RAPID</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  PROC MoveToDetectedObject()
      
      VAR cameratarget mycameratarget;
      VAR wobjdata mywobj;
      VAR tooldata mytool; 
      VAR robtarget myrobtarget;
      VAR string myjob := "myjob.job";
      
      CamSetProgramMode RobotCamera;
      CamLoadJob RobotCamera, myjob;
      CamSetRunMode RobotCamera;
      
      CamReqImage RobotCamera;
      CamGetResult RobotCamera, mycameratarget;
      mywobj.oframe := mycameratarget.cframe;
      
      !During the first cycle, run the program until this point,
      !then jog the tool to the desired grip position and modpos myrobtarget.
      MoveL myrobtarget, v100, fine, mytool \WObj:=mywobj;
  ENDPROC</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">  PROC MoveToDetectedObject()</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">VAR</span><span style="color: #D4D4D4"> cameratarget mycameratarget;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">VAR</span><span style="color: #D4D4D4"> wobjdata mywobj;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">VAR</span><span style="color: #D4D4D4"> tooldata mytool; </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">VAR</span><span style="color: #D4D4D4"> robtarget myrobtarget;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">VAR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> myjob := &quot;myjob.job&quot;;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      CamSetProgramMode RobotCamera;</span></span>
<span class="line"><span style="color: #D4D4D4">      CamLoadJob RobotCamera, myjob;</span></span>
<span class="line"><span style="color: #D4D4D4">      CamSetRunMode RobotCamera;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      CamReqImage RobotCamera;</span></span>
<span class="line"><span style="color: #D4D4D4">      CamGetResult RobotCamera, mycameratarget;</span></span>
<span class="line"><span style="color: #D4D4D4">      mywobj.oframe := mycameratarget.cframe;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      !During the first cycle, run the </span><span style="color: #569CD6">program</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">until</span><span style="color: #D4D4D4"> this point,</span></span>
<span class="line"><span style="color: #D4D4D4">      !</span><span style="color: #569CD6">then</span><span style="color: #D4D4D4"> jog the tool </span><span style="color: #569CD6">to</span><span style="color: #D4D4D4"> the desired grip position and modpos myrobtarget.</span></span>
<span class="line"><span style="color: #D4D4D4">      MoveL myrobtarget, v100, fine, mytool \WObj:=mywobj;</span></span>
<span class="line"><span style="color: #D4D4D4">  ENDPROC</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>
In the example above, the VAR declarations are only shown for clarity, and should most likely be declared in the user module. Additionally, if only one job is being used, the camera job can be loaded (CamLoadJob) in a startup routine to cut down on job cycle time.</p>



<p class="wp-block-paragraph">To align the position of the targeted object identified by the camera to a robot position (for example, a pick or place position), you will need to run the procedure you created above through the point where the object frame of the workobject is loaded with the location data from the camera.<br>
<br>
What this will do is align the robot position you are about to teach to be relative to both the location of the camera coordinate system (defined by the calibration procedure above), as well as the recognized position of the target object within the coordinate system.<br>
<br>
You can now jog the robot to the desired position, being sure that the correct workobject and tool are loaded that will be used in your sequence, and save the position. Now, the position of the robot is defined as being relative to the identified position of the object, allowing the robot to consistently track the location and orientation of the object as it moves in the camera coordinate system.</p>



<h2 class="wp-block-heading" id="h-example">Example</h2>



<p class="wp-block-paragraph">In the pictures below, you can see how the camera is able to track the location and orientation of BB8 as he moves to various locations along a wall in our lab. To do so, I first created a part location tool called BB8_Finder. I chose to search just for his head, as I thought that would be the best way to find a consistent location and orientation for BB8.<br>
<br>
Pictured below is the reference picture used by the inspection tool, which looks like a BB8 mugshot.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-BB8-Finder_1.jpg" alt="Inspection tool reference picture"/></figure>



<p class="wp-block-paragraph">Once I had my tool configured, I took a few shots of BB8 in different positions and orientations to verify that I could successfully track his movement (and for the record, that is &#8220;The Force&#8221; holding BB8 in place and definitely not tape…). In the tables below, you can see the camera tracking the position and orientation of BB8 in each of the pictures (the origin is located in the top-left of the picture).</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-1.jpg" alt=""/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-1-Table-1.jpg" alt=""/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-2.jpg" alt=""/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-2-Table-2.jpg" alt=""/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-3.jpg" alt=""/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ABB-Blog-Test-Shot-3-Table-3.jpg" alt=""/></figure>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">You should now be able to track down and retrieve any droids you are looking for.&nbsp;</p>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/vision-inspection" target="_blank">Learn more about DMC&#8217;s Machine Vision Inspection and Integration Services.</a>&nbsp;</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22600/abb-vision-guided-movement-these-are-the-droids-youre-looking-for/">ABB Vision-Guided Movement – These ARE the Droids You’re Looking For</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Change a Fanuc Robot&#8217;s Default Speed on Cold Start</title>
		<link>https://static.dmcinfo.com/blog/23725/how-to-change-a-fanuc-robots-default-speed-on-cold-start/</link>
		
		<dc:creator><![CDATA[Frank May]]></dc:creator>
		<pubDate>Thu, 16 Nov 2017 11:24:27 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/23725/how-to-change-a-fanuc-robots-default-speed-on-cold-start/</guid>

					<description><![CDATA[<p>Short answer:&#160; $SCR.$coldovrd Long answer: The robot&apos;s done. Testing went perfectly, operators know how to start, stop, and reset the system from the HMI without ever needing to touch the Teach Pendant. Then, someone powers off the robot to do some maintenance and notices the robot is now unusually slow on powerup. You get a [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23725/how-to-change-a-fanuc-robots-default-speed-on-cold-start/">How to Change a Fanuc Robot&#8217;s Default Speed on Cold Start</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph"><strong>Short answer:&nbsp;</strong></p>

<blockquote class="is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">$SCR.$coldovrd</p>
</blockquote>

<p class="wp-block-paragraph"><strong>Long answer:</strong></p>

<p class="wp-block-paragraph">The robot&apos;s done. Testing went perfectly, operators know how to start, stop, and reset the system from the HMI without ever needing to touch the Teach Pendant. Then, someone powers off the robot to do some maintenance and notices the robot is now unusually slow on powerup. You get a phone call and want to tell them just to use the speed adjustment keys on the Teach Pendant after they power cycle the robot. However, you&apos;re a little uneasy that something else might go wrong if the Teach Pendant can&apos;t stay locked behind a cabinet&apos;s doors. You either drive to the site to follow these steps, or work remotely with someone at the robot with this guide.</p>

<p class="wp-block-paragraph">Note: Depending on the robot system you&apos;re using, the screens and menus might look different.&nbsp;</p>

<ol class="wp-block-list">
 <li>You have a backup of the robot, right? If not, back it up!</li>
 <li>Stop the robot, ensure it&apos;s ok to be unavailable for 15 minutes.</li>
 <li>Perform a Controlled Start: Turn the robot off, then turn it back on while holding the PREV and NEXT buttons until you see it started a Controlled Start.
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Teach Pendant Prev and Next buttons" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantPrevNextButtons_1_1.png"  /></p>

 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Teach Pendant Controlled Start Screen" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantControlledStartScreen_1.png"  /></p>
 </li>
 <li>&nbsp;</li>
 <li>Press&nbsp;[MENU] and select &quot;4 Variables.&quot;
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Teach Pendant Controlled Start Variable Menu" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantControlledStartVariables_1.png"  /></p>
 </li>
 <li>Scroll to $SCR and open it&nbsp;(used Shift+Arrow to move down faster).
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Teach Pendant Variable List" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantVariableList_1.png"  /></p>
 </li>
 <li>Scroll to $COLDOVRD within $SCR and enter in the new speed.
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Teach Pendant Variable Cold Override" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantVariableListColdOVRD_1.png"  /></p>
 </li>
 <li>Cold start the robot: Press [FCTN] and then select &quot;1 START (COLD).&quot;
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Cold Start" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantColdStart_1.png"  /></p>
 </li>
 <li>&nbsp;</li>
 <li>Notice the robot speed is now what you specified as $COLDOVRD. If it didn&apos;t go to that speed, power cycle the robot once. If it still isn&apos;t going to the $COLDOVRD speed after a power cycle, check the parameter again and contact FANUC if you still have issues.
 <p class="wp-block-paragraph" style="margin-left: 80px;"><img decoding="async" alt="Fanuc Speed" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucTeachPendantSpeed100_1.png"  /></p>
 </li>
</ol>

<h2 class="wp-block-heading">Flexibility</h2>

<p class="wp-block-paragraph">If you want more flexibility, you can use Override Select (Menu, Setup, Override Select) which lets you define 4 configurable override speeds that are selected from digital inputs (from a PLC, hardwired inputs, etc.).</p>

<h2 class="wp-block-heading">Safety</h2>

<p class="wp-block-paragraph">Be aware that the reason for 10% speed on startup is for safety. You don&apos;t want a robot running at 100% speed after someone turned the robot off, added a bunch of breakable dishes in front of the robot, and turned the robot back on. But, if you can ensure that the robot will always be safe running at the $COLDOVRD speed after any cold start, you and your robot should be good to go!</p>

<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/robotics"><strong>Learn more about DMC&apos;s robotic automation services.</strong></a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/23725/how-to-change-a-fanuc-robots-default-speed-on-cold-start/">How to Change a Fanuc Robot&#8217;s Default Speed on Cold Start</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cooking Up New Ideas (and BBQ) at DMC&#8217;s FedEx Day</title>
		<link>https://static.dmcinfo.com/blog/24406/cooking-up-new-ideas-and-bbq-at-dmcs-fedex-day/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Wed, 26 Apr 2017 16:09:46 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Boston]]></category>
		<category><![CDATA[Chicago]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Denver]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Houston]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[New York]]></category>
		<category><![CDATA[Siemens PLC]]></category>
		<category><![CDATA[Special Events]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Power BI]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/24406/cooking-up-new-ideas-and-bbq-at-dmcs-fedex-day/</guid>

					<description><![CDATA[<p>DMC recently held another one of our favorite company-wide traditions&#8230; FedEx Day! On FedEx Day, everyone in the company takes a break from their day-to-day tasks and works on a project that they think will improve DMC. It&#8217;s a great opportunity to collaborate with people we don&#8217;t normally work with, develop new skills, and have [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24406/cooking-up-new-ideas-and-bbq-at-dmcs-fedex-day/">Cooking Up New Ideas (and BBQ) at DMC&#8217;s FedEx Day</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DMC recently held another one of our favorite company-wide traditions&#8230; FedEx Day! On FedEx Day, everyone in the company takes a break from their day-to-day tasks and works on a project that they think will improve DMC. It&#8217;s a great opportunity to collaborate with people we don&#8217;t normally work with, develop new skills, and have fun.<br>
<br>
It&#8217;s called a FedEx Day because&nbsp;the planned project must be delivered by the end of the day. With five offices and more employees than ever, there were tons of projects going on that ranged from super technical internal improvement projects, to fun IoT improvements, to getting our hands dirty cooking for our colleagues or working in the garden.</p>



<p class="wp-block-paragraph">Here are just some of the projects DMC employees worked on this FedEx Day.&nbsp;</p>



<h2 class="wp-block-heading" id="h-dmc-boston">DMC Boston</h2>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/latest-thinking/blog/id/9417/smart-bike-lights"><strong><em>Bike SmartLights – Frank May</em></strong></a></p>



<p class="wp-block-paragraph">Frank&#8217;s car indicates with lights when he&nbsp;hits the&nbsp;brakes, and some cooler cars have lights that turn on when you walk up to the car. Frank wanted his bike to do the same, so he spent the day collaborating with the design firm <a href="http://www.altitudeinc.com/">Altitude</a>&nbsp;getting the core functionality of this working while enjoying getting to ride his bike around the office.<br>
<a href="https://static.dmcinfo.com/latest-thinking/blog/id/9417/smart-bike-lights">Learn more about this project.</a></p>



<p class="wp-block-paragraph"><iframe loading="lazy" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sZ5h3J__ZS4" width="560"></iframe></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Boston-FedEx-Day-April-2017-Smartlights.jpg" alt="Frank May of DMC Boston Works on his SmartLights project (left), his bike and project partner (right)."/></figure>



<p class="wp-block-paragraph"><br>
<strong><em>DMC Hydroponics – Phil Schaffer, Jirka Hladis, and Eric Baggen</em></strong></p>



<p class="wp-block-paragraph">Phil, Jirka, and Eric B. designed and built a hydroponics system with a time-lapse camera to grow various types of flowers to <em>exponentially </em>increase Zen in DMC Boston. The setup relies on a custom-made Ebb &amp; Flow System, continuously flooding and draining water, which removes the need for an additional aeration system.</p>



<p class="wp-block-paragraph"><iframe loading="lazy" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/D452UD52pko" width="560"></iframe></p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Boston-FedEx-Day-April-2017-Hydroponics-Eletric-Panel-and-Seeds-and-Planters.jpg" alt="DMC Boston FedEx Day April 2017 Planter, Seeds, Electric Panel. "/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Boston-FedEx-Day-April-2017-Hydropinics-setup-and-drillingjpg.jpg" alt=""/></figure>



<h2 class="wp-block-heading" id="h-dmc-chicago"><br>
DMC Chicago</h2>



<p class="wp-block-paragraph"><strong><em>Model Train – Gina Zak</em></strong></p>



<p class="wp-block-paragraph">Gina&nbsp;set up an N-scale model train set to run along the quad.&nbsp;The project is just in its beginning phases with wiring the track, power supply, and model building lights. Eventually, they&#8217;d like to have the train run all the way around their quad with automated bridges! &nbsp; &nbsp; &nbsp;&nbsp;</p>



<p class="wp-block-paragraph">&nbsp;<br>
​​​​​​<br>
<strong><em>Cooking for Colleagues – Smoked Meat, Mac n’ Cheese, Cornbread and Coleslaw – Patrick Corcoran, Spencer Glesmann, Grant Anderson, Molly Graham, Amy Costello, Heather Talbert, Elisha Harris, John Toljanic, Courtney Mitchell</em></strong></p>



<p class="wp-block-paragraph">Patrick and Spencer took the lead planning a follow-up to the Cooking for Colleagues&nbsp;initiative that our President&nbsp;Frank Riordan kicked off at the <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9369/fedex-day-fosters-continuous-innovation">last FedEx Day</a>.</p>



<p class="wp-block-paragraph">For this FedEx Day, Patrick and Spencer pulled out all the stops and planned a smoked meat feast that included brisket and pork butt, coleslaw, cornbread muffins, and 50 lbs. of <a href="http://www.spoonforkbacon.com/2014/04/creamy-skillet-mac-cheese/">mac n&#8217; cheese</a>. They worked tirelessly overnight using Patrick&#8217;s smoker to prepare the meat in&nbsp;DMC&#8217;s parking lot. It took lots of mini-teams to pull everything together, but it was more than worth the labor.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-Cooking-for-Colleagues-Cornbread-Cooking-and-Finished-Product-Centered.jpg" alt="DMC Chicago FedEx Day April 2017 Heather and Molly mix up cornbread muffins, seen finished on the left."/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-Cooking-for-Colleagues-Grant-Courtney-and-John-T-High-Res.jpg" alt="Cooking for Colleagues team members work on getting the mac n' cheese ready to go for lunch."/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-Cooking-for-Colleagues-Slicing-Smoked-Meat-High-Res-Centered.jpg" alt="Spencer rests while spending the night at DMC smoking meat, delicious brisket is sliced, Spencer and Patrick help slice and serve smoked meats in the kitchen."/></figure>



<p class="wp-block-paragraph">Between the meat, the mac n&#8217; cheese, the coleslaw, and the cornbread, there was enough food to feed everyone for lunch on FedEx day&#8230; and again on Friday when we all met to review&nbsp;our completed projects.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-Cooking-for-Colleagues-Time-to-eat-hi-res.jpg" alt="DMC Chicago employees wait in line to plate up food."/></figure>



<p class="wp-block-paragraph"><br>
<em><strong>Ping Pong Demo – Beth Reinert</strong></em></p>



<p class="wp-block-paragraph">Beth spent FedEx day continuing to rework the ping pong demo, which uses LabVIEW to play solo. She focused on&nbsp;ensuring the demo correctly locates the ball&#8217;s current position, predicts the ball’s path accurately, and actuates the solenoid at the correct time to hit the ball.</p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph"><br>
<em><strong>Custom Tap Handles – Nikhil Holay, Jeff McCormick, David Sestrich, Ken Brey</strong></em></p>



<p class="wp-block-paragraph">Nikhil, Jeff, David, and Ken built engraved wooden tap handles for our kegerator. They used Fusion 360 for the CAD modeling/G-code generation, and the X-Carve in our office lab for the actual cutting.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-xCarv-tap-handles.jpg" alt="Jeff McCormick and Nikhil Holday use the xCarv to make custom tap handles for the Kegerator. Ken Brey came in for this assist. "/></figure>



<p class="wp-block-paragraph"><br>
<br>
<br>
<em><strong>DMC Ping Pong App – Jordan Harris and Curtis Weir</strong></em></p>



<p class="wp-block-paragraph">DMC&#8217;s ping pong app uses a GoPro to record pong sessions and ranks players by their wins and losses. Curtis and Jordan worked on replacing the old GoPro Hero3 with a new GoPro Hero5 Session camera. They also updated the replay capture code on the Ping Pong App to use the new camera and upload replays to YouTube.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Ping-Pong-GoPro-Code.jpg" alt="Screenshot of the Ping Pong App UI."/></figure>



<p class="wp-block-paragraph">We all look forward to more crazy ping pong shots being caught on camera!</p>



<p class="wp-block-paragraph"><iframe loading="lazy" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/72Q6_8Cv3yQ" width="560"></iframe><br>
<br>
<br>
<em><strong>DMC Rooftop Garden &#8211; Anne Patterson, Jimmy Brady, Deborah Nunaley, Heather Talbert, Lexi Torres, Molly Graham, Natalie Meeker, Alex Krejcie, Matt Goedke</strong></em></p>



<p class="wp-block-paragraph">The DMC <a href="https://static.dmcinfo.com/latest-thinking/blog/id/8817/moisture-sensing-automatic-garden-watering-system">rooftop garden</a> is turning five&nbsp;this year, and the garden crew spent part of the day prepping the soil for planting in May. An additional team worked to update the automatic watering system&#8217;s moisture detection. &nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-Chicago-FedEx-Day-April-2017-Gardening-Prep.jpg" alt="Lexi, Heather, and Jimmy prep the soil for planing in May in the Chicago rooftop garden. "/></figure>



<p class="wp-block-paragraph"><br>
<strong>Monitoring Moisture and Repairing the Auto Watering System</strong></p>



<p class="wp-block-paragraph">Natalie and Alex used <a href="https://powerbi.microsoft.com/en-us/?WT.srch=1&amp;WT.mc_id=AID559406__SEM_DW4pgaXs&amp;utm_campaign=PBIQ4Relaunch&amp;utm_keyword=power%20bi&amp;gclid=CJGy58rz6NMCFQcIaQodXbYGQQ">Power BI</a> to work on moisture content detection.There is a wi-fi chip that <a href="https://www.arm.com/">ARM</a>’s embedded IoT platform uses to talk&nbsp;to <a href="https://azure.microsoft.com/en-us/">Azure</a>&nbsp;and Azure talks to us.&nbsp;This allows the watering system to track moisture over time, keep the plants happy with water as they need it, and prevents accidental flooding of the garden and the roof!</p>



<p class="wp-block-paragraph"><br>
<br>
<br>
<br>
<br>
Unfortunately, it won&#8217;t water the office dogs, but they did&nbsp;check out the roof while everyone worked on the garden.<br>
<br>
<br>
&nbsp;</p>



<h2 class="wp-block-heading" id="h-dmc-denver">DMC Denver</h2>



<p class="wp-block-paragraph"><em><strong>RF Chamber – Boris Cherkasskiy</strong></em></p>



<p class="wp-block-paragraph">The aim of this project was to create a basic RF test lab to perform rough FCC pre-pre-compliance (not an official term) validation at the DMC office before committing to the full test at an external lab.&nbsp;The team built and tested&nbsp;a portable/collapsible RF semi-anechoic enclosure, utilizing nylon-based nickel/copper fabric and a removable lid with transparent mesh for an easy access and visual monitoring.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Boris-RF-Chamber.jpg" alt="RF Chamber built by Boris at DMC Denver."/></figure>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph"><strong><em>Drink Bot Project &#8211; Cameron Fyfe and Ross Bunker</em></strong></p>



<p class="wp-block-paragraph">Cameron and Ross worked on the Denver drink bot, a portable demo that utilizes Siemens hardware to mix drinks, similar to <a href="https://static.dmcinfo.com/blog/26514/dmcs-mad-science-drinxperiment-with-siemens-plcs/" type="post" id="26514">Boston&#8217;s Drinxperiment.</a> This update for the drink bot included integrating <a href="https://support.microsoft.com/en-us/help/17214/windows-10-what-is">Cortana</a>. The Drink Bot will debut at the <a href="http://www.industry.usa.siemens.com/AUTOMATION/US/EN/Pages/automation-technology.aspx">Siemens</a><a href="https://events.sw.siemens.com/en-US/"> Automation Summit</a> in June which will <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9411/2017-siemens-automation-summit-to-feature-4-dmc-presentations">feature 5 DMC Presentations</a>. </p>



<p class="wp-block-paragraph"><iframe loading="lazy" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/SrqpMT5M8so" width="560">&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;!&#8211;cke_bookmark_323S&#8211;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;!&#8211;cke_bookmark_323E&#8211;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</iframe></p>



<h2 class="wp-block-heading" id="h-dmc-houston">DMC Houston</h2>



<p class="wp-block-paragraph">DMC Houston spent time making their office more beautiful&nbsp;following&nbsp;their recent <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9404/dmc-houston-office-expansion-is-underway">office expansion</a>.</p>



<h2 class="wp-block-heading" id="h-dmc-new-york">DMC New York</h2>



<p class="wp-block-paragraph"><em><strong>Grocery App – Simon Healey and Liz Rapoport</strong></em></p>



<p class="wp-block-paragraph">Liz and Simon worked on a grocery app to make restocking the office kitchen faster and easier.&nbsp;To speed up the process, they wrote a WPF application that connects to a database with a list of their most ordered items and lets them select directly from the app. They&nbsp;just add items to the cart, then press one button which compiles the list and emails it to Cat, the Administrative Assistant in Boston.<br>
<br>
</p>



<p class="wp-block-paragraph">&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/DMC-New-York-FedEx-Day-April-2017-Grocery-App-Emailjpg.jpg" alt="Screenshot of email to Cat in Boston from DMC New York ordering groceries. "/></figure>



<p class="wp-block-paragraph"><br>
<strong><em>Office Beautification</em></strong></p>



<p class="wp-block-paragraph">DMC New York also spent some time making their office space more organized and beautiful. They hung shelves and organized their lab. They also found a space to hang their college pennants!</p>



<p class="wp-block-paragraph"><br>
<br>
FedEx Day is just one more reason DMC continues to be named one of&nbsp;<a href="https://static.dmcinfo.com/latest-thinking/blog/id/9401/dmc-makes-list-of-chicagos-top-5-places-to-work">Crain&#8217;s Best Places to Work</a>&nbsp;in Chicago.&nbsp;</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24406/cooking-up-new-ideas-and-bbq-at-dmcs-fedex-day/">Cooking Up New Ideas (and BBQ) at DMC&#8217;s FedEx Day</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Use FANUC PC Developer&#8217;s Kit (PCDK)</title>
		<link>https://static.dmcinfo.com/blog/25767/how-to-use-fanuc-pc-developers-kit-pcdk/</link>
		
		<dc:creator><![CDATA[Frank May]]></dc:creator>
		<pubDate>Tue, 26 Apr 2016 12:38:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Motion Control]]></category>
		<category><![CDATA[PC Application Development]]></category>
		<category><![CDATA[C# .NET Application Development]]></category>
		<category><![CDATA[Robotics]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/25767/how-to-use-fanuc-pc-developers-kit-pcdk/</guid>

					<description><![CDATA[<p>FANUC offers an easy way to command and configure a robot from a PC using their PC Developer&#8217;s Kit (PCDK).The kit allows a PC to access variables, registers, IO, programs, positions, and alarms on the robot. Most of the help documentation already covers Visual Basic, so I&#8217;ll explain how to get started with C#. Installation [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25767/how-to-use-fanuc-pc-developers-kit-pcdk/">How to Use FANUC PC Developer&#8217;s Kit (PCDK)</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">FANUC offers an easy way to command and configure a robot from a PC using their PC Developer&#8217;s Kit (<a href="https://www.fanucamerica.com/products/robots/software" target="_blank" rel="noreferrer noopener">PCDK</a>).The kit allows a PC to access variables, registers, IO, programs, positions, and alarms on the robot. Most of the help documentation already covers Visual Basic, so I&#8217;ll explain how to get started with C#.</p>



<h2 class="wp-block-heading" id="h-installation"><strong>Installation</strong></h2>



<p class="wp-block-paragraph">First step is to install Visual Studio.&nbsp;<a href="https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx" target="_blank">Visual Studio Community</a>&nbsp;is free and works perfectly for this application.</p>



<p class="wp-block-paragraph">After installing Visual Studio, go through the PCDK installer.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucPCDK.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-getting-started-with-fanuc-pcdk"><strong>Getting Started with FANUC PCDK</strong></h2>



<p class="wp-block-paragraph">Next, start up Visual Studio and create a new Console Application. I called mine &#8220;FanucTest&#8221;.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucConsoleApplication.png" alt="FANUC Console application "/></figure>



<p class="wp-block-paragraph">After clicking OK, right click on the &#8220;References&#8221; in the solution, and click &#8220;Add Reference&#8221;.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucReferences.png" alt="FANUC project references "/></figure>



<p class="wp-block-paragraph">Under COM, find FANUC Robotics Controller Interface. Select it and click OK.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/FanucCOM.png" alt="FANUC COM Reference"/></figure>



<p class="wp-block-paragraph">Now to begin writing code!</p>



<h2 class="wp-block-heading" id="h-connecting-to-a-robot"><strong>Connecting to a Robot</strong></h2>



<p class="wp-block-paragraph">Add the following highlighted lines to your code to connect to your robot. If this runs, you&#8217;ve <b>successfully</b> installed PCDK and you&#8217;re ready to communicate with your robot.&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FRRobot;      //uses the robot reference we just added

namespace FanucTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();

            //Create a robot object
            FRCRobot mobjRobot = new FRCRobot();
            //Connect to your robot
            mobjRobot.Connect("192.168.1.123");
            bool connected = mobjRobot.IsConnected;

        }

    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Collections</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Generic</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Linq</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Threading</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Tasks</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FRRobot</span><span style="color: #D4D4D4">;      </span><span style="color: #6A9955">//uses the robot reference we just added</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FanucTest</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Program</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Main</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Press any key to continue...&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ReadKey</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">            //Create a robot object</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">FRCRobot</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mobjRobot</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FRCRobot</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #6A9955">            //Connect to your robot</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">mobjRobot</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Connect</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;192.168.1.123&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">connected</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">mobjRobot</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">IsConnected</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">&nbsp;</p>



<h2 class="wp-block-heading" id="h-updating-a-position-register">Updating a Position Register</h2>



<p class="wp-block-paragraph">To finish off this hello world program, add the following lines of code to update a position register. We&#8217;re accessing position register 1 below and updating the values.&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  //See help topics "Efficient Access to Positions"
            FRCSysPositions sysPositions = mobjRobot.RegPositions;
            FRCSysPosition sysPosition = sysPositions&#91;1&#93;;
            FRCSysGroupPosition sysGroupPosition = sysPosition.Group&#91;1&#93;;
            FRCXyzWpr xyzWpr = sysGroupPosition.Formats&#91;FRETypeCodeConstants.frXyzWpr&#93;;
            //Prepare updated X,Y,Z,W,P, and R values of position register 1
            xyzWpr.X = 475;
            xyzWpr.Y = -275;
            xyzWpr.Z = -231;
            xyzWpr.W = -176;
            xyzWpr.P = 0;
            xyzWpr.R = 0;
            try
            {
                //Update position register 1
                sysGroupPosition.Update();

            }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">  //See help topics &quot;Efficient Access to Positions&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">FRCSysPositions</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sysPositions</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">mobjRobot</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">RegPositions</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">FRCSysPosition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sysPosition</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sysPositions</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">FRCSysGroupPosition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sysGroupPosition</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sysPosition</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Group</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">FRCXyzWpr</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sysGroupPosition</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Formats</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">FRETypeCodeConstants</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">frXyzWpr</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #6A9955">            //Prepare updated X,Y,Z,W,P, and R values of position register 1</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">X</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">475</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Y</span><span style="color: #D4D4D4"> = -</span><span style="color: #B5CEA8">275</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Z</span><span style="color: #D4D4D4"> = -</span><span style="color: #B5CEA8">231</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">W</span><span style="color: #D4D4D4"> = -</span><span style="color: #B5CEA8">176</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">P</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">xyzWpr</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">R</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">try</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #6A9955">                //Update position register 1</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sysGroupPosition</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Update</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span></code></pre></div>



<p class="wp-block-paragraph">To learn how to do more with the robot, check out the PCDK help documentation. Depending on your version of Windows, you might need to install another program to view the help documentation.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/PCDKHelp.png" alt=""/></figure>



<p class="wp-block-paragraph"><a href="/services/manufacturing-automation-and-intelligence">Learn more about DMC&#8217;s Manufacturing and Automation Intelligence services</a>&nbsp;and <a href="https://static.dmcinfo.com/contact">contact us</a> today!</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25767/how-to-use-fanuc-pc-developers-kit-pcdk/">How to Use FANUC PC Developer&#8217;s Kit (PCDK)</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Robot Operating System: What is ROS?</title>
		<link>https://static.dmcinfo.com/blog/26121/the-robot-operating-system-what-is-ros/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 24 Nov 2015 16:10:37 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Robotics]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/26121/the-robot-operating-system-what-is-ros/</guid>

					<description><![CDATA[<p>It&#8217;s a tool for robotics research collaboration. It&#8217;s a communication protocol, an open source library of interesting robotics software, and a useful prototyping tool. Depending on who you ask, ROS can be a lot of things. Literally, it stands for Robot Operating System. It&#8217;s one the hottest topics in the field of robotics, and if [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/26121/the-robot-operating-system-what-is-ros/">The Robot Operating System: What is ROS?</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">It&rsquo;s a tool for robotics research collaboration. It&rsquo;s a communication protocol, an open source library of interesting robotics software, and a useful prototyping tool. Depending on who you ask, ROS can be a lot of things. Literally, it stands for Robot Operating System. It&rsquo;s one the hottest topics in the field of robotics, and if you ask, &ldquo;What is ROS?&rdquo; to five different people, you may get five different answers!</p>

<p class="wp-block-paragraph">Robots are complex systems with a lot of different parts. Ideally, the components of most complex systems should be modular and encapsulated. Each part should be able to function with minimal dependency on a different part. At the very core, that&rsquo;s what ROS provides. Components of a robot, be it the vision system, the arms, or a microcontroller can be separated into nodes that communicate with each other through a common communication standard, called topics.</p>

<p class="wp-block-paragraph">But that&rsquo;s not all. Any component can talk to any other component because the sender sends the message packet in the format that the receiver would get, all managed by the master ROS node. So the only major requirement for integrating different parts of a robot is to make sure that the topics expected are the topics being sent. Suddenly, the need to make complex drivers for new systems is gone. Let your new component be a new node and make sure any messages it sends out is in a ROS topic. Now any other component should be able to recognize the topic and get information.</p>

<p class="wp-block-paragraph">Suddenly, a roboticist somewhere writes some amazing computer vision software, and another roboticist on the other side of the world can easily integrate that software with the robot he already has. As you might expect, the power to collaborate has opened the way for open-source robotics software. Projects can be exported as packages, which function similarly to software libraries.</p>

<p class="wp-block-paragraph">ROS is <a href="https://www.youtube.com/watch?v=PGaXiLZD2KQ" target="_blank">growing and growing</a>. As development gets faster due to the abundance of software packages available online, more and more packages are added to the ever growing global ROS library. And more packages means that people have even more reasons to start using ROS in their own projects, projects get off the ground faster, and it becomes easier to do cool and crazy robotics stuff like <a href="https://www.youtube.com/watch?v=66Vo7BIITrg" target="_blank">controlling a robot&rsquo;s head with an Oculus Rift</a>.</p>

<p class="wp-block-paragraph"><a href="/services/manufacturing-automation-and-intelligence/robotics">Learn more about DMC&apos;s robotic automation and integration services.</a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/26121/the-robot-operating-system-what-is-ros/">The Robot Operating System: What is ROS?</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
