<?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>Robots for Roboticists &#8211; Robohub</title>
	<atom:link href="https://robohub.org/author/david-kohanbash/feed/" rel="self" type="application/rss+xml" />
	<link>https://robohub.org</link>
	<description>Connecting the robotics community to the world</description>
	<lastBuildDate>Sun, 04 Oct 2026 22:58:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Hands on ground robot &#038; drone design series part I: mechanical &#038; wheels</title>
		<link>https://robohub.org/hands-on-ground-robot-drone-design-series-part-i-mechanical-wheels/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 01 Mar 2022 09:57:58 +0000</pubDate>
				<category><![CDATA[tutorials]]></category>
		<guid isPermaLink="false">https://robohub.org/?p=203673</guid>

					<description><![CDATA[This is a new series looking at the detailed design of various robots. To start with we will be looking at the design of two different robots that were used for the DARPA Subterranean Challenge. Both of these robots were designed for operating in complex subterranean environments, including Caves, Mines &#038; Urban environments. Both of [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="attachment_203674" style="width: 1034px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-203674" src="https://robohub.org/wp-content/uploads/2022/03/subt_robots-1024x554.jpg" alt="" width="1024" height="554" class="size-large wp-image-203674" srcset="https://robohub.org/wp-content/uploads/2022/03/subt_robots-1024x554.jpg 1024w, https://robohub.org/wp-content/uploads/2022/03/subt_robots-425x230.jpg 425w, https://robohub.org/wp-content/uploads/2022/03/subt_robots-768x415.jpg 768w, https://robohub.org/wp-content/uploads/2022/03/subt_robots.jpg 1313w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-203674" class="wp-caption-text">Source: <a href="https://www.subt-explorer.com/post/fall-2020-update" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://www.subt-explorer.com/post/fall-2020-update</a></p></div>
<p>This is a new series looking at the detailed design of various robots. To start with we will be looking at the design of two different robots that were used for the <a href="https://www.subtchallenge.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">DARPA Subterranean Challenge</a>. Both of these robots were designed for operating in complex subterranean environments, including Caves, Mines &#038; Urban environments. Both of these robots presented are from the Carnegie Mellon University <a href="https://www.subt-explorer.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Explorer team</a>. While I am writing these posts, this was a team effort that required many people to be successful. (If anyone on Team Explorer is reading this, thank you for everything, you are all awesome.)</p>
<p>These posts are skipping the system requirements step of the design process. <a href="http://robotsforroboticists.com/systems-engineering/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">See here for more details on defining system requirements</a>.</p>
<div id="attachment_203675" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-203675" src="https://robohub.org/wp-content/uploads/2022/03/SubT_UGV_Drone-1024x633.jpg" alt="" width="1024" height="633" class="size-large wp-image-203675" srcset="https://robohub.org/wp-content/uploads/2022/03/SubT_UGV_Drone-1024x633.jpg 1024w, https://robohub.org/wp-content/uploads/2022/03/SubT_UGV_Drone-425x263.jpg 425w, https://robohub.org/wp-content/uploads/2022/03/SubT_UGV_Drone-768x475.jpg 768w, https://robohub.org/wp-content/uploads/2022/03/SubT_UGV_Drone.jpg 1098w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-203675" class="wp-caption-text">SubT Ground UGV and DS Drone ImageTeam Explorer R1 Ground Robot and DS Drone <a href="https://www.subt-explorer.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><em>[Source]</em></a></p></div>
<h3>R3 Ground robot (UGV)</h3>
<p>For the SubT challenge three ground vehicles were developed all of a similiar design. The ground robots were known with the moniker of R#, where # is the order we built them in. The primary difference between the three versions are</p>
<p><strong>R1</strong> – Static Chassis, so the chassis has minimal ground compliance when driving over obstacles and uneven surfaces. R1 was initially supposed to have a differencing mechanism for compliance, however due to time constraints it was left out from this first version. R1 is pictured above.</p>
<p><strong>R2</strong> – Has the differencing mechanism and was designed as initially planned.</p>
<p><strong>R3</strong> – Is almost identical to R2, but smaller. This robot was built for navigating smaller areas and also to be able to climb up and down steps. It also uses different motors for the driving the wheels.</p>
<h3>DS drone</h3>
<p>The original drone design used by Team Explorer called their drones <em>D1</em>, <em>D2</em>, etc.. This let a combination of UGV +Drone go by joint designations such as <em>R2D2</em>. Early on, the team switched to a smaller drone design that was referred to as <em>DS1</em>, <em>DS2</em>, etc.. Where <em>DS</em> is short for <em>Drone Small</em>.</p>
<p>The drone design post are split into two sections. The first is about the actual drone platform, and the second is about the payload that sat on top of the drone. </p>
<h2>Mechanical &#038; wheels</h2>
<img decoding="async" src="https://robohub.org/wp-content/uploads/2022/03/modular_robot_design.jpg" alt="" width="577" height="430" class="aligncenter size-full wp-image-203676" srcset="https://robohub.org/wp-content/uploads/2022/03/modular_robot_design.jpg 577w, https://robohub.org/wp-content/uploads/2022/03/modular_robot_design-425x317.jpg 425w" sizes="(max-width: 577px) 100vw, 577px" />
<h3>Robot size decision</h3>
<p>After we have the list of <a href="http://robotsforroboticists.com/systems-engineering/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">system requirements</a> we start with the design of the mechanical structure of the robot. In this case we decided that a wheeled robot would be best. We wanted to have the largest wheels possible to help climb over obstacles, however, we also needed to keep our sensors at the top of the vehicle above the wheels and be able to fit in openings 1 x 1 meters. These requirements set the maximum size of the robot as well as the maximum size of the wheels. </p>
<img decoding="async" src="https://robohub.org/wp-content/uploads/2022/03/pastedImage0-1024x569.jpeg" alt="" width="1024" height="569" class="aligncenter size-large wp-image-203677" srcset="https://robohub.org/wp-content/uploads/2022/03/pastedImage0-1024x569.jpeg 1024w, https://robohub.org/wp-content/uploads/2022/03/pastedImage0-425x236.jpeg 425w, https://robohub.org/wp-content/uploads/2022/03/pastedImage0-768x427.jpeg 768w, https://robohub.org/wp-content/uploads/2022/03/pastedImage0-1536x853.jpeg 1536w, https://robohub.org/wp-content/uploads/2022/03/pastedImage0.jpeg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>The final dimensions of the first two vehicles (R1 and R2) were around (L x W x H) 1.2 x 0.8 x 0.8 meters (3.9 x 2.6 x 2.6 ft). The third smaller vehicle was around 1 x 0.6 m (3.2 x 1.9 ft) and designed to fit through 0.7×0.7 m openings.</p>
<h3>Steering approach</h3>
<p>Early on we also needed to determine the method of driving. Do we want wheels or tracks? Do we want to steer with ackerman steering, rocker-bogie, skid steer, etc.?</p>
<p><a href="http://robotsforroboticists.com/drive-selection/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">See here for more details on steering selection.</a></p>
<p>We chose to use a skid steer four wheeled drive approach for the simplicity of control and the ability to turn in place (point turns). At the start of the competition we were not focused on stair climbing, which might have changed some of our design decisions.</p>
<h3>Suspension</h3>
<p>The next step was to determine the suspension type. A suspension is needed so that all four of the wheels make contact with the ground. If the robot had a static fixed frame only three of the wheels might make contact with the ground when on uneven surfaces. This would reduce our stability and traction.</p>
<p>We decided early on that we wanted a passive suspension for the simplicity of not having active components. With a passive suspension we were looking at different type of body averaging. We roughly had two choices, front-pivot or side-to-side.</p>
<div id="attachment_203678" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-203678" src="https://robohub.org/wp-content/uploads/2022/03/body_averaging_methods-1024x361.jpg" alt="" width="1024" height="361" class="size-large wp-image-203678" srcset="https://robohub.org/wp-content/uploads/2022/03/body_averaging_methods-1024x361.jpg 1024w, https://robohub.org/wp-content/uploads/2022/03/body_averaging_methods-425x150.jpg 425w, https://robohub.org/wp-content/uploads/2022/03/body_averaging_methods-768x271.jpg 768w, https://robohub.org/wp-content/uploads/2022/03/body_averaging_methods.jpg 1217w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-203678" class="wp-caption-text">Left image shows a front-pivot approach. Right image shows a side-to-side differencing method.</p></div>
<p>We decided to choose the front-pivot method, however we decided to make the pivot be roughly centered in the vehicle. This allowed us to put all of the electronics in the front and the batteries in the rear. The front-pivot method we felt would be better for climbing up stairs and for climbing over obstacles on level’ish terrain. Also importantly this approach made it easier to carry a drone on the ground vehicle.</p>
<h3>Chassis design</h3>
<p>At this point we started designing the chassis. This was an important step so that we could estimate the total weight in order to spec the drive-train. Ideas for the chassis were everything from building with 80/20 to building an aluminum frame and populating it with components, to a solid welded chassis. We selected to use a welded steel tube chassis for the strength. We needed a robot that could survive anything we did to it. This proved to be a wise decision when the robot crashed or fell over cliffs. The downside of the steel was increased mass.</p>
<p>For the pivot we found a large <a href="https://www.mcmaster.com/2010N26/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">crossed roller bearing</a> that we were able to use to attach the two steel boxes together. The large bore in the middle was useful for passing wires/cables through for batteries, motors, etc&#8230;</p>
<img decoding="async" src="https://robohub.org/wp-content/uploads/2022/03/jpgbase64c08692f2dfef3d84.jpg" alt="" width="277" height="406" class="aligncenter size-full wp-image-203681" />
<p>Part of the chassis design was also determining where all of the components should mount. Having the batteries (green boxes in image above) in the rear helps us climb obstacles. Other goals were to keep the ground clearance as high as possible while keeping the center of gravity (CG) as low as possible. Since those are competing goals, part of the design process was to develop a happy medium.</p>
<p>In order to maintain modularity for service, each wheel module had the motor controller, motor, gear box, and bearing block as a solid unit that could be swapped between robots if there was any issues. This also allowed most of the wiring to be part of that block. The only cables that needed to be connected to each of the modules from the robot were power, CAN communications, and the emergency stop line; all of which were connectorized.</p>
<p>For electronics on R1 and R2 we built an electronics box that was separate from the robot and could be removed from the robot as needed. On R3 we built the electronics into the robot itself. This modular approach was very useful when we had to do some welding to the chassis post-build for modifications. The downside of the modular approach for electronics was that working in the electronics box was more difficult then in the open R3. Also the time for fabricating and wiring the R1/R2 electronics boxes was considerably more than the open R3 electronics. We also had several failures during testing related to the connectors from the electronics boxes.</p>
<h3>Wheel design</h3>
<p>We debated a lot about what type of wheel to use, ultimately we used motorcycle wheels due to the simplicity of obtaining them and mounting them. The wheel diameter we desired also lined up very well with motorcycle wheels. In order to get better traction and ability to climb over obstacles we liked the wider tires.</p>
<p>R1 and R2 had a wheel diameter of 0.55m, R3 had a wheel diameter of 0.38m. This gave R1 and R2 a ground clearance of 0.2m, and R3 a ground clearance of 0.12m.</p>
<p>The wheel hubs ended up being a different story. We found solid metal rims that we had to machine large amounts of metal out of in order to balance the strength and the weight.</p>
<p>The R1 and R2 robots were around 180kg (400lb)*, the wheels were for a vehicle significantly heavier. As such we put a small amount of pressure in the wheels to keep them from falling off, however we tried to keep the pressure low to increase the ground compliance of the wheels. This method added a very small amount of compliance, we tried removing some of the rubber from the sidewalls, but was not able to get a happy medium between limiting the wheel deforming during point turns and increasing ground compliance.</p>
<p>We were also concerned how the motorcycle tires would do when point turning and if we would rip the wheels from the rims. To counter this we installed a beadlock system into each of the wheels. The beadlock was a curved segment installed in multiple places to sandwich the tire to the rim. We never had a wheel separate from the rim, so our approach definitely worked, however it was a pain to install.</p>
<p><em>*R3 was around 90 kg (200 lbs). We tried using different wheels and tracks to get R3 to climb stairs well. However that story is for another post&#8230;</em></p>
<div id="attachment_203682" style="width: 889px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-203682" src="https://robohub.org/wp-content/uploads/2022/03/image-4.jpg" alt="" width="879" height="437" class="size-full wp-image-203682" srcset="https://robohub.org/wp-content/uploads/2022/03/image-4.jpg 879w, https://robohub.org/wp-content/uploads/2022/03/image-4-425x211.jpg 425w, https://robohub.org/wp-content/uploads/2022/03/image-4-768x382.jpg 768w" sizes="(max-width: 879px) 100vw, 879px" /><p id="caption-attachment-203682" class="wp-caption-text">The black rims were solid metal that we machined the wedges into in order to lightweight them. The 3 metal posts in those wedges are the beadlock tensioning bolts. You can also see the castle nut and pin that holds the wheel to the axle. This image is from R2, you can see the gap between the front and rear sections of the robot where the pivot is.</p></div>
<h3>Drive-train selection</h3>
<p>Now that we had a mass estimate and system requirements for speed and obstacle clearance we can start to spec the drive-train. The other piece of information that we needed and had to discuss with the electrical team was the voltage of the battery. Different bus voltages greatly affects the motors available for a given speed and torque. We decided on a 51.2v nominal bus voltage. This presented a problem since it was very hard to find the speed/torques we wanted at that voltage. We ended up selecting a 400W 1/2HP motor+gearbox from <a href="http://robotsforroboticists.com/wiring-oriental-motor-series-motors/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Oriental Motors</a> with a parallel 100:1 gearbox that allows us to drive at a maximum speed of 2.5m/s. </p>
<img decoding="async" src="https://robohub.org/wp-content/uploads/2022/03/pngbase6469cfbeba6593c292.png" alt="" width="190" height="207" class="aligncenter size-full wp-image-203683" />
<p>The part numbers of the motors and gearbox on R1 and R2 were <a href="https://catalog.orientalmotor.com/item/all-categories-components/ponents-pinion-shaft-motors-for-use-with-gearheads/blvm640n-gfs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BLVM640N-GFS</a> + <a href="https://catalog.orientalmotor.com/item/all-categories-components/gearheads-2/gfs6g100fr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GFS6G100FR</a>.</p>
<p>The part numbers of the motors and gearbox on the smaller R3 were Maxon EC 90 Flat + GP81A.</p>
<h2>Next steps</h2>
<p>Now that we know the mechanics of the robot we can start building it. In the next post we will start looking at the electronics and motor controls. While the nature of the blog makes it seem that this design is a serial process, in reality lots of things are happening in parallel. While the mechanical team is designing the chassis, the electrical team is finding the electrical components needed in order for the mechanical person to know what needs mounted.</p>
<p>It is also important to work with the electrical team to figure out wire routing while the chassis is being developed.</p>
<hr>
<p><strong>Note of the editor:</strong> This post has been merged from the posts &#8220;<a href="http://robotsforroboticists.com/hands-on-ground-robot-drone-design-series/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Hands On Ground Robot &#038; Drone Design Series</a>&#8221; and &#8220;<a href="http://robotsforroboticists.com/mechanical-wheels-hands-on-ground-robot-design/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mechanical &#038; Wheels – Hands On Ground Robot Design</a>&#8220;.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Intel RealSense 3D Camera for robotics &#038; SLAM (with code)</title>
		<link>https://robohub.org/intel-realsense-3d-camera-for-robotics-slam-with-code/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Thu, 12 Sep 2019 13:00:33 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">https://robohub.org/intel-realsense-3d-camera-for-robotics-slam-with-code/</guid>

					<description><![CDATA[The Intel RealSense cameras have been gaining in popularity for the past few years for use as a 3D camera and for visual odometry. I had the chance to hear a presentation from Daniel Piro about using the Intel RealSense cameras generally and for SLAM (...]]></description>
										<content:encoded><![CDATA[<div id="attachment_145444" style="width: 1610px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-145444" src="https://robohub.org/wp-content/uploads/2019/09/IntelRealSense.jpeg" alt="" width="1600" height="998" class="size-full wp-image-145444" srcset="https://robohub.org/wp-content/uploads/2019/09/IntelRealSense.jpeg 1600w, https://robohub.org/wp-content/uploads/2019/09/IntelRealSense-425x265.jpeg 425w, https://robohub.org/wp-content/uploads/2019/09/IntelRealSense-768x479.jpeg 768w, https://robohub.org/wp-content/uploads/2019/09/IntelRealSense-1024x639.jpeg 1024w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-145444" class="wp-caption-text">The Intel® RealSense<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> D400 Depth Cameras. Credit: Intel Corporation</p></div>
<p>The <a href="https://www.intelrealsense.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Intel RealSense</a> cameras have been gaining in popularity for the past few years for use as a 3D camera and for visual odometry. I had the chance to hear a presentation from Daniel Piro about using the Intel RealSense cameras generally and for SLAM (Simultaneous Localization and Mapping). The following post is based on his talk.</p>
<p><span id="more-144963"></span></p>
<p><img decoding="async" width="250" height="180" src="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Depth-vs-color-image.png?fit=250%2C180" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Comparing depth and color RGB images" srcset="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Depth-vs-color-image.png?w=436 436w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Depth-vs-color-image.png?resize=300%2C216 300w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Depth-vs-color-image.png?resize=250%2C180 250w" sizes="(max-width: 250px) 100vw, 250px"></p>
<h2>Depth Camera (D400 series)</h2>
<p>Depth information is important since that gives us the information needed to understand shapes, sizes, and distance. This lets us (or a robot) know how far it is from items to avoid running into things and to plan path around obstacles in the image field of view. Traditionally this information has come from RADAR or LIDAR, however in some applications we can also get that from cameras. In cameras we often get depth from using 2 cameras for stereo vision.</p>
<p>The <strong>Intel RealSense Depth camera (D400 series) </strong>uses stereoscopic depth sensing to determine the range to an item. So essentially it has two cameras and can do triangulation from them for stereo. This sensor uses two infrared cameras for the stereo and then also has an RGB camera onboard. So you can get 4 data products from the sensor; RGB image, depth image, left infrared image, and right infrared image. Think of each image frame as a 3D snapshot of the environment, where each color (RGB) pixel also has a range value (depth) to the item that is in the image. The farther the items are from the camera the greater the range/depth error will be.</p>
<figure class="wp-block-image"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Applications-In-Computer-Vision.png?w=600" alt="Applications In Computer Vision" class="wp-image-5216" srcset="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Applications-In-Computer-Vision.png?w=934 934w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Applications-In-Computer-Vision.png?resize=300%2C167 300w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Applications-In-Computer-Vision.png?resize=768%2C428 768w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Applications-In-Computer-Vision.png?resize=323%2C180 323w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="334"></figure>
<p>The D400 cameras have an infrared projector for getting better features on surfaces with minimal texture in the infrared camera for computing the stereo reconstruction. This projector can be turned on and off if you want. Disabling the projector is often useful for tracking applications (since the projected dots don’t move with the items being tracked).</p>
<figure class="wp-block-image"><img decoding="async" src="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Realsense-D400-Cameras.png?w=600" alt="Realsense D400 Cameras Versions" class="wp-image-5215" srcset="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Realsense-D400-Cameras.png?w=909 909w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Realsense-D400-Cameras.png?resize=300%2C177 300w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Realsense-D400-Cameras.png?resize=768%2C454 768w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Realsense-D400-Cameras.png?resize=305%2C180 305w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="353"></figure>
<p>One thing to be aware is that the infrared images are rectified (to make the images look the same in a common plane) in the camera, however the RGB camera image is not rectified. This means that if you want the depth and RGB images to line up well, you need to manually rectify the RGB image. </p>
<p><strong>Pro Tip 1:</strong> The driver has a UV map to help map from the depth pixel to the RGB image to help account for the difference in image sizes. This lets you match the depth to RGB image data points better.</p>
<p><strong>Pro Tip 2:</strong> If using the D435i (the IMU version), use the timestamps from the images and IMU to synchronize the two sensors. If you use system time (from your computer) there will be more error (partially due to weird USB timing).</p>
<p><strong>Pro Tip 3:</strong> The cameras have Depth Presets. These are profiles that let you optimize various settings for various conditions. Such as high density, high accuracy, etc..</p>
<p><strong>Pro Tip 4:</strong> Make sure your exposure is set correctly. If you are using auto exposure try changing the Mean Intensity Set Point (the setting is not where exposure is, it is under AE control, not the most obvious&#8230;).<br />
If you want to use manual exposure you can play with are Exposure setpoint and Gain constant. Start with the exposure setpoint, then adjust the gain.</p>
<p>You might also want to see <a href="https://www.intel.com/content/dam/support/us/en/documents/emerging-technologies/intel-realsense-technology/BKMs_Tuning_RealSense_D4xx_Cam.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">this whitepaper</a> for more methods of tuning the cameras for better performance.</p>
<h2>Visual Odometry &amp; SLAM (T265)</h2>
<p>Visual odometry is the generic term for figuring out how far you have moved using a camera. This is as opposed to “standard” odometry using things such as wheel encoders, or inertial odometry with a IMU.</p>
<figure class="wp-block-image"><img decoding="async" src="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Odometry-Methods.png?w=600" alt="" class="wp-image-5218" srcset="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Odometry-Methods.png?w=870 870w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Odometry-Methods.png?resize=300%2C159 300w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Odometry-Methods.png?resize=768%2C406 768w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/Odometry-Methods.png?resize=340%2C180 340w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="316"><figcaption>These are not the only ways to get odometry. Having multiple sources of odometry is nice so you can take the advantages of each type and fuse them together (such as with a Kalman filter).</figcaption></figure>
<p><strong>RealSense T265</strong> is a tracking camera that is designed to be more optimal for Visual Odometry and SLAM (wider field of view and not using infrared light). It can do SLAM onboard as well as loop closure. However, this camera is not able to return RGB images (since it does not have a RGB camera onboard) and the depth returned is not as good as the D400 series (and can be a little trickier to get).</p>
<p>Using both a RealSense D435i sensor and a RealSense T265 sensor can provide both the maps and the better quality visual odometry for developing a full SLAM system. The D435i used for the mapping, and the T265 for the tracking.</p>
<h2>Software</h2>
<figure class="wp-block-image"><img decoding="async" src="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/RealSense-Putting-Everything-Together.png?w=600" alt="RealSense Putting Everything Together to Build a Full System" class="wp-image-5214" srcset="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/RealSense-Putting-Everything-Together.png?w=906 906w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/RealSense-Putting-Everything-Together.png?resize=300%2C171 300w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/RealSense-Putting-Everything-Together.png?resize=768%2C437 768w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/RealSense-Putting-Everything-Together.png?resize=317%2C180 317w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="340"></figure>
<p>Intel provides the RealSense SDK2.0 library for using the RealSense cameras. It is Open Source and work on Mac, Windows, Linux, and Android. There are also ROS and OpenCV wrappers.</p>
<p><a href="https://www.intelrealsense.com/developers/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Click here for the developers page with the SDK.</a></p>
<p>Within the SDK (software development kit) it includes a viewer to let you view images, record images, change settings, or update the firmware.</p>
<p><strong>Pro Tip 5:</strong> Spend some time with the viewer looking at the camera and depth images when designing your system so you can compare various mounting angles, heights, etc.. for the cameras.</p>
<p>The RealSense SDK (software development kit) has a few filters that can run on your computer to try and improve the returned depth map. You can play with turning these on and off in the viewer. Some of these include: </p>
<ol>
<li>Decimation Filter</li>
<li>Spatial Edge-Preserving Filter</li>
<li>Temporal Filter</li>
<li>Holes Filling Filter</li>
</ol>
<p>Within ROS there is a realsense-ros package that provides a wrapper for working with the cameras in ROS and lets you view images and other data in RVIZ.</p>
<p><a href="https://github.com/IntelRealSense/realsense-ros/tree/occupancy-mapping" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ROS RealSense Occupancy Map package</a> is available as an experimental feature in a separate branch of the RealSense git repo. This uses both the D400 and T265 cameras for creating the map. </p>
<p>For SLAM with just the D435i sensor, <a href="https://github.com/IntelRealSense/realsense-ros/wiki/SLAM-with-D435i" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">see here</a>.</p>
<p><strong>Pro Tip 6:</strong> You can use multiple T265 sensors for better accuracy. For example, if one sensor is pointed forward and another backwards; you can use the confidence values from each sensor to feed into a filter. </p>
<p>I know this is starting to sound like a sales pitch&#8230;</p>
<p><strong>Pro Tip 7:</strong> If you have multiple cameras you can connect and query for a serial number to know which cameras is which.<br />
Also if you remove the little connector at the top of the camera you can wire and chain multiple cameras together to synchronize them. (This should work in the SDK 2.0)</p>
<p>See this whitepaper for working with multiple camera configurations. https://simplecore.intel.com/realsensehub/wp-content/uploads/sites/63/Multiple_Camera_WhitePaper04.pdf</p>
<p><strong>Pro Tip 8:</strong> Infinite depth points (such as points to close or to far from the sensor) have a depth value of 0. This is good to know for filtering. </p>
<p>Here are two code snippet’s for using the cameras provided by Daniel, to share with you. The first one is for basic displaying of images using python. The second code snippet is using OpenCV to also detect blobs, also using python.</p>
<pre class="wp-block-code"><code>## License: Apache 2.0. See LICENSE file in root directory.
## Copyright(c) 2015-2017 Intel Corporation. All Rights Reserved.

###############################################
##      Open CV and Numpy integration        ##
###############################################

import pyrealsense2 as rs
import numpy as np
import cv2


cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)

try:
    while True:

        
        # Wait for a coherent pair of frames: depth and color
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

        # Convert images to numpy arrays
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
        
        scaled_depth=cv2.convertScaleAbs(depth_image, alpha=0.08)
        depth_colormap = cv2.applyColorMap(scaled_depth, cv2.COLORMAP_JET)

        # Stack both images horizontally
        images = np.hstack((color_image, depth_colormap))

        # Show images
        cv2.imshow('RealSense', images)


        k = cv2.waitKey(1) &amp; 0xFF
        if k == 27:
            break

finally:

    # Stop streaming
    pipeline.stop()</code></pre>
<pre class="wp-block-code"><code>## License: Apache 2.0. See LICENSE file in root directory.
## Copyright(c) 2015-2017 Intel Corporation. All Rights Reserved.

###############################################
##      Open CV and Numpy integration        ##
###############################################

import pyrealsense2 as rs
import numpy as np
import cv2

def nothing(args):
    pass

def detectBlobs(mask):
        # Set up the SimpleBlobdetector with default parameters.
    params = cv2.SimpleBlobDetector_Params()
         
    # Change thresholds
    params.minThreshold = 1;
    params.maxThreshold = 255;
    
    # Filter by Area.
    params.filterByArea = True
    params.maxArea = 4000
    params.minArea = 300
    
    # Filter by Circularity
    params.filterByCircularity = True
    params.minCircularity = 0.1
    
    # Filter by Convexity
    params.filterByConvexity = True
    params.minConvexity = 0.5
    
    # Filter by Inertia
    params.filterByInertia = True
    params.minInertiaRatio = 0.1

         
    detector = cv2.SimpleBlobDetector_create(params)
 
    # Detect blobs.
    reversemask= mask
    keypoints = detector.detect(reversemask)
    im_with_keypoints = cv2.drawKeypoints(mask, keypoints, np.array([]),
            (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    return im_with_keypoints

def thresholdDepth(depth):
    depth[depth==0] = 255 #set all invalid depth pixels to 255
    threshold_value = cv2.getTrackbarPos('Threshold','Truncated Depth')
    # Zero if dist&gt;TH
    ret,truncated_depth=cv2.threshold(scaled_depth,threshold_value,255,cv2.THRESH_BINARY_INV) 
    return truncated_depth

cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Truncated Depth', cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar('Threshold','Truncated Depth',30,255,nothing)

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)

try:
    while True:

        
        # Wait for a coherent pair of frames: depth and color
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

        # Convert images to numpy arrays
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
        scaled_depth=cv2.convertScaleAbs(depth_image, alpha=0.08)
        depth_colormap = cv2.applyColorMap(scaled_depth, cv2.COLORMAP_JET)

        # Stack both images horizontally
        images = np.hstack((color_image, depth_colormap))

        # Show images
        cv2.imshow('RealSense', images)
        truncated_depth=thresholdDepth(scaled_depth)
        truncated_depth=detectBlobs(truncated_depth)
        cv2.imshow('Truncated Depth', truncated_depth)

        k = cv2.waitKey(1) &amp; 0xFF
        if k == 27:
            break

finally:

    # Stop streaming
    pipeline.stop()</code></pre>
<hr class="wp-block-separator">
<p>I hope you found this informative and can make use of the Pro Tips. </p>
<p>Thank you to Daniel for presenting this information and allowing me to share it. This content is based on his talk. Daniel has also provided the full slide set that can be accessed by <a href="http://robotsforroboticists.com/wordpress/wp-content/uploads/2019/09/realsense-sep-2019.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">clicking here</a>.</p>
<p>Disclaimer: I have not received any funding or free items from Intel.</p>
<p>Liked this article? Take a second to support me on <a href="https://www.patreon.com/robotsforroboticists" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Patreon</a>! This post appeared first on Robots For Roboticists.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using hydraulics for robots: Introduction</title>
		<link>https://robohub.org/using-hydraulics-for-robots-introduction/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Sun, 12 May 2019 21:41:56 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">https://robohub.org/using-hydraulics-for-robots-introduction/</guid>

					<description><![CDATA[Hydraulics are sometimes looked at as an alternative to electric motors. Some of the primary reasons for this include: Linear motion Very high torque applications Small package for a given torque Large number of motors that can share the reservoir/pump...]]></description>
										<content:encoded><![CDATA[<div id="attachment_130889" style="width: 7768px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-130889" src="https://robohub.org/wp-content/uploads/2019/05/Hydraulic-System.jpg" alt="" width="7758" height="5778" class="size-full wp-image-130889" srcset="https://robohub.org/wp-content/uploads/2019/05/Hydraulic-System.jpg 7758w, https://robohub.org/wp-content/uploads/2019/05/Hydraulic-System-425x317.jpg 425w, https://robohub.org/wp-content/uploads/2019/05/Hydraulic-System-768x572.jpg 768w, https://robohub.org/wp-content/uploads/2019/05/Hydraulic-System-1024x763.jpg 1024w" sizes="(max-width: 7758px) 100vw, 7758px" /><p id="caption-attachment-130889" class="wp-caption-text">From the Reservoir the fluid goes to the Pump where there are three connections. 1. Accumulator(top) 2. Relief Valve(bottom) &#038; 3. Control Valve. The Control Valve goes to the Cylinder which returns to a filter and then back to the Reservoir.</p></div>
<p>Hydraulics are sometimes looked at as an alternative to electric motors. <span id="more-130070"></span></p>
<p>Some of the primary reasons for this include:</p>
<ul>
<li>Linear motion</li>
<li>Very high torque applications</li>
<li>Small package for a given torque</li>
<li>Large number of motors that can share the reservoir/pump can increase volume efficiency</li>
<li>You can add dampening for shock absorption</li>
</ul>
<p>However there are also some downsides to using hydraulics including:</p>
<ul>
<li>More parts are required (however they can be separated from the robot in some applications)</li>
<li>Less precise control (unless you use a proportional valve)</li>
<li>Hydraulic fluid (mess, leaks, mess, and more mess)</li>
</ul>
<p>Hydraulic systems use an incompressible liquid (as opposed to pneumatics that use a compressible gas) to transfer force from one place to another. Since the hydraulic system will be a closed system (ignore relief valves for now)  when you apply a force to one end of the system that force is transferred to another part of that system. By manipulating the volume of fluid in different parts of the system you can change the forces in different parts of the system (Remember<a href="https://en.wikipedia.org/wiki/Hydraulic_drive_system" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"> Pascal’s Law</a> from high school??).</p>
<p>So here are some of the basic components used (or needed) to develop  a hydraulic system.</p>
<p><strong>Pump</strong></p>
<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/pump.jpg?w=600" alt="pump" class="wp-image-5117" srcset="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/pump.jpg?w=300 300w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/pump.jpg?resize=150%2C150 150w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/pump.jpg?resize=180%2C180 180w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/pump.jpg?resize=288%2C288 288w" sizes="(max-width: 300px) 100vw, 300px" width="300" height="300"><figcaption><a href="https://www.grainger.com/product/4F669?gclid=CjwKCAjwza_mBRBTEiwASDWVvu_3M7wYMMMdwX4iYAzefLAZajDlVstkxwz9kUtR-AlyL4MVjyFnlxoCWLwQAvD_BwE&amp;cm_mmc=PPC:+Google+PLA&amp;ef_id=CjwKCAjwza_mBRBTEiwASDWVvu_3M7wYMMMdwX4iYAzefLAZajDlVstkxwz9kUtR-AlyL4MVjyFnlxoCWLwQAvD_BwE:G:s&amp;s_kwcid=AL!2966!3!264955916063!!!g!437549560449!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>The pump is the heart of your hydraulic system. The pump controls the flow and pressure of the hydraulic fluid in your system that is used for moving the actuators.</p>
<p>The size and speed of the pump determines the flow rate and the load at the actuator determines the pressure. For those familiar with electric motors the pressure in the system is like the voltage, and the flow rate is like the electrical current.</p>
<p><strong>Pump&nbsp;Motor</strong></p>
<p>We know what the pump is, but you need a way to “power” the pump so that it can pump the hydraulic fluid. Generally the way you power the pump is by connecting it to an electric motor or gas/diesel engine.</p>
<p><strong>Hydraulic Fluid</strong></p>
<p>Continuing the analogy where the pump is the heart, the hydraulic fluid is the blood of the system. The fluid is what is used to transfer the pressure from the pump to the motor.</p>
<p><strong>Hydraulic Hoses&nbsp;(and&nbsp;fittings&nbsp;to&nbsp;connect&nbsp;things)</strong></p>
<p>These are the arteries and veins of the system that allows for the transfer of hydraulic fluid.</p>
<p><strong>Hydraulic Actuators – Motor</strong>/<strong>Cylinder</strong></p>
<div class="wp-block-image">
<figure class="alignright is-resized"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/cylinder-e1556888879471.jpg?zoom=2&amp;resize=252%2C106" alt="cylinder" class="wp-image-5114" width="252" height="106" srcset="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/cylinder-e1556888879471.jpg?zoom=2&amp;resize=252%2C106" src-orig="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/cylinder-e1556888879471.jpg?resize=252%2C106" scale="2"><figcaption>Cylinder <a href="https://www.grainger.com/product/6FDD1?gclid=CjwKCAjwza_mBRBTEiwASDWVvs_eQfTtPtoO3WIuUPW_MxNa27C9WM1sYWwd0H50iFsSDEHMrU29GRoCOUEQAvD_BwE&amp;cm_mmc=PPC:+Google+PLA&amp;ef_id=CjwKCAjwza_mBRBTEiwASDWVvs_eQfTtPtoO3WIuUPW_MxNa27C9WM1sYWwd0H50iFsSDEHMrU29GRoCOUEQAvD_BwE:G:s&amp;s_kwcid=AL!2966!3!340026118987!!!g!667880533378!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<figure class="wp-block-image is-resized"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/motor.jpg?resize=113%2C113" alt="" class="wp-image-5120" width="113" height="113" srcset="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/motor.jpg?w=300 300w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/motor.jpg?resize=150%2C150 150w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/motor.jpg?resize=180%2C180 180w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/motor.jpg?resize=288%2C288 288w" sizes="(max-width: 113px) 100vw, 113px"><figcaption>Motor <a href="https://www.grainger.com/product/PARKER-5-17-x-5-13-x-4-61-SAE-A-2-30E865" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
<p>The actuator is generally the reason we are designing this hydraulic system. The motor is essentially the same as the pump; however instead of going from a mechanical input to generating the pressure, the motor converts the pressure into mechanical motion.</p>
<p>Actuators can come in the form of linear motion (referred to as a hydraulic cylinder) or rotary motion motors. </p>
<p>For cylinders, you generally apply a force and the cylinder end extends, and then if you release the force and the cylinder gets pushed back in (think of a car lift). This is the classic and most common use of hydraulics.</p>
<p>For rotary motors there are generally 3 connections on the motor.</p>
<ul>
<li><strong>A</strong> – Hydraulic fluid input/output line</li>
<li><strong>B</strong> – Hydraulic fluid input/output line</li>
<li><strong>Drain</strong> – Hydraulic fluid output line (generally only on motors, not cylinders)</li>
</ul>
<p>Depending on the motor you can either only use A as the fluid input and B as the fluid output and the motor only spins in one direction. Or some motors can spin in either direction based on if A or B is used as the input or output of the hydraulic fluid.</p>
<p>The drain line is used so when the system is turned off, the fluid has a way to get out of the motor (to deal with internal leakage and to not blow out seals). In some motors the drain line is connected to one of the A or B lines. Also their are sometimes multiple drain lines so that you can route the hydraulic hoses from different locations.</p>
<p>Note: While the pump and motor are basically the same component. You usually can not switch their role due to how they are designed to handle pressure and the pumps usually not being backdrivable.</p>
<p>There are some actuators that are designed to be leakless and hold the fluid and pressure (using valves) so that the force from the actuator is held even without the pump. For example these are used in things like automobile carrying trucks that need to stack cars for transport.</p>
<p><strong>Reservoir</strong></p>
<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?resize=132%2C132" alt="Reservoir" class="wp-image-5118" width="132" height="132" srcset="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?w=450 450w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?resize=150%2C150 150w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?resize=300%2C300 300w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?resize=180%2C180 180w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Reservoir.jpg?resize=288%2C288 288w" sizes="(max-width: 132px) 100vw, 132px"><figcaption><a href="https://www.zoro.com/lovejoy-hydraulic-reservoir-aluminum-16-gal-84527102350/i/G0778267/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>This is essentially a bucket that holds the fluid. They are usually a little fancier so that they have over pressure relief valves, lids, filters, etc..</p>
<p>The reservoir is also often a place where the hydraulic fluid can cool down if it is getting hot within the system. As the fluid gets hotter it can get thinner which can result in increased wear of your motor and pump.</p>
<p><strong>Filter</strong></p>
<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/filter.jpg?resize=88%2C88" alt="filter" class="wp-image-5115" width="88" height="88" srcset="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/filter.jpg?w=300 300w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/filter.jpg?resize=150%2C150 150w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/filter.jpg?resize=180%2C180 180w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/filter.jpg?resize=288%2C288 288w" sizes="(max-width: 88px) 100vw, 88px"><figcaption><a href="https://www.grainger.com/product/4ZC91?gclid=CjwKCAjwza_mBRBTEiwASDWVvlX4GhkPgFqLL-yt0BiEugn8pyKXF7BzJ8xcbPbs3_gAX8FftUqNrxoCAeYQAvD_BwE&amp;cm_mmc=PPC:+Google+PLA&amp;ef_id=CjwKCAjwza_mBRBTEiwASDWVvlX4GhkPgFqLL-yt0BiEugn8pyKXF7BzJ8xcbPbs3_gAX8FftUqNrxoCAeYQAvD_BwE:G:s&amp;s_kwcid=AL!2966!3!264955916069!!!g!437017001030!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>Keeps your hydraulic fluid clean before going back to the reservoir. Kind of like a persons kidneys.</p>
<p><strong>Valves&nbsp;(and&nbsp;Solenoids)</strong></p>
<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/solenoid-valve.jpg?resize=138%2C138" alt="solenoid valve" class="wp-image-5119" width="138" height="138" srcset="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/solenoid-valve.jpg?w=300 300w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/solenoid-valve.jpg?resize=150%2C150 150w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/solenoid-valve.jpg?resize=180%2C180 180w, https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/solenoid-valve.jpg?resize=288%2C288 288w" sizes="(max-width: 138px) 100vw, 138px"><figcaption>Valve (metal) with Solenoid (black) attached on top <a href="https://www.grainger.com/product/4ELA8?gclid=CjwKCAjwza_mBRBTEiwASDWVvu--UIXf3Ir9UXLhB9Xa335cmxdzZlaVn_scvdM9RgB-6VGsp1BwjBoCK_0QAvD_BwE&amp;cm_mmc=PPC:+Google+PLA&amp;ef_id=CjwKCAjwza_mBRBTEiwASDWVvu--UIXf3Ir9UXLhB9Xa335cmxdzZlaVn_scvdM9RgB-6VGsp1BwjBoCK_0QAvD_BwE:G:s&amp;s_kwcid=AL!2966!3!281698275783!!!g!471093561349!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>Valves are things that open and close to allow the control of fluid. These can be controlled by hand (ie. manual), or more often my some other means.</p>
<p>One common method is to use a solenoid which is a device that when you apply a voltage can be used to open a valve. Some solenoids are latching, which means you quickly apply a voltage and it opens the valves, and then you apply a voltage again (usually switching polarity) to close the valve.</p>
<p>There are many types of valves, I will detail a few below.</p>
<p><strong>Check Valves&nbsp;(One&nbsp;Way&nbsp;Valve)</strong></p>
<p>These are a type of valve that can be inline to allow the flow of hydraulic fluid in only one direction.</p>
<p><strong>Relief Valve</strong></p>
<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Relief-Valve.jpg?resize=58%2C119" alt="" class="wp-image-5121" width="58" height="119" srcset="https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Relief-Valve.jpg?w=134 134w, https://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/Relief-Valve.jpg?resize=87%2C180 87w" sizes="(max-width: 58px) 100vw, 58px"><figcaption><a href="https://www.mscdirect.com/product/details/01825710" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>These are a type of valve that automatically opens (And lets fluid out) when the pressure gets to high. This is a safety feature so you don&#8217;t damage other components and/or cause an explosion.</p>
<p><strong>Pilot Valve</strong></p>
<p>These are another special class of valve that can use a small pressure to control a much larger pressure valve.</p>
<p><strong>Pressure &amp; Flow-rate Sensors/Gauges&nbsp;</strong></p>
<p>You need to have sensors (with a gauge or computer output) to measure the pressure and/or flow-rate so you know how the system is operating and if it is operating how you expect it to operate.</p>
<p><strong>Accumulator</strong></p>
<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/accumulator.jpg?resize=159%2C159" alt="accumulator" class="wp-image-5113" width="159" height="159" srcset="https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/accumulator.jpg?w=300 300w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/accumulator.jpg?resize=150%2C150 150w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/accumulator.jpg?resize=180%2C180 180w, https://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2019/05/accumulator.jpg?resize=288%2C288 288w" sizes="(max-width: 159px) 100vw, 159px"><figcaption><a href="https://www.grainger.com/product/4WB45?gclid=CjwKCAjwza_mBRBTEiwASDWVvheoTLVhIG0-zTxsdoK6DzB28XUkaA-HPWCtF1bNoU2xUGliecX52xoC1iYQAvD_BwE&amp;cm_mmc=PPC:+Google+PLA&amp;ef_id=CjwKCAjwza_mBRBTEiwASDWVvheoTLVhIG0-zTxsdoK6DzB28XUkaA-HPWCtF1bNoU2xUGliecX52xoC1iYQAvD_BwE:G:s&amp;s_kwcid=AL!2966!3!50916684477!!!g!66418499599!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Source]</a></figcaption></figure>
</div>
<p>The accumulator is essentially just a tank that holds fluid under pressure that has its own pressure source. This is used to help smooth out the pressure and take any sudden loads from the motor by having this pressure reserve. This is almost like how capacitors are used in electrical power circuits.</p>
<p>The pressure source in the accumulator is often a weight, springs, or a gas.</p>
<p>There will often be a check valve to make sure the fluid in the accumulator does not go back to the pump.</p>
<hr class="wp-block-separator">
<p>I am not an expert on hydraulic systems. But I hope this quick introduction helps people. Liked it? Take a second to support me on <a href="https://www.patreon.com/robotsforroboticists" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Patreon</a>! This post appeared first on Robots For Roboticists.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Underwater robot photography and videography</title>
		<link>https://robohub.org/underwater-robot-photography-and-videography/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 29 Dec 2017 23:29:00 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/underwater-robot-photography-and-videography/</guid>

					<description><![CDATA[I had somebody ask me questions this week about underwater photography and videography with robots (well, now it is a few weeks ago&#8230;). I am not an expert at underwater robotics, however as a SCUBA diver I have some experience that can be applicab...]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" src="http://robohub.org/wp-content/uploads/2017/12/underwater_lights_no_lights.jpg" alt="" width="900" class="aligncenter size-full wp-image-94500" srcset="https://robohub.org/wp-content/uploads/2017/12/underwater_lights_no_lights.jpg 500w, https://robohub.org/wp-content/uploads/2017/12/underwater_lights_no_lights-425x320.jpg 425w" sizes="(max-width: 500px) 100vw, 500px" /><br />
I had somebody ask me questions this week about underwater photography and videography with robots (well, now it is a few weeks ago…). I am not an expert at underwater robotics, however as a SCUBA diver I have some experience that can be applicable towards robotics.</p>
<p><span id="more-94485"></span></p>
<h1>Underwater Considerations</h1>
<p>There are some challenges that exist with underwater photography and videography, that are less challenging above the water. Some of them include:</p>
<p>1) Water reflects some of the light that hits the surface, and absorbs the light that travels through it. This causes certain colors to not be visible at certain depths. If you need to see those colors you often need to bring strong lights to restore the visibility of those wavelengths that were absorbed. Red’s tend to disappear first, blues are the primary color seen as camera depth increases. A trick that people often try is to use <a href="https://www.bhphotovideo.com/c/buy/Underwater-Filters/ci/260/N/4183191446" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">filters on the camera lens</a> to make certain colors more visible.</p>
<p>If you are using lights then you can get the true color of the target. Sometimes if you are taking images you will see one color with your eye, and then when the strobe flashes a “different color” gets captured. In general you want to get close to the target to minimize the light absorbed by the water. </p>
<div style="width: 520px" class="wp-caption alignnone"><img decoding="async" src="https://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/light-penetration-underwater.png" width="510" height="602" class="size-full" /><p class="wp-caption-text">Visible colors at given depths underwater. <a href="https://ww2.kqed.org/quest/2013/09/20/the-seattle-seawall-project-transforming-salmon-habitat/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Image Source]</p></div>
<div class="keep-aspect"><iframe title="Underwater Color Loss With GoPro 0 to 155 Feet Depth - Fishing Lure Deep Test" width="500" height="375" src="https://www.youtube-nocookie.com/embed/AAJjdA6b4Ts?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>For shallow water work you can often adjust the <a href="https://digital-photography-school.com/introduction-to-white-balance/">white balance</a> to sort of compensate for the missing colors. White balance goes a long ways for video and compressed images (such as .jpg). Onboard white balance adjustments are not as important for photographs stored as with a raw image format, since you can deal with it in post processing. Having a white or grey card in the camera field of view (possibly permanently mounted on the robot) is useful for setting the white balance and can make a big difference. The white balance should be readjusted every so often as depth changes, particularly if you are using natural lighting (ie the sun). </p>
<p>Cold temperate water tends to look green (such as a freshwater quarry) (I think from plankton, algae, etc..). Tropical waters (such as in the Caribbean) tend to look blue near the shore and darker blue as you get further away from land (I think based on how light reflects off from the bottom of the water)… Using artificial light sources (such as strobes) can minimize those colors in your imagery.	</p>
<p>Auto focus generally works fine underwater. However if you are in the dark you might need to keep a focus light turned on to help the autofocus work, and then a separate strobe flash for taking the image. Some systems turn the focus light off when the images are being taken. This is generally not needed for video as the lights are continuously turned on.</p>
<p>2) Objects underwater appear closer and larger than they really are. A rule of thumb is that the objects will appear 25% larger and/or closer.</p>
<p>3) Suspended particles in the water (algae, dirt, etc..) scatters light which can make visibility poor. This can obscure details in the camera image or make things look blurry (like the camera is out of focus). A rule of thumb is your target should be less than 1/4 distance away from the camera as your total visibility.</p>
<p>The measure of the visibility is called turbidity. You can get turbidity sensors that might let you do something smart (I need to think about this more).</p>
<p>To minimize the backscatter from turbidity there is not a “one size fits all” solution. The key to minimizing backscatter is to control how light strikes the particles. For example if you are using two lights (angled at the left and right of the target), the edge of each cone of light should meet at the target. This way the water between the camera and the target is not illuminated. For wide-angle lenses you often want the light to be behind the camera (out of its plane) and to the sides at 45° angles to the target. With macro lenses you usually want the lights close to the lens. </p>
<p>&#8220;If you have a wide-angle lens you probably will use a domed port to protect the camera from water and get the full field of view of the camera.<br />
 The dome however can cause distortion in the corners. <a href="http://wetpixel.com/articles/review-nauticam-wide-angle-corrector-port/P1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Here is an interesting article on flat vs dome ports</a>.&#8221;</p>
<p>Another tip is to increase the exposure time (such as 1/50th of a second) to allow more natural light in, and use less strobe light to reduce the effect from backscatter.</p>
<p>4) Being underwater usually means you need to seal the camera from water, salts, (and maybe sharks). Make sure the enclosure and seals can withstand the pressure from the depth the robot will be at. Also remember to clean (and lubricate) the O rings in the housing.</p>
<p>&#8220;Pro Tip:Here are some common reasons for O ring seals leaking:<br />
a. Old or damaged O rings. Remember O rings don’t last forever and need to be changed.<br />
b. Using the wrong O ring<br />
c. Hair, lint, or dirt getting on the O ring<br />
d. Using no lubricant on the O ring<br />
e. Using too much lubricant on the O rings. (Remember on most systems the lubricant is for small imperfections in the O ring and to help slide the O rings in and out of position.)&#8221;</p>
<p>5) On land it is often easy to hold a steady position. Underwater it is harder to hold the camera stable with minimal motion. If the camera is moving a faster shutter speed might be needed to avoid motion blur. This also means that less light is entering the camera, which is the downside of having the faster shutter speed.</p>
<h1>When (not if) your camera floods</h1>
<p>When your enclosure floods while underwater (or a water sensor alert is triggered):</p>
<p>a. Shut the camera power off as soon as you can.<br />
b. Check if water is actually in the camera. Sometimes humidity can trigger moisture sensors. If it is humidity, you can add desiccant packets in the camera housing.<br />
c. If there is water, try to take the camera apart as much as you reasonably can and let it dry. After drying you can try to turn the camera on and hope that it works. If it works then you are lucky, however remember there can be residual corrosion that causes the camera to fail in the future. Water damage can happen instantaneously or over time.<br />
d. Verify that the enclosure/seals are good before sending the camera back in to the water. It is often good to do a leak test in a sink or pool before going into larger bodies of water.<br />
e. The above items are a standard response to a flooded camera. You should read the owner’s manual of your camera and follow those instructions. (This should be obvious, I am not sure why I am writing this).</p>
<hr>
<p>Do you have other advice for using cameras underwater and/or attached to a robot? Leave them in the comment section below.</p>
<hr>
<p>I want to thank John Anderson for some advice for writing this post. Any mistakes that may be in the article are mine and not his.</p>
<p>The main image is from <a href="http://www.divephotoguide.com/underwater-photography-techniques/article/basic-principles-light-underwater/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">divephotoguide.com</a>. They have a lot of information on underwater cameras, lens, lights and more.</p>
<p><a href="http://robotsforroboticists.com/underwater-photography-videography/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">This post</a> appeared first on Robots For Roboticists.       	</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Battery safety and fire handling</title>
		<link>https://robohub.org/battery-safety-and-fire-handling/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 14 Nov 2017 18:00:28 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/battery-safety-and-fire-handling/</guid>

					<description><![CDATA[Lithium battery safety is an important issue as there are more and more reports of fires and explosions. Fires have been reported in everything from cell phones to airplanes to robots. If you don&#8217;t know why we need to discuss this, or even if you...]]></description>
										<content:encoded><![CDATA[<img decoding="async" src="http://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991.jpg" alt="" width="900" height="900" class="aligncenter size-full wp-image-91441" srcset="https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991.jpg 900w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-290x290.jpg 290w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-425x425.jpg 425w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-768x768.jpg 768w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-220x220.jpg 220w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-32x32.jpg 32w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-50x50.jpg 50w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-64x64.jpg 64w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-96x96.jpg 96w, https://robohub.org/wp-content/uploads/2017/11/bigstock-Isolated-Isolated-Line-Art-Fla-143128991-128x128.jpg 128w" sizes="(max-width: 900px) 100vw, 900px" />
<p>Lithium battery safety is an important issue as there are more and more reports of fires and explosions. Fires have been reported in everything from cell phones to airplanes to robots.</p>
<p><span id="more-91423"></span></p>
<p>If you don’t know why we need to discuss this, or even if you do know, watch this clip or <a href="https://www.wired.com/2016/10/samsung-isnt-one-lithium-ion-problems-just-ask-nasa/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">click here</a>.</p>
<div class="keep-aspect"><iframe title="Shocking video of NASA&#039;s robot humanoid EXPLODING" width="500" height="281" src="https://www.youtube-nocookie.com/embed/JECJAgRsp-4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>I am not a fire expert. This post is based on things I have heard and some basic research. Contact your local fire department for advice specific to your situation. I had very little success contacting my local fire department about this, hopefully you will have more luck.</p>
<h2>Preventing Problems</h2>
<p>1. Use a proper charger for your battery type and voltage. This will help prevent overcharging. In many cases lithium-ion batteries catch fire when the chargers keep dumping charge into the batteries after the maximum voltage has been reached. </p>
<p>2. Use a <a href="http://liionbms.com/php/bms_options.php" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">battery management system (BMS)</a> when building battery packs with multiple cells. A BMS will monitor the voltage of each cell and halt charging when any cell reaches the maximum voltage. Cheap BMS’s will stop all charging when any cell reaches that maximum voltage. Fancier/better BMS’s can individually charge each cell to help keep the battery pack balanced. A balanced pack is good since each cell will be a similar voltage for optimal battery pack performance. The fancy BMS’s can also often detect if a single cell is reading wrong. There have been cases of a BMS’s working properly but a single cell going bad which confuses the BMS; and yields a fire/explosion.</p>
<p>3. Only charge batteries in designated areas. A designated area should be non combustible. For example cement, sand, cinder block and metal boxes are not uncommon to use for charging areas. For smaller cells you can purchase fire containment bags designed to put the charging battery in.<br />
<a href="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/lipo_charging_bag.jpg" rel="attachment wp-att-4820 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" src="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/lipo_charging_bag.jpg?resize=248%2C300" alt="lipo lithiom ion battery charging bag" class="aligncenter size-medium wp-image-4820" srcset="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/lipo_charging_bag.jpg?resize=248%2C300 248w, http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/lipo_charging_bag.jpg?resize=149%2C180 149w, http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/lipo_charging_bag.jpg?w=375 375w" sizes="(max-width: 248px) 100vw, 248px" width="248" height="300"></a></p>
<p>In addition the area where you charge the batteries should have good ventilation. </p>
<p>I have heard that on the <a href="https://en.wikipedia.org/wiki/Boeing_787_Dreamliner_battery_problems" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Boeing Dreamliner, part of the solve for their batteries catching fire on planes</a>, was to make sure that the metal enclosure that the batteries were in could withstand the heat of a battery fire. And also to make sure that in the event of a fire the fumes would vent outside the aircraft and not into the cabin.
</p>
<div id="attachment_4824" style="width: 646px" class="wp-caption aligncenter"><a href="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/boeing_battery.jpg" rel="attachment wp-att-4824 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" src="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/boeing_battery.jpg?resize=600%2C338" alt="Dreamliner airline battery fire" class="size-full wp-image-4824" srcset="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/boeing_battery.jpg?resize=300%2C169 300w, http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/boeing_battery.jpg?resize=320%2C180 320w, http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/boeing_battery.jpg?w=636 636w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="337"></a></p>
<p class="wp-caption-text">Dreamliner battery pack before and after fire. <a href="http://www.gizmodo.co.uk/2014/12/boeing-787-dreamliner-fire-investigation-blames-pretty-much-everybody/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[SOURCE]</a></p>
</div>
<p>4. Avoid short circuiting the batteries. This can cause a thermal runoff which will also cause a fire/explosion. When I say avoid short circuiting the battery you are probably thinking of just touching the positive and negative leads together. While that is an example you need to think of other methods as well. For example puncturing a cell (such as with a drill bit or a screw driver) or compressing the cells, can cause a short-circuit with a resulting thermal runoff. </p>
<p>5. Don’t leave batteries unattended when charging. This will let people be available in case of a problem. However, as you saw in the video above, you might want to keep a distance from the battery in case there is a catastrophic event with flames shooting out from the battery pack. </p>
<p>6. Store batteries within the specs of the battery. Usually that means room temperature and out of direct sunlight (to avoid overheating).</p>
<p>7. Training of personnel for handling batteries, charging batteries, and what to do in the event of a fire. Having people trained in what to do can be important so that they stay safe. For example, without training people might not realize how bad the fumes are. Also make sure people know where the fire pull stations are and where the extinguishers are.</p>
<h2>Handling Fires</h2>
<p>1. There are 2 primary issues with a lithium fire. The fire itself and the gases released. This means that even if you think you can safely extinguish the fire, you need to keep in mind the fumes and possibly clear away from the fire.</p>
<p>2a. Lithium batteries which are usually in the form of small non-rechargeable batteries (such as in a watch) in theory require a class D fire extinguisher. However most people do not have one available. As such, for the most part you need to just let it burn itself out (it is good that the batteries are usually small). You can use a standard class ABC fire extinguisher to prevent the spread of the fire. Avoid using water on the lithium battery itself since the lithium and water can react violently.</p>
<p>2b. Lithium-ion batteries (including LiFePO<sub>4</sub>) that are used on many robots, are often larger and rechargeable. For these batteries there is not a lot of actual lithium metal in the battery, so you can use water or a class ABC fire extinguisher. You do not use a class D extinguisher with these batteries.</p>
<p>With both of these types of fires, there is a good chance that you will not be able to extinguish the it. If you can safety be in the area your primary goal is to allow the battery to burn in a controlled and safe manner. If possible try to get the battery outside and on a surface that is not combustible. As a reminder lithium-ion fires are very hot and flames can shoot out from various places unexpectedly; you need to be careful and only do what you can do safety. If you have a battery with multiple cells it is not uncommon for each cell to catch fire separately. So you might see the flames die down, then shortly after another cell catches fire, and then another; as the cells cascade and catch fire.</p>
<div id="attachment_4829" style="width: 501px" class="wp-caption aligncenter"><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/fire_extinguisher_pass.jpg" rel="attachment wp-att-4829 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" src="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/fire_extinguisher_pass.jpg?zoom=2&amp;resize=491%2C492" alt="PASS fire extinguisher" class="size-full wp-image-4829" width="491" height="492" srcset="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/fire_extinguisher_pass.jpg?zoom=2&amp;resize=491%2C492" src-orig="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/11/fire_extinguisher_pass.jpg?resize=491%2C492" scale="2"></a></p>
<p class="wp-caption-text">A quick reminder about how to use a fire extinguisher. Remember first you Pull the pin, then you Aim at the base of the fire, then you Squeeze the handle, followed by Sweeping back and forth at the base of the fire. <a href="http://www.arpc.afrc.af.mil/News/Article-Display/Article/622004/arpc-recognizes-fire-prevention-week/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[SOURCE]</a></p>
</div>
<p>3. In many cases the batteries are in an enclosure where if you spray the robots with an extinguisher you will not even reach the batteries. In this case your priority is your safety (from fire and fumes), followed by preventing the fire from spreading. To prevent the fire from spreading you need to make sure all combustible material is away from the robot. If possible get the battery pack outside.</p>
<blockquote>
<p>In firefighting school a common question is: Who is the most important person? To which the response is, <strong>me</strong>!</p>
</blockquote>
<p>4. If charging the battery, try to unplug the battery charger from wall. Again only if you can do this safely.</p>
<hr>
<p>I hope you found the above useful. I am not an expert on lithium batteries or fire safety. Consult with your local experts and fire authorities. I am writing this post due to the lack of information in the robotics community about battery safety.</p>
<p>As said by Wired <a href="https://www.wired.com/2016/10/samsung-isnt-one-lithium-ion-problems-just-ask-nasa/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"> “you know what they say: With great power comes great responsibility.”</a>.</p>
<hr>
<p>Thank you Jeff (I think he said I should call him Merlin) for some help with this topic. </p>
<p><a href="http://robotsforroboticists.com/lithium-ion-battery-safety/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">This post</a> appeared first on Robots For Roboticists.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>National Robot Safety Conference 2017</title>
		<link>https://robohub.org/national-robot-safety-conference-2017/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Thu, 12 Oct 2017 22:11:33 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/national-robot-safety-conference-2017/</guid>

					<description><![CDATA[<p>I had the opportunity to attend the National Robot Safety Conference for Industrial Robots today in Pittsburgh, PA (USA). Today was the first day of a three-day conference. While I mostly cover technical content on this site; I felt that this was an important conference to attend since safety and safety standards are becoming more [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/national-robot-safety-conference-october-2017/" data-wpel-link="external" target="_blank">National Robot Safety Conference &#8211; October 2017</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" src="http://robohub.org/wp-content/uploads/2017/10/national_robot_safety_conference.png" alt="" width="751" height="402" class="aligncenter size-full wp-image-88765" srcset="https://robohub.org/wp-content/uploads/2017/10/national_robot_safety_conference.png 751w, https://robohub.org/wp-content/uploads/2017/10/national_robot_safety_conference-425x227.png 425w" sizes="(max-width: 751px) 100vw, 751px" />
<ul class="wpsocialite social-buttons large"></ul>
<p>I had the opportunity to attend the National Robot Safety Conference for Industrial Robots today in Pittsburgh, PA (USA). Today was the first day of a three-day conference. While I mostly cover technical content on this site; I felt that this was an important conference to attend since safety and safety standards are becoming more and more important in robot system design. This conference focused specifically on industrial robots. That means the standards discussed were not directly related to self-driving cars, personal robotics, or space robots (you still don’t want to crash into a martian and start an inter-galactic war).</p>
<p><span id="more-88628"></span></p>
<p>In this post I will go into a bit of detail on the presentations from the first day. Part of the reason I wanted to attend the first day was to hear the overview and introductory talks that formed a base for the rest of the sessions.</p>
<p>The day started out with some Standards Bingo. Lucky for us the conference organizers provided a list of standards terms, abbreviations, codes, and titles (see link below). For somebody (like myself) who does not work with industrial robot safety standards every day, when people start rattling off safety standard numbers it can get confusing very fast. </p>
<p>Quick, what is ISO 10218-1:2011 or IEC 60204-1:2016? For those who do not know, (me included) those are <em>Safety requirements for industrial robots — Part 1: Robots</em> and <em> Safety of machinery – electrical equipment — Part 1: General requirements</em>.</p>
<p><strong><a href="http://robotsforroboticists.com/industrial-robot-safety-standards" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"> Click here for a post with a guide to relevant safety standards, Abbreviations, Codes &amp; Titles.</a><br />
</strong></p>
<p>The next talk was from Carla Silver at Merck &amp; Company Inc. she introduced what safety team members need to remember to be successful, and introduced <em>Carla’s Top Five List</em>. </p>
<ol>
<li>Do not assume you know everything about the safety of a piece of equipment!</li>
<li>Do not assume that the Equipment Vendor has provided all the information or understands the hazards of the equipment.</li>
<li>Do not assume that the vendor has built and installed the equipment to meet all safety regulations.</li>
<li>Be a “Part of the Process”. – Make sure to involve the entire team (including health and safety people)</li>
<li>Continuous Education</li>
</ol>
<p>I think those 5 items are a good list for life in general.</p>
<p>The prior talk set the stage for why safety can be tricky and the amount of work it takes to stay up to date. </p>
<p>Robot integrator is a certification (and way to make money) from <a href="https://www.robotics.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Robotic Industries Association (RIA)</a> that helps provide people who come trained to fill the safety role while integrating and designing new robot systems. </p>
<p>According to Bob Doyle the RIA Director of Communications, RIA certified robot integrators must understand current industry safety standards and undergo an on-site audit in order to get certified. Every two years they need to recertify. Part of the recertification is having an RIA auditor perform a site visit. When recertifing the integrators are expected to know the current standards. I was happy to hear about the two-year recertification, due to how much changes with robotics technology over two years.</p>
<blockquote>
<p>A bit unrelated but A3 is the umbrella association for Robotic Industries Association (RIA) as well as Advancing Vision &amp; Imaging (AIA), and Motion Control &amp; Motor Association (MCMA). Bob mentioned that the AIA and MCMA certifications are standalone from the RIA Certified Integrators. However they are both growing as a way to train industrial engineers for those applications. Both the AIA and MCMA certifications are vendor agnostic for the technology used. There are currently several hundred people with the AIA certification. The MCMA certification was just released earlier this year and has several dozen people certified. Bob said that there are several companies that now require at least one team member on a project to have the above certifications.</p>
</blockquote>
<p>The next talk really started to get into the details about Robot System Integrators and Best Practices. In particular <em>risk assessments</em>. Risk assessments is a relatively new part of the integration process, but has a strong focus in the current program. Risk assessments are important due to the number of potential safety hazards and the different types or interactions a user might have with the robot system. The risk assessment helps guide the design as well as how users should interact with the robot . The responsibility to perform this risk assessment is with the robot integrator and not directly with the manufacturer or end-user. </p>
<p>One thing that I heard that surprised me was that many integrators do not share the risk assessment with the end-user since it is considered proprietary to that integrator. However one participant said that you can often get them to discuss it in a meeting or over the phone, just they will not hand over the documents.</p>
<p>After a small coffee break we moved on to discussing some of the regulations in detail. In particular R15.06 which is for Industrial Robot Safety standards, the proposed R15.08 standards for industrial mobile robot safety standards, and the R15.606 collaborative robot safety standards. Here are a few notes that I took:</p>
<h3>Types of Standards</h3>
<ul>
<li><strong>A – </strong>Basic concepts — Ex. Guidance to assess risk</li>
<li><strong>B – </strong>Generic safety standards — Ex. Safety distances, interlocks, etc..</li>
<li><strong>C – </strong>Machine specific — ex. From the vendor for a particular robot.</li>
</ul>
<p>Type C standards overrule type A &amp; B standards.</p>
<h3>Parts of a Standard</h3>
<ul>
<li><strong>Normative – </strong>These are required and often use the language of “shall”</li>
<li><strong>Informative – </strong>These are recommended or advice and use the language of “should” or “can”. Notes in standards are considered Informative</li>
</ul>
<h3>Key Terms for Safety Standards</h3>
<ul>
<li><strong>Industrial Robot – </strong>Robot <em>manipulator</em> of at least 3 DOF and its controller</li>
<li><strong>Robot System – </strong>The industrial robot with its end effector, work piece and periphery equipment (such as conveyor). </li>
<li><strong>Robot Cell – </strong>Robot system with the safe guarded spaces to include the physical barriers.</li>
</ul>
<div id="attachment_4791" style="width: 670px" class="wp-caption aligncenter"><a href="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/robot_work_cell.png" rel="attachment wp-att-4791 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" src="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/robot_work_cell.png?resize=600%2C504" alt="robot work cell" class="size-full wp-image-4791" srcset="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/robot_work_cell.png?resize=300%2C252 300w, http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/robot_work_cell.png?resize=214%2C180 214w, http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/robot_work_cell.png?w=660 660w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="502"></a></p>
<p class="wp-caption-text">Case study that was presented of a 3 robot system in a single cell, and how it was designed to meet safety standards.</p>
</div>
<p>R15.06 is all about “keeping people safe by keeping them <strong>away</strong> from the robot system”. This obviously does not work for mobile robots that move around people and collaborative robots. For that the proposed R15.08 standard for mobile robots and the R15.606 standard for collaborative robots are needed.</p>
<p>R15.08 which is expected to be ratified as a standard in 2019 looks at things like mobile robots, manipulators on mobile robots, and manipulators working while the mobile base is also working. Among other things, the current standard draft says that if an obstacle is detected, the primary mode is for the robot to stop; however dynamic replanning will be allowed.</p>
<p>For R15.606 they are trying to get rid of the term <em>collaborative robot</em> (a robot designed for direct interaction with a human) and think about systems in regard to its application. For example :</p>
<blockquote>
<p> …a robotic application where an operator may <is permitted="" to=""> interact directly with a robot system without relying on perimeter safeguards for protection in pre-determined,low risk tasks…</is></p>
</blockquote>
<p><a href="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png" rel="attachment wp-att-4790 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" src="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png?resize=600%2C336" alt="collaborative robots" class="aligncenter size-full wp-image-4790" srcset="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png?resize=300%2C168 300w, http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png?resize=768%2C431 768w, http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png?resize=321%2C180 321w, http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2017/10/colaborative_robots.png?w=979 979w" sizes="(max-width: 600px) 100vw, 600px" width="598" height="335"></a></p>
<p>After all the talk about standards we spent a bit of time looking at various case studies that were very illuminating for designing industrial robotic systems, and some of the problems that can occur.</p>
<p>One thing unrelated, but funny since this was a safety conference, was a person sitting near the back of the room who pulled a roll of packing tape out of their backpack to tape over their laptop power cable that ran across the floor.</p>
<p>I hope you found this interesting. This was the 29th annual national robot safety meeting (really, I did not realize we had been using robots in industry for that long). If you want to find out more about safety and how it affects your work and robots make sure to attend next year.</p>
<hr>
<p>I would like to thank RIA for giving me a media pass to attend this event.         	</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LIDAR vs RADAR: A detailed comparison</title>
		<link>https://robohub.org/lidar-vs-radar-a-detailed-comparison/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 09 May 2017 12:00:48 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[automotive]]></category>
		<category><![CDATA[LIDAR]]></category>
		<category><![CDATA[mapping & surveillance]]></category>
		<category><![CDATA[sensing]]></category>
		<guid isPermaLink="false">http://robohub.org/lidar-vs-radar-a-detailed-comparison/</guid>

					<description><![CDATA[<p>Hi all I was recently asked about the differences between RADAR and LIDAR. I gave the generic answer about LIDAR having higher resolution and accuracy than RADAR. And RADAR having a longer range and performing better in dust and smokey conditions. When prompted for why RADAR is less accurate and lower resolution I was asked [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/lidar-vs-radar/" data-wpel-link="external" target="_blank">LIDAR vs RADAR: A Detailed Comparison</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-78032" src="http://robohub.org/wp-content/uploads/2017/05/radar.jpg" alt="" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2017/05/radar.jpg 900w, https://robohub.org/wp-content/uploads/2017/05/radar-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/05/radar-768x512.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" />
<p>I was recently asked about the differences between RADAR and LIDAR. I gave the generic answer about LIDAR having higher resolution and accuracy than RADAR. And RADAR having a longer range and performing better in dust and smokey conditions. When prompted for why RADAR is less accurate and lower resolution, I sort of mumbled through a response about the wavelength. However, I did not have a good response, so this post will be my better response.<span id="more-77862"></span></p>
<hr class="xh2  ">
<h3>LIDAR</h3>
<p>LIDAR&#8212;which is short for Light Detection and Ranging&#8212;uses a laser that is emitted and then received back in the sensor. In most of the LIDAR sensors used for mapping (and self driving vehicles) the time between the emission and reception is computed to determine the time of flight (ToF). Knowing the speed of light and (1/2 of the) time for the wave to return (since the signal traveled out and back) we can compute how far away the object was that caused the light to bounce back. That value is the range information that is reported by the sensor. LIDAR’s generally use light in the near-infrared, visible (but not really visible), and UV spectrum’s.</p>
<p>There are some sensors that use triangulation to compute the position (instead of ToF). These are usually high accuracy, high resolution sensors. These sensors are great for verifying components on an assembly lines or inspecting thermal tile damage on the space shuttle. However that is not the focus of this post.</p>
<div id="attachment_78029" style="width: 742px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-78029" class="size-full wp-image-78029" src="http://robohub.org/wp-content/uploads/2017/05/LIDAR_data.png" alt="" width="732" height="438" srcset="https://robohub.org/wp-content/uploads/2017/05/LIDAR_data.png 732w, https://robohub.org/wp-content/uploads/2017/05/LIDAR_data-425x254.png 425w" sizes="(max-width: 732px) 100vw, 732px" /><p id="caption-attachment-78029" class="wp-caption-text">LIDAR data. The top shows the reflectivity data. The bottom shows the range data with brighter points being farther away.</p></div>
<p>The laser beam can also be focused to have a small spot size that does not expand much. This small spot size can help give a high resolution. If you have a spinning mirror (which is often the case) then you can shoot the laser every degree or so (based on the accuracy of the pointing mechanism) for improved resolution. It is not uncommon to find LIDAR’s operating at 0.25 degrees of angular resolution.</p>
<hr class="xh2  ">
<h3>RADAR</h3>
<p>RADAR&#8212;which is short for Radio Detection and Ranging&#8212;uses radio waves to compute velocity, and/or range to an object. Radio waves have less absorption (so less attenuation) than the light waves when contacting objects, so they can work over a longer distance. As you can see in the image below the RF waves have a larger wavelength than the LIDAR waves. The down side is that if an object is much smaller than the RF wave being used, the object might not reflect back enough energy to be detected. For that reason many RADAR’s in use for obstacle detection will be “high frequency” so that the wavelength is shorter (hence why we often use mm-wave in robotics) and can detect smaller objects. However, since LIDAR’s have the significantly smaller wavelength, they will still usually have a finer resolution.</p>
<div id="attachment_78030" style="width: 685px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-78030" class="size-full wp-image-78030" src="http://robohub.org/wp-content/uploads/2017/05/EM_Spectrum_Properties_edit.svg_.png" alt="" width="675" height="400" srcset="https://robohub.org/wp-content/uploads/2017/05/EM_Spectrum_Properties_edit.svg_.png 675w, https://robohub.org/wp-content/uploads/2017/05/EM_Spectrum_Properties_edit.svg_-425x252.png 425w" sizes="(max-width: 675px) 100vw, 675px" /><p id="caption-attachment-78030" class="wp-caption-text">Electromagnetic spectrum showing radio waves all the way on the left for RADAR and near-infrared/visible/ultra-violet waves towards the right for LIDAR usage.</p></div>
<p>Most of the RADAR’s that I have seen will have a narrow field of view (10’s of degrees) and then just return a single value (or they might have up to a few dozen channels, see multi-mode RADAR below) for the range of the detected object. There are tricks that some systems can do using multiple channels to also get the angle for the range measurement. The angle will not be as high resolution as most LIDAR’s. There are also some RADAR’s on the market that scan to get multiple measurements. The 2 approaches are a spinning antenna (such as what you see at airports or on ships) or electronically “spinning” which is a device using multiple internal antennas with no moving parts. More advanced (newer) RADAR’s can do things like track multiple objects. In many cases they will not actually return the points that outline the objects (like a LIDAR), but will return a range, bearing, and velocity to an estimated centroid of the detected item. If multiple objects are near each other, the sensor might confuse them as being one large object and return one centroid range [<a href="http://www.araa.asn.au/acra/acra2015/papers/pap167.pdf" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Here is the source and a good reference to read</a>].</p>
<p>Using the Doppler frequency shift, the velocity of an object can also be easily determined with relatively little computational effort. If the RADAR sensor and the detected object are both moving than you get a relative velocity between the two objects.</p>
<img decoding="async" class="aligncenter size-full wp-image-78031" src="http://robohub.org/wp-content/uploads/2017/05/radar_data.png" alt="" width="765" height="549" srcset="https://robohub.org/wp-content/uploads/2017/05/radar_data.png 765w, https://robohub.org/wp-content/uploads/2017/05/radar_data-425x305.png 425w" sizes="(max-width: 765px) 100vw, 765px" />
<p>With RADAR there are commonly two operating modes:</p>
<p><strong>1. Time of Flight</strong> – This operates similar to the LIDAR sensor above, however it uses radio wave pulses for the Time of Flight calculations. Since the sensors are pulsed, it knows when the pulse was sent. So, computing the range can be easier than with the continuous wave sensors (described below). The resolution of the sensor can be adjusted by changing the pulse width and the length of time you listen for a response (a ping back). These sensors often have fixed antennas leading to a small operating field of views (compared to LIDAR).</p>
<p>There are some systems that will combine multiple ToF radio waves into one package with different pulse widths. These will allow for various ranges to be detected with higher accuracy. These are sometimes called multi-mode RADAR</p>
<p><strong>2. Continuous Wave</strong> – This approach frequency modulates (FMCW) a wave and then compares the frequency of the reflected signal to the transmitted signal in order to determine a frequency shift. That frequency shift can be used to determine the range to the object that reflected it. The larger the shift the farther the object is from the sensor (within some bounds). Computing the frequency shift and the corresponding range is computationally easier than ToF, plus the electronics to do so are easier and cheaper. This makes continuous frequency modulated systems popular. Also, since separate transmit and receive antennas are often used, this approach can continuously be transmitting and receiving at the same time unlike the pulsed ToF approach, which needs to transmit then wait for a response. This feature and the simple electronics can make FMCW RADAR very fast at detecting objects.</p>
<p>There is another version of the Continuous Wave RADAR where the wave is not modulated. These systems are cheap and good for quickly detecting speed using the Doppler effect, however they can not determine range. They are often used by police to detect vehicle speed where the range is not important.</p>
<hr class="xh2  ">
<h3>SONAR</h3>
<p>Unrelated, I should note that SONAR or Sound Navigation and Ranging, can work in both of the modes as RADAR. The wavelength used is even larger than RADAR. It is farther to the left in the spectrum image shown before, and is off the chart.</p>
<p>I should point out that there are cool imaging SONAR sensors. The general idea is that you can make the sensing wave vertical so that the horizontal resolution is very fine (&lt;1 degree) and the vertical resolution is larger (10+ degrees). You can then put many of these beams near each other in a sensor package. There are similar packages that do this with small wave length RADAR.</p>
<hr class="xh2  ">
<h3>Cost</h3>
<p>LIDAR Sensors tend to cost more than RADAR sensors for several reasons:</p>
<ol>
<li>LIDAR using ToF needs high speed electronics that cost more.</li>
<li>LIDAR sensors needs CCD receivers, optics, motors, and lasers to generate and receive the waves used. RADAR only needs some stationary antennas.</li>
<li>LIDAR sensors have spinning parts for scanning. That requires motors and encoders. RADAR only needs some stationary antennas. (I know this is sort of similar to the line above).</li>
</ol>
<hr class="xh2  ">
<h3>Computationally Speaking</h3>
<p>RADAR sensors tend to generate a lot less data as they just return a single point, or a few dozen points. When the sensor is multi-channel it is often just returning a range/velocity to a few centroid(ish) objects. The LIDAR sensors are sending lots of data about each individual laser point of range data. It is then up to the user to make that data useful. With the RADAR you have a simple number, but that number might not be the best. With LIDAR it depends on the roboticist to generate algorithms to detect the various objects and discern what is being viewed by the sensor.</p>
<p>If your goal is to detect a car in front of you (or driving towards you) and get its velocity, the RADAR can be great. If you are trying to determine the precise location of an item, generate a surface map, or find a small fence-post, a LIDAR might do better. Just remember that if you are in dust or rain the LIDAR might return a cloud of points right near the sensor (as it reads all of those particles/drops); while the RADAR might do much better.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SICK LMS full LIDAR teardown</title>
		<link>https://robohub.org/sick-lms-full-lidar-teardown/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 28 Apr 2017 14:00:31 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[LIDAR]]></category>
		<category><![CDATA[sensing]]></category>
		<guid isPermaLink="false">http://robohub.org/sick-lms-full-lidar-teardown/</guid>

					<description><![CDATA[<p>I recently found a SICK LMS291 in the trash (dumpster diving time!). It is a bit of an older model as it was manufactured in August 2000, however the fundamentals should be similiar to the current generation of sensors. If you look at robots from that era you will often see them covered in this [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/sick-lms-lidar-teardown/" data-wpel-link="external" target="_blank">SICK LMS Full LIDAR Teardown</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="size-full wp-image-77331" src="http://robohub.org/wp-content/uploads/2017/04/lms09.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms09.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms09-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" />
<p>I recently found a SICK LMS291 in the trash (dumpster diving time!). It is a bit of an older model&#8212;manufactured in August 2000&#8212;however the fundamentals should be similiar to the current generation of sensors. If you look at robots from that era you will often see them covered in this type of LIDAR sensor.</p>
<p><a href="http://robotsforroboticists.com/lidar-fundamentals/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Here is a series of posts</a> about how LIDAR works and evaluating multiple sensors.</p>
<p>If you have always wanted to know how a SICK LIDAR worked inside, now is your chance. If you did not always want to know, this is still your chance to see. Keep reading for some cool pictures.</p>
<hr class="xh2  ">
<div id="attachment_77304" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77304" class="size-full wp-image-77304" src="http://robohub.org/wp-content/uploads/2017/04/lms1.jpg" alt="" width="768" height="1024" srcset="https://robohub.org/wp-content/uploads/2017/04/lms1.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms1-319x425.jpg 319w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77304" class="wp-caption-text">The sensor feels solid and feels like a brick. I could probably throw it off a cliff and it will still work, not that you should try…</p></div>
<hr class="xh2  ">
<div id="attachment_77305" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77305" class="size-full wp-image-77305" src="http://robohub.org/wp-content/uploads/2017/04/lms2.jpg" alt="" width="768" height="837" srcset="https://robohub.org/wp-content/uploads/2017/04/lms2.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms2-390x425.jpg 390w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77305" class="wp-caption-text">SICK LMS 291. You can see the front black area where the laser shoots out from. The 3 indicator lights at the top front, and the cutout in the back for the connectors.</p></div>
<hr class="xh2  ">
<div id="attachment_77306" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77306" class="size-full wp-image-77306" src="http://robohub.org/wp-content/uploads/2017/04/lms3.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms3.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms3-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77306" class="wp-caption-text">SICK LMS 291 power and serial communications ports. There is a large sealed connector that plugs into each slot.</p></div>
<hr class="xh2  ">
<div id="attachment_77307" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77307" class="size-full wp-image-77307" src="http://robohub.org/wp-content/uploads/2017/04/lms4.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms4.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms4-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77307" class="wp-caption-text">Front Plastic Shield</p></div>
<hr class="xh2  ">
<div id="attachment_77308" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77308" class="size-full wp-image-77308" src="http://robohub.org/wp-content/uploads/2017/04/lms5.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms5.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms5-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77308" class="wp-caption-text">Mirror and encoder wheel. The laser shoots down from above the spinning mirror. The green post on the left reads the position from the encoder wheel shown on the bottom. The encoder wheel is the metal wheel with the slots cut into it. The 6 black tubes on the bottom I think are IR LEDs that are used for detecting dust or anything else occluding the front black visor.</p></div>
<hr class="xh2  ">
<div class="keep-aspect"><iframe title="SICK LMS LIDAR Spinning Mirror" width="500" height="281" src="https://www.youtube-nocookie.com/embed/_iz38zbhVh4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<div id="attachment_77309" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77309" class="size-full wp-image-77309" src="http://robohub.org/wp-content/uploads/2017/04/lms6.jpg" alt="" width="768" height="1024" srcset="https://robohub.org/wp-content/uploads/2017/04/lms6.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms6-319x425.jpg 319w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77309" class="wp-caption-text">Front Metal Case removed. Walls are about 3/10″ or 7.6mm thick</p></div>
<hr class="xh2  ">
<div id="attachment_77310" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77310" class="size-full wp-image-77310" src="http://robohub.org/wp-content/uploads/2017/04/lms7.jpg" alt="" width="768" height="1024" srcset="https://robohub.org/wp-content/uploads/2017/04/lms7.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms7-319x425.jpg 319w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77310" class="wp-caption-text">With the front removed here are the internals of the sensor. On the bottom you can see the metal ring which is a motor, above it is the spinning mirror encoder. The top section has the control boards and the laser hidden behind them.</p></div>
<hr class="xh2  ">
<div id="attachment_77311" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77311" class="size-full wp-image-77311" src="http://robohub.org/wp-content/uploads/2017/04/lms8.jpg" alt="" width="768" height="915" srcset="https://robohub.org/wp-content/uploads/2017/04/lms8.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms8-357x425.jpg 357w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77311" class="wp-caption-text">Bottom view of the open sensor. The motor for spinning the mirror and encoder wheel is clearly visible at the bottom. The black rectangles on the top board are for detecting if the bottom LEDs are visible for fault detection.</p></div>
<hr class="xh2  ">
<div id="attachment_77312" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77312" class="size-full wp-image-77312" src="http://robohub.org/wp-content/uploads/2017/04/lms9.jpg" alt="" width="768" height="318" srcset="https://robohub.org/wp-content/uploads/2017/04/lms9.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms9-425x176.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77312" class="wp-caption-text">These are the wings that go below and above the spinning mirror assembly. On the left side you can see the LEDs and the board on the right has the black square receivers.</p></div>
<hr class="xh2  ">
<div id="attachment_77313" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77313" class="size-full wp-image-77313" src="http://robohub.org/wp-content/uploads/2017/04/lms91.jpg" alt="" width="768" height="870" srcset="https://robohub.org/wp-content/uploads/2017/04/lms91.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms91-375x425.jpg 375w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77313" class="wp-caption-text">The encoder is directly mounted to the mirror for increased accuracy of the laser position. It is very solidly built, and you can see that a designer was having fun with cutting the SICK logo into the metal disk. I was surprised when I saw this since I expected a higher resolution encoder wheel with more slots. But I guess the larger thicker slots can be more reliable. Towards the top of the wheel it looks like one slot is missing, I wonder if it is some sort of index.</p></div>
<hr class="xh2  ">
<div id="attachment_77314" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77314" class="size-full wp-image-77314" src="http://robohub.org/wp-content/uploads/2017/04/lms92.jpg" alt="" width="768" height="918" srcset="https://robohub.org/wp-content/uploads/2017/04/lms92.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms92-356x425.jpg 356w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77314" class="wp-caption-text">Laser and receiver black can assembly visible after removing the front PCB. You can see the 2 gold coax connectors probably for some high frequency signals from the receiver. On the top board in the front you can see the 3 indicator lights that are visible on the exterior of the enclosure. On the left of the front board you can see the board interconnect connector that connects to the board on the right side of this image. When the boards are screwed down that connector is not coming loose.</p></div>
<hr class="xh2  ">
<div id="attachment_77315" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77315" class="size-full wp-image-77315" src="http://robohub.org/wp-content/uploads/2017/04/lms93.jpg" alt="" width="768" height="614" srcset="https://robohub.org/wp-content/uploads/2017/04/lms93.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms93-425x340.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77315" class="wp-caption-text">Front board that I think converts the analog RF receiver signal to digital for the processor board. The board on top has the reciever, a coax cable goes from there to the gold can. Followed by going to this board. I am really curious what is under the gold can.</p></div>
<hr class="xh2  ">
<div id="attachment_77316" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77316" class="size-full wp-image-77316" src="http://robohub.org/wp-content/uploads/2017/04/lms94.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms94.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms94-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77316" class="wp-caption-text">Look at the washers used above the screw holes. Excellent attention to detail to avoid screws coming loose from vibration. Not shown but there are many really nice touches, such as captive standoffs. I was surprised that I did not see any loctite.</p></div>
<hr class="xh2  ">
<div id="attachment_77317" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77317" class="size-full wp-image-77317" src="http://robohub.org/wp-content/uploads/2017/04/lms95.jpg" alt="" width="768" height="443" srcset="https://robohub.org/wp-content/uploads/2017/04/lms95.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms95-425x245.jpg 425w, https://robohub.org/wp-content/uploads/2017/04/lms95-175x100.jpg 175w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77317" class="wp-caption-text">Close up of the front board. Perhaps some RF signal conditioning for the receiver of the laser signal.</p></div>
<hr class="xh2  ">
<div id="attachment_77318" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77318" class="size-full wp-image-77318" src="http://robohub.org/wp-content/uploads/2017/04/lms96.jpg" alt="" width="768" height="471" srcset="https://robohub.org/wp-content/uploads/2017/04/lms96.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms96-425x261.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77318" class="wp-caption-text">The main processor board that was connected to the front board shown before from the left side board connector. You can see the Xilinx FPGA that is running the sensor.</p></div>
<hr class="xh2  ">
<div id="attachment_77319" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77319" class="size-full wp-image-77319" src="http://robohub.org/wp-content/uploads/2017/04/lms97.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms97.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms97-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77319" class="wp-caption-text">Bodge wire on the rear of the main processing board. I am surprised to see this. However it is really well done. Look at the epoxy blob holding the wire down.</p></div>
<hr class="xh2  ">
<div id="attachment_77320" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77320" class="size-full wp-image-77320" src="http://robohub.org/wp-content/uploads/2017/04/lms98.jpg" alt="" width="768" height="631" srcset="https://robohub.org/wp-content/uploads/2017/04/lms98.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms98-425x349.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77320" class="wp-caption-text">Metal gold can to shield some components (or so I thought) from EM interference. Desiccant packet on the left is to control any moisture that might get into the sensor.</p></div>
<hr class="xh2  ">
<div id="attachment_77321" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77321" class="size-full wp-image-77321" src="http://robohub.org/wp-content/uploads/2017/04/lms99.jpg" alt="" width="768" height="523" srcset="https://robohub.org/wp-content/uploads/2017/04/lms99.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms99-425x289.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77321" class="wp-caption-text">Inside of the shielding can. Is that for creating a time delay or some phase shift in the RF signal coming from the receiver?</p></div>
<hr class="xh2  ">
<div id="attachment_77322" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77322" class="size-full wp-image-77322" src="http://robohub.org/wp-content/uploads/2017/04/lms01.jpg" alt="" width="768" height="618" srcset="https://robohub.org/wp-content/uploads/2017/04/lms01.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms01-425x342.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77322" class="wp-caption-text">Receiver of the incoming laser signal on the top board center. The black can has some mirrors and the laser.</p></div>
<hr class="xh2  ">
<div id="attachment_77323" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77323" class="size-full wp-image-77323" src="http://robohub.org/wp-content/uploads/2017/04/lms02.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms02.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms02-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77323" class="wp-caption-text">Laser receiver module closeup. What is all the metal heatsinking for?</p></div>
<hr class="xh2  ">
<div id="attachment_77324" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77324" class="size-full wp-image-77324" src="http://robohub.org/wp-content/uploads/2017/04/lms03.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms03.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms03-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77324" class="wp-caption-text">The motor and mirror removed. You can sort of look up into the laser and reciever assembly. The flat metal part between the ring and the laser assembly is the back of the power supply module.</p></div>
<hr class="xh2  ">
<div id="attachment_77325" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77325" class="size-full wp-image-77325" src="http://robohub.org/wp-content/uploads/2017/04/lms04.jpg" alt="" width="768" height="472" srcset="https://robohub.org/wp-content/uploads/2017/04/lms04.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms04-425x261.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77325" class="wp-caption-text">Looking up from the mirror into the laser assembly. Most of the center that you see is a mirror. The slot in the plastic has its own mirror that points the laser from the gold block down to the spinning mirror. The returned signal goes on the sides of that slot to the receiver above.</p></div>
<hr class="xh2  ">
<div id="attachment_77326" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77326" class="size-full wp-image-77326" src="http://robohub.org/wp-content/uploads/2017/04/lms05.jpg" alt="" width="768" height="559" srcset="https://robohub.org/wp-content/uploads/2017/04/lms05.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms05-425x309.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77326" class="wp-caption-text">Laser that is connected to the slot in the black mirror can.</p></div>
<hr class="xh2  ">
<div id="attachment_77328" style="width: 610px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77328" class="size-full wp-image-77328" src="http://robohub.org/wp-content/uploads/2017/04/lms06.jpg" alt="" width="600" height="173" srcset="https://robohub.org/wp-content/uploads/2017/04/lms06.jpg 600w, https://robohub.org/wp-content/uploads/2017/04/lms06-425x123.jpg 425w" sizes="(max-width: 600px) 100vw, 600px" /><p id="caption-attachment-77328" class="wp-caption-text">Connected to gold pins above to (control) the laser. What is under that shield??</p></div>
<hr class="xh2  ">
<div id="attachment_77329" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77329" class="size-full wp-image-77329" src="http://robohub.org/wp-content/uploads/2017/04/lms07.jpg" alt="" width="768" height="240" srcset="https://robohub.org/wp-content/uploads/2017/04/lms07.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms07-425x133.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77329" class="wp-caption-text">Under the shield. The DM74ALS seems to be a quad 2 input nand gate.</p></div>
<hr class="xh2  ">
<div id="attachment_77330" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77330" class="size-full wp-image-77330" src="http://robohub.org/wp-content/uploads/2017/04/lms08.jpg" alt="" width="768" height="495" srcset="https://robohub.org/wp-content/uploads/2017/04/lms08.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms08-425x274.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77330" class="wp-caption-text">The power supply for the sensor that was located behind the spinning mirror module.</p></div>
<hr class="xh2  ">
<div id="attachment_77331" style="width: 778px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-77331" class="size-full wp-image-77331" src="http://robohub.org/wp-content/uploads/2017/04/lms09.jpg" alt="" width="768" height="576" srcset="https://robohub.org/wp-content/uploads/2017/04/lms09.jpg 768w, https://robohub.org/wp-content/uploads/2017/04/lms09-425x319.jpg 425w" sizes="(max-width: 768px) 100vw, 768px" /><p id="caption-attachment-77331" class="wp-caption-text">All of the components in the LIDAR sensor. The PCB that is still in the rear metal enclosure is the board that connects to the power and serial connectors that we saw on the external of the sensor before.</p></div>
<hr class="xh2  ">
<p>I hope you enjoyed seeing the internals of this sensor. It is interesting to see how they made it and the spinning mirror that we often hear about. Leave comments below to help identify parts or other questions you may have.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Motor control systems: Bode plots and stability</title>
		<link>https://robohub.org/motor-control-systems-bode-plots-and-stability/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 21 Feb 2017 14:00:43 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[robots for roboticists]]></category>
		<guid isPermaLink="false">http://robohub.org/motor-control-systems-bode-plots-and-stability/</guid>

					<description><![CDATA[<p>What is a control system? A control system alters the future state of its system to a more desirable outcome. We often work with feedback control systems (also called closed-loop control), where the result of the command is fed back into the control system. In particular we are looking for the error between the command [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/motor-control-bode/" data-wpel-link="external" target="_blank">Motor Control Systems &#8211; Bode Plot &#38; Stability</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_72197" style="width: 1587px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2017/01/Set-point_control.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-72197" class="size-full wp-image-72197" src="http://robohub.org/wp-content/uploads/2017/01/Set-point_control.png" alt="" width="1577" height="610" srcset="https://robohub.org/wp-content/uploads/2017/01/Set-point_control.png 1577w, https://robohub.org/wp-content/uploads/2017/01/Set-point_control-425x164.png 425w, https://robohub.org/wp-content/uploads/2017/01/Set-point_control-768x297.png 768w, https://robohub.org/wp-content/uploads/2017/01/Set-point_control-1024x396.png 1024w, https://robohub.org/wp-content/uploads/2017/01/Set-point_control-500x193.png 500w" sizes="(max-width: 1577px) 100vw, 1577px" /></a><p id="caption-attachment-72197" class="wp-caption-text">Set point control: Image: Wikipedia Commons</p></div>
<p>I was asked on the <a href="http://robotsforroboticists.com/forum/viewtopic.php?f=9&amp;t=4" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Robots for Roboticists forum</a> about tuning motors and understanding Bode plots. Many motor control software packages come with tuning tools that can generate Bode plots. This post is my response to that question.<span id="more-70018"></span></p>
<hr class="xh2  ">
<p>What is a control system? A control system alters the future state of its system to a more desirable outcome. We often work with <em>feedback control systems</em> (also called <em>closed-loop control</em>), where the result of the command is fed back into the control system. In particular, we are looking for the error between the command and the desired response. If the output state is not fed back into the control system it is referred to as an <em>open loop system</em>.</p>
<a href="http://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-70049" src="http://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot.jpg" alt="Elmo_BodePlot" width="1263" height="851" srcset="https://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot.jpg 1263w, https://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot-425x286.jpg 425w, https://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot-1024x690.jpg 1024w, https://robohub.org/wp-content/uploads/2017/01/Elmo_BodePlot-445x300.jpg 445w" sizes="(max-width: 1263px) 100vw, 1263px" /></a>
<p>The frequency of a system can be hard to visualize just by watching the motors motion. The frequency of the system is when you convert the time domain signal (ie. you look at the motors motion over time), and convert it into the frequency domain using a Fourier transform. Once you convert the signal into the frequency domain we can use Bode plots. Bode plots help us visualize (the transfer function) of a control system response and to verify its stability.</p>
<p><strong><blockquote>Random Note:</strong><br />
Assuming you know the transfer function, in an open loop system you can just use root finding (ie. finding the values that make the equation equal to 0) to check stability (by making sure that all roots are negative real values). For feedback based closed loop system we can modify the above and solve with a computer (since math is hard), or use the Bode plot to help understand the control system better. (I should also point out you can use <a href="http://home.scarlet.be/colleman/upgrades/SenS/Chapter13_2%20RouthHurwitz%20Analysis%201.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Routh-Hurwitz</a> to avoid the complex math, this will need to be another post…)</blockquote></p>
<p>In general, the Bode plots are showing the phase and gain (magnitude) from your input control signal until it reaches the output (command) in the frequency domain.</p>
<h2>Parts of the Bode Plot</h2>
<p><strong>Gain</strong> is the shift in value between the input signal and resultant command. If you had a system with no gain and no losses, then you would have a straight horizontal line with 0dB of gain. You will usually see the gain drop off (decrease) on the right side of the magnitude plot. The larger the frequency range until it starts dropping off, shows a system that will be stable in more conditions. Random bumps and curves in the main curve are often signs of instability. If the gain increases anywhere to infinity (ie. large values) that is often a sign of instability, and you need to rethink your controller settings! If you have spikes in gain see the filtering section below.</p>
<a href="http://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-02-20-at-15.15.17.png" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-72195" src="http://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-02-20-at-15.15.17.png" alt="" width="624" height="131" srcset="https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-02-20-at-15.15.17.png 624w, https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-02-20-at-15.15.17-425x89.png 425w, https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-02-20-at-15.15.17-500x105.png 500w" sizes="(max-width: 624px) 100vw, 624px" /></a>
<p><strong>Bandwidth</strong> is the area from the top of the curve until the magnitude degrades by -3dB. So in the image above you can see the curve dropping at around 100Hz. So the bandwidth of your system is around 100Hz. This tool actually shows the exact bandwidth value of 118.9Hz in the box at the lower right of the image. Controls past 118.9Hz will by sluggish or unresponsive.</p>
<p><strong>Phase</strong> describes the time shift between the input signal and the output command. A phase of 360 is for a single cycle. So if you have a 1KHz (ie 1000Hz) command signal each 360 degrees in the chart would represent 1/1000 of a second (converting frequency to time) or 1 millisecond. You can see in the phase diagram that once you exceed the bandwidth it will take longer for the desired input signal to be transferred to the output signal.</p>
<h2>Filtering specific frequencies</h2>
<p>Various filters (low-pass, notch, etc..) are often applied to remove a resonance at a specific frequency. For example, if you spin a motor and you see at a specific frequency things start to shake violently, you can add a filter so the gain will be reduced at that frequency. In general, you should tune a motor with no filters, and only add the filters if needed.</p>
<h2>Verifying control parameters</h2>
<p>You can verify that the selected gains are good by looking at the output waveform when a step command is applied (in the time domain); this is sometimes referred to as oscilloscope mode. If there is a lot of initial ringing (constant changing) or overshoot in the beginning of motion your gains are probably too high. If the initial command is slowly reaching the desired output you might need to increase your gains.</p>
<div id="attachment_72196" style="width: 1402px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-72196" class="size-full wp-image-72196" src="http://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots.png" alt="" width="1392" height="286" srcset="https://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots.png 1392w, https://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots-425x87.png 425w, https://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots-768x158.png 768w, https://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots-1024x210.png 1024w, https://robohub.org/wp-content/uploads/2017/01/motor_tuning_plots-500x103.png 500w" sizes="(max-width: 1392px) 100vw, 1392px" /></a><p id="caption-attachment-72196" class="wp-caption-text">Plots showing common tuning problems followed by a good response curve. The blue lines are the command, and the red lines are the actual motor output.</p></div>
<p>In the image above starting from the left we can see:<br />
1. Overshooting of the output motion, with a little signal ringing as it settles to the command. A little overshoot is often fine, but we do try to minimize overshoot while still having a responsive system.<br />
2. Slow response of the output. We might want a faster response so the system will be less sluggish. As you make the system less sluggish you often increase the overshooting and potential for instability.<br />
3. Highly unstable. Starts with a bunch of oscillation, followed by a large spike in command output. We want to avoid this!<br />
4. Finally this right-most plot looks good. The motor output is directly on top of the commanded motion, with a very slight overshoot (if you look close).</p>
<p>For more information on tuning controllers <a href="http://robotsforroboticists.com/pid-control/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">visit my post on PID Controllers</a>.</p>
<p>Also while I talk a lot about motors, most of the above works for any control system and does not necessarily need to be a motor.</p>
<hr />
<p>I want to thank MC_Newbie on the forum for this question.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to mount an external removable hard drive on a robot</title>
		<link>https://robohub.org/how-to-mount-an-external-removable-hard-drive-on-a-robot/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Mon, 23 Jan 2017 16:48:06 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[robots for roboticists]]></category>
		<guid isPermaLink="false">http://robohub.org/how-to-mount-an-external-removable-hard-drive-on-a-robot/</guid>

					<description><![CDATA[<p>We often want to add an external hard drive to our robots in order to have a dedicated drive for data collection. Having the dedicated drive lets the primary drive remain uncluttered, have less wear-and-tear, split logging between drives for performance, and potentially be a larger spinning disk (as opposed to an expensive SSD). It [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/mount-external-removable-hard-drive-robot/" data-wpel-link="external" target="_blank">How to Mount an External Removable Hard Drive on a Robot</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_69882" style="width: 1290px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-69882" class="size-full wp-image-69882" src="http://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280.jpg" alt="Credit: CC0 Public Domain" width="1280" height="853" srcset="https://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280.jpg 1280w, https://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280-1024x682.jpg 1024w, https://robohub.org/wp-content/uploads/2017/01/disc-1085276_1280-450x300.jpg 450w" sizes="(max-width: 1280px) 100vw, 1280px" /></a><p id="caption-attachment-69882" class="wp-caption-text">Credit: CC0 Public Domain</p></div>
<p>We often want to add an external hard drive to our robots in order to have a dedicated drive for data collection. Having the dedicated drive lets the primary drive remain uncluttered, have less wear-and-tear, split logging between drives for performance, and potentially be a larger spinning disk (as opposed to an expensive SSD). It is also useful when the main hard drive is read only.<span id="more-68777"></span></p>
<p><em>(For mechanical mounting skip to the end of this post)</em></p>
<p>So, how should you mount an external hard drive to your robot? There are many tutorials online and resources, however, this is how I do it and why (assuming Linux).</p>
<p>In the <em>/etc/fstab</em> file I add the following line:</p>
<a href="http://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-01-23-at-17.55.25.png" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-69881" src="http://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-01-23-at-17.55.25.png" alt="mount-hard-drive-robot" width="622" height="76" srcset="https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-01-23-at-17.55.25.png 622w, https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-01-23-at-17.55.25-425x52.png 425w, https://robohub.org/wp-content/uploads/2017/01/Screen-Shot-2017-01-23-at-17.55.25-500x61.png 500w" sizes="(max-width: 622px) 100vw, 622px" /></a>
<p>The /dev/sdb1 needs to be changed based on your hard disk configuration, however typically if you have one primary drive and one external drive, the external will be sdb1. While you can name a drive based on its unique ID, I usually just do it based how the drive appears in /dev. This lets us plug any (one) drive into the computer and let it be used for data collection.</p>
<p>You need to create a location that the hard disk should be mounted to (for you to access it from). So before the above change you should create that mount directory. To make the directory above you can type <em>sudo mkdir /media/data</em>. I generally use Ubuntu, however in other distributions you might want to use <em>sudo mkdir /mnt/data</em> if /media does not exist.</p>
<p>Next is the file system. Generally in a Linux only environment ext4 is used. If you are in a mixed mode where you need to connect to Windows or Mac machines you might want to use vfat.</p>
<p>Now for the options. The options I often use are:</p>
<p><strong>async,auto,user,exec,suid,rw,nobootwait,noatime</strong><br />
<strong>async – </strong>Lets data be written to a drive asynchronously. If many cases you might want this to be set to synchronous <em>sync</em><br />
<strong>auto – </strong>Mounts drive on boot and/or with mount -a<br />
<strong>user – </strong>Allows any user to mount this drive<br />
<strong>exec – </strong>Lets you execute binaries from the drive (might not be needed if you are only writing data)<br />
<strong>suid – </strong>Allows the user ID to be set when executing a binary (might not be needed if you are only writing data)<br />
<strong>rw – </strong>Read &amp; Write access to the drive when mounted<br />
<strong>nobootwait – </strong>Does not interrupt the boot sequence if drive not connected.<br />
<strong>noatime – </strong>Disables writing file access times to the drive every time you read a file</p>
<p>Depending on the distro I also sometimes add <strong>nofail</strong> to work with <strong>nobootwait</strong>.</p>
<p>With the method of mounting the drive above the secondary drive can be auto mounted to the same mount point at boot. If the drive is not present at boot, the boot sequence will not fail. After the computer is up the drive will automatically mount or you might need to type <em>sudo mount -a</em> to mount the drive.</p>
<p>You can see <a href="https://wiki.archlinux.org/index.php/Fstab" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://wiki.archlinux.org/index.php/Fstab</a> for more information on /etc/fstab.</p>
<hr />
<p>I spent the top part of this post talking about mounting from the operating system perspective, however some people might get to this page for physical mounting.</p>
<p>There are many ways to mount a hard drive, these range from velcro, to external enclosures, to removable bays.</p>
<p>Here is one way to mount a hard disk for removable data drives that I like:</p>
<a href="http://robohub.org/wp-content/uploads/2016/12/hard_drive_dock.png" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-69876" src="http://robohub.org/wp-content/uploads/2016/12/hard_drive_dock.png" alt="hard_drive_dock" width="634" height="309" srcset="https://robohub.org/wp-content/uploads/2016/12/hard_drive_dock.png 634w, https://robohub.org/wp-content/uploads/2016/12/hard_drive_dock-425x207.png 425w, https://robohub.org/wp-content/uploads/2016/12/hard_drive_dock-500x244.png 500w" sizes="(max-width: 634px) 100vw, 634px" /></a>
<p><em>ICY DOCK ToughArmor MB991SK-B Full Metal 2.5″ SATA 6Gb/s SSD/HDD Hot Swap Mobile Rack for 3.5″ Device Bay (Fits 7, 9.5, 12.5, 15mm height drive) From Newegg.com</em></p>
<a href="http://robohub.org/wp-content/uploads/2016/12/hard_drive_sled.png" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-69877" src="http://robohub.org/wp-content/uploads/2016/12/hard_drive_sled.png" alt="hard_drive_sled" width="300" height="135" /></a>
<p>Sled<em> that slides and locks into the hard drive bay. The hard drive goes inside of this </em>sled<em>. From newegg.com</em></p>
<p>This provides a secure mount that will not let the drive fall out while also protecting the drive. It also allows for swapping drives as disks get full and we want to log more data. We often fill up a drive and take it offsite to transfer to a server while filling up another drive. This allows us to easily rotate drives.</p>
<p><em>The post <a href="http://robotsforroboticists.com/mount-external-removable-hard-drive-robot/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">How to Mount an External Removable Hard Drive on a Robot</a> appeared first on <a href="http://robotsforroboticists.com/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Book review: The Car Hacker’s Handbook, by Craig Smith</title>
		<link>https://robohub.org/book-review-the-car-hackers-handbook-by-craig-smith/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 25 Nov 2016 10:05:33 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[cars]]></category>
		<category><![CDATA[robots for roboticists]]></category>
		<guid isPermaLink="false">http://robohub.org/book-review-the-car-hackers-handbook-by-craig-smith/</guid>

					<description><![CDATA[<p>The Car Hacker&#8217;s Handbook A Guide for the Penetration Tester is a really interesting book about how to interface with cars to read from onboard systems, spoof devices, and control the vehicle on your own. One of the reasons I really like this book is that it is easily the best book I have ever [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/book-review-car-hackers-handbook-craig-smith/" data-wpel-link="external" target="_blank">Book Review: The Car Hacker&#8217;s Handbook by Craig Smith</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<a href="http://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-large wp-image-67338" src="http://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280-1024x735.jpg" alt="cars-lines-driving-dividing" width="1024" height="735" srcset="https://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280-1024x735.jpg 1024w, https://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280-425x305.jpg 425w, https://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280-418x300.jpg 418w, https://robohub.org/wp-content/uploads/2016/10/cars-1578513_1280.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></a>
<p>The <a href="https://www.amazon.com/Car-Hackers-Handbook-Penetration-Tester/dp/1593277032/ref=sr_1_1?ie=UTF8&amp;qid=1472246628&amp;sr=8-1&amp;keywords=car+hackers+handbook" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Car Hacker’s Handbook</a> <em>A Guide for the Penetration Tester</em> is a book about how to interface with cars to read from onboard systems, spoof devices, and control the vehicle on your own. I enjoyed this book, it is easily the best book I found on learning how to use a CAN bus.<span id="more-66076"></span></p>
<p>The book starts by putting the reader in the proper mindset for exploring the security and attack paths for a given vehicle. The first chapter gets the reader thinking about all (most) of the ways that you can interface with a vehicle to hack it and specific suggestions about how to approach each of those. He describes various ways of rating threats. One of them being DREAD. DREAD is a formal way of assessing threats with a focus on malicious intent (which other rating systems often ignore). When I first read about DREAD I thought he was going to start rating systems with the Harry Potter grading system of Outstanding, Exceeds Expectations, Acceptable, Poor, Dreadful and Troll. This section has two uses; if you modify systems it will help you figure out how to get access to a vehicle, if you build systems it will help you think about securing what you build.</p>
<div id="attachment_67261" style="width: 640px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/09/DREAD.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-67261" class="size-full wp-image-67261" src="http://robohub.org/wp-content/uploads/2016/09/DREAD.png" alt="Source: Robots for Roboticists" width="630" height="403" srcset="https://robohub.org/wp-content/uploads/2016/09/DREAD.png 630w, https://robohub.org/wp-content/uploads/2016/09/DREAD-425x272.png 425w, https://robohub.org/wp-content/uploads/2016/09/DREAD-469x300.png 469w" sizes="(max-width: 630px) 100vw, 630px" /></a><p id="caption-attachment-67261" class="wp-caption-text">Source: Robots for Roboticists. After discussing security the book switched to things that really interest me such as bus protocols, tools to work with them, and how to reverse engineer messages on those buses. For vehicles, it seems that the year 2000 was the turning point where vehicles started to use digital buses thereby being “hackable.&#8221;</p></div>
<p>Some of the buses that you should be prepared to find discussed in this book and in cars are:</p>
<ul>
<li>CAN (Low-speed LS-CAN, mid-speed MS-CAN, high-speed HS-CAN)</li>
<li>CANopen</li>
<li>GMLAN</li>
<li>SAE J1850</li>
<li>PWM</li>
<li>VPW</li>
<li>Keyword</li>
<li>ISO 9141-2</li>
<li>LIN</li>
<li>MOST</li>
<li>FlexRay</li>
<li>Automotive Ethernet (&amp; AVB)</li>
</ul>
<p>I had no idea there were that many protocols in use and I have only heard of 2/3 of them!</p>
<p>The book introduces a bunch of tools for working with CAN buses, I have never used some of them but they are opensource Linux tools that seem to have nice features. I will definitely check them out next time I am working with a CAN bus. There is also an appendix at the end of the book that discusses many tools ranging from hobby level to professional. This follows up with some really basic writing of CAN drivers in Linux and how to communicate with your vehicle (the book calls it weaponizing, I guess it sounds good but I would call it <em>using what you know to get stuff done</em>).</p>
<p>Importantly, this book discusses what to do if you get into different fault conditions. For example:</p>
<ul>
<li>Flashing lights</li>
<li>Car not turning on</li>
<li>Car not turning off</li>
<li>Vehicle responding recklessly</li>
<li>Bricking your car !!!***@@@@##!!</li>
</ul>
<p>That list above can be scary and the author gives some advice for handling them, however, it might have been nice if the author spent more time discussing the potential faults and how to avoid them (particularly, how not to brick your car!).</p>
<p>It is good to hear that most engine control units (ECU’s) have some sort of tamper protection so you can not change its firmware. However, the author does note that some of those protections are laughably weak. There are a few chapters on understating common ECU protocols, how to simulate them, and how to attack them. This is probably above what most robotic integrations would do, however, I have worked on projects where we removed an ECU and replaced it with our own that we could configure; so this is still a good topic to read. It also has some content that is good for generic embedded systems that are not covered in most embedded systems books.</p>
<p>One thing this book lacks is details about specific car models. I like that the core of the book is not manufacturer dependent but it would be nice to have more information about CAN codes, protocol information, pinouts, ECU configurations, etc. I think some of that high-level information might be good as an appendix, with the full expanded set of documentation as web content for readers.</p>
<p>This book has a good description of applied CAN hardware as well as the protocol. This is what I wish I was able to read when I first started working with CAN buses. I give this book 5 out of 5. It has really good practical knowledge for hacking your vehicle without going into a lot of theory. I would recommend this book for engineers working with embedded systems, even if they do not work with cars. I think that Smith wrote a boot about how to do stuff; which had the unintended consequence of making a great book for learning how to actually work with real systems.</p>
<p>After reading this book I really want to go sniff my vehicles buses and see what I can find.</p>
<hr />
<p>I would like to thank No Starch Press for providing me with a hard copy of this book for review.</p>
<p><em>Disclaimer: I have never met the author of this book and the opinions above are mine.</em></p>
<p>The post <a href="http://robotsforroboticists.com/book-review-car-hackers-handbook-craig-smith/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Book Review: The Car Hacker’s Handbook by Craig Smith</a> appeared first on <a href="http://robotsforroboticists.com/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Robots For Roboticists</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Should your robot have a tether?</title>
		<link>https://robohub.org/should-your-robot-have-a-tether/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Thu, 22 Sep 2016 14:19:31 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/should-your-robot-have-a-tether/</guid>

					<description><![CDATA[<p>Some people swear that all tethers are bad. Some people recommend attaching a tether to robots in order to provide power (to save the mass and volume of the batteries), for reliable fast communications, transfer of pressure or fluid, to track a robots position, or as a safety harness (in case the robot needs to [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/tethers/" data-wpel-link="external" target="_blank">Tether&#8217;s: Should Your Robot Have One?</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_66475" style="width: 1010px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/09/tethered-robot-robotics-trex.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-66475" class="size-full wp-image-66475" src="http://robohub.org/wp-content/uploads/2016/09/tethered-robot-robotics-trex.jpg" alt="TReX (Tethered Robotic Explorer). Credit: utiasASRL/YouTube" width="1000" height="581" srcset="https://robohub.org/wp-content/uploads/2016/09/tethered-robot-robotics-trex.jpg 1000w, https://robohub.org/wp-content/uploads/2016/09/tethered-robot-robotics-trex-425x247.jpg 425w, https://robohub.org/wp-content/uploads/2016/09/tethered-robot-robotics-trex-500x291.jpg 500w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><p id="caption-attachment-66475" class="wp-caption-text">TReX (Tethered Robotic Explorer). Credit: utiasASRL/YouTube</p></div>
<p>Some people swear all tethers are bad. Some recommend attaching a tether to robots in order to provide power (to save the mass and volume of the batteries), for reliable fast communications, transfer of pressure or fluid, to track a robot&#8217;s position, or as a safety harness (in case the robot needs to be dragged out). However, before designing a tether there are several things you need to consider.<span id="more-66372"></span></p>
<p>Here are some things to think about:</p>
<ol>
<li>What should be in the tether? For example, can you put power on the robot and then only run communications to the robot?</li>
<li>Tethers can easily snag on obstacles as the robot drives. This can cause your robot to get stuck and not be able to proceed forward or get back out.</li>
<li>Tethers need to be managed so that you do not get snagged (as discussed above) and so that you do not drive over it, which can damage the tether.</li>
<li>Tethers can get bulky. The longer the tether you need, the more mass and volume you will need to carry and the more heat you will produce.</li>
<li>Tethers introduce drag, which the robot will need to overcome while driving.</li>
<li>Abrasion of the tether with use.</li>
<li>Cables, wire, and tubes in the tether can break which might incapacitate the robot. If the robot is going into a critical environment you might not be able to retrieve the robot should it fail.</li>
</ol>
<div id="attachment_66476" style="width: 283px" class="wp-caption alignleft"><a href="http://robohub.org/wp-content/uploads/2016/09/tethor.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-66476" class="size-full wp-image-66476" src="http://robohub.org/wp-content/uploads/2016/09/tethor.png" alt="Credit: Robots for Roboticists " width="273" height="180" /></a><p id="caption-attachment-66476" class="wp-caption-text">Credit: Robots for Roboticists</p></div>
<p>This image (to the left) shows how a tether can tighten around corners as the robot drives. As the tether gets pulled into the corners the force on the tether increases, and increases the chance of the robot getting stuck, breaking, and making mobility more difficult.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Tension on tether base (neglecting the coefficient of friction from contact points) can be computed as shown below.</p>
<div id="attachment_66474" style="width: 799px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/09/force_on_tether.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-66474" class="size-full wp-image-66474" src="http://robohub.org/wp-content/uploads/2016/09/force_on_tether.png" alt="Force on a tethered robot. This shows why it is much harder to pull a robot after it has gone around a bend." width="789" height="386" srcset="https://robohub.org/wp-content/uploads/2016/09/force_on_tether.png 789w, https://robohub.org/wp-content/uploads/2016/09/force_on_tether-425x208.png 425w, https://robohub.org/wp-content/uploads/2016/09/force_on_tether-500x245.png 500w" sizes="(max-width: 789px) 100vw, 789px" /></a><p id="caption-attachment-66474" class="wp-caption-text">Force on a tethered robot. This shows why it is much harder to pull a robot after it has gone around a bend.</p></div>
<p>For reasons I mentioned above, tethers are often deployed from the robot, not from base equipment. In underwater applications, you can usually feed the tether from the base without the problems seen on land. When choosing where to deploy the tether from you will need to consider:</p>
<ul>
<li>Can your robot support the volume/mass of the tether?</li>
<li>Where are the snag points?</li>
<li>Volume of the tether, which is: Volume = Area of cable x length of the cable</li>
<li>Heat generated by the tether from I<sup>2</sup>R losses.</li>
</ul>
<p><a href="http://repository.cmu.edu/cgi/viewcontent.cgi?article=1092&amp;context=robotics" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">This paper from Dante is a must read for anyone developing a tethered robot.</a> Dante is a robot that flipped while trying to climb out from a volcano partially due to bad tether angles on difficult terrain. While people often point to Dante as an example of why tethers are bad, there are more examples of tethers being used successfully. In the nuclear accident of Chernobyl, a number of robotic (tele-operated) vehicles <a href="http://io9.gizmodo.com/a-museum-of-robotic-equipment-used-during-the-chernobyl-512831778" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">(robot pictures)</a> were used in the recovery and cleanup. The robots were used for many things such as inspection, pushing radioactive material out of the way, turning over radioactive dirt and moving containers. Most of those robots were tethered (about 55 of the 60 vehicles). Many of those robots ultimately perished due to tether malfunctions, but that was after operating for extended times and doing good work. With new technology, better cable design, lower powered devices, better proprioception of the tether we should be able to do a better job building tethers.</p>
<p><a href="http://fsr.utias.utoronto.ca/submissions/FSR_2015_submission_46.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">TReX</a> is another paper that you need to check out before designing a tethered robot.</p>
<p>This is not really related but it is an interesting video showing Chernobyl robots and video from them (at least I think, it is in Russian).</p>
<div class="keep-aspect"><iframe title="Роботы и робототехнические комплексы на ЧАЭС" width="500" height="375" src="https://www.youtube-nocookie.com/embed/P6t6Ml0iVGk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>I think tethers often get a bad name, however, they can be used. In order to use a tether, the design must be carefully evaluated and the concept of operations of the robot needs to be reviewed. Once the robot is built people need to monitor the tether while the robot is operating.</p>
<p>The post <a href="http://robotsforroboticists.com/tethers/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Tether’s: Should Your Robot Have One?</a> appeared first on <a href="http://robotsforroboticists.com/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Robots For Roboticists</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Installing and running time synchronization, with chrony</title>
		<link>https://robohub.org/installing-and-running-time-synchronization-with-chrony/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 26 Aug 2016 11:15:51 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/installing-and-running-time-synchronization-with-chrony/</guid>

					<description><![CDATA[<p>Time synchronization is something that affects many robots. As robots have more computers and more sensors keeping everything in sync becomes increasingly important. Trying to look through log files where all of the times are skewed is not fun and makes processing difficult. Merging sensor data together with GPS can also be disastrous if the [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/chrony-gps-for-time-synchronization/" data-wpel-link="external" target="_blank">chrony with GPS for Time Synchronization &#8211; Kicks NTP&#8217;s A$$</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_65707" style="width: 910px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/08/bigstock-126949571.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-65707" class="size-full wp-image-65707" src="http://robohub.org/wp-content/uploads/2016/08/bigstock-126949571.jpg" alt="Time synchronization diagram. " width="900" height="900" srcset="https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571.jpg 900w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-290x290.jpg 290w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-425x425.jpg 425w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-100x100.jpg 100w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-220x220.jpg 220w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-300x300.jpg 300w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-32x32.jpg 32w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-64x64.jpg 64w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-96x96.jpg 96w, https://robohub.org/wp-content/uploads/2016/08/bigstock-126949571-128x128.jpg 128w" sizes="(max-width: 900px) 100vw, 900px" /></a><p id="caption-attachment-65707" class="wp-caption-text">Time synchronization diagram.</p></div>
<p>Time synchronization affects many robots. Robots have more computers and sensors, so keeping everything in sync is important. Trying to look through log files where all of the times are skewed is not fun and makes processing difficult. Merging sensor data together with GPS can also be disastrous if the times are offset. Further complicating time synchronization is that the robots are often not connected to the internet, so utilizing public time servers will not work.<span id="more-65433"></span></p>
<p>My preferred tool for time synchronization is <a href="https://chrony.tuxfamily.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">chrony</a>. Chrony is based on <a href="https://en.wikipedia.org/wiki/Network_Time_Protocol" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">NTP</a>, but performs better when not connected to the internet and has smoother clock adjustments, plus, is easier to get GPS and PPS signals into.</p>
<h2>Installing time synchronization</h2>
<p>If you are using GPS as your time source the first step is to wire the GPS to a serial port on your computer. If you want to use PPS make sure your GPS has a PPS output, such as the Garmin 16x or 18x). For wiring, I use the standard pins of 2,3 &amp; 5 (GPS tx, GPS rx, ground) for RS-232 DB-9 serial connections, then I run the PPS line into pin 1 of the DB9 connector. I have not tried it, but I assume the GPS with no PPS would work via USB.</p>
<p>There are 2 methods to installing chrony that I use:<br />
1. If a PPS (pulse per second) input is being used (such as from a GPS receiver), then we need to build chrony from source:</p>
<ul>
<li>git clone git://www.linuxpps.org/git/pps-tools pps-tools to get timepps.h.</li>
<li>From chrony install manual<br />
If a ‘timepps.h’ header is available (e.g. from the LinuxPPS project), chronyd will be built with PPS API reference clock driver. If the header is installed in a location that isn’t normally searched by the compiler, you can add it to the searched locations by setting CPPFLAGS variable to -I/path/to/timepps.</li>
<li>Then git clone git://git.tuxfamily.org/gitroot/chrony/chrony.git<br />
run .configure, make all, and make install</li>
<li>I needed to run sudo apt-get install bison to get it the make all to compile</li>
</ul>
<p>That should give you chrony with pps support!</p>
<p>2. If no PPS input is being used (this is the easy option):</p>
<ul>
<li>sudo apt-get install chrony</li>
</ul>
<p>Now, we need to install the GPS driver. For this I use <a href="http://catb.org/gpsd/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GPSD</a>. Using GPSD is nice because it is easy and allows you to run a <a href="http://wiki.ros.org/gpsd_client" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GPSD client</a> that listens to the GPS, so you can also use the position for your robot. GPSD is needed to allow clients to use the GPS that is connected to one serial port.</p>
<p>To install GPSD:</p>
<ul>
<li>sudo apt-get install gpsd<br />
The config file in <em>/etc/default/gps</em> should be edited using the dpkg command to set baud rate and the port of the GPS device.</li>
</ul>
<p>We now need to edit the chrony config file <em>/etc/crony/crony.cong</em> on the main computer:</p>
<ul>
<li><strong>If the robot will ever connect to the internet:</strong><br />
Modify the existing server lines to say offline right after the server name. ex. <em>server SERVER_NAME offline</em></li>
<li><strong>If the robot will never touch (figuratively) the internet:</strong><br />
Delete (or comment) all of the server lines</li>
</ul>
<p>Now here are some settings I change:<br />
# Stop bad estimates upsetting machine clock.<br />
maxupdateskew 100.0</p>
<p>I see many people also comment out <em>dumponexit</em>. I am not entirely sure why.</p>
<p>There are 2 ways to add the GPS/PPS:<br />
https://chrony.tuxfamily.org/manual.html<br />
https://chrony.tuxfamily.org/doc/2.3/manual.html#refclock-directive</p>
<p>1:<br />
# add socket with small delay for PPS<br />
refclock SOCK /var/run/chrony.sock offset 0.002 delay 1e-4 refid SOCK<br />
makestep 0.1 5<br />
maxupdateskew 100.0</p>
<p>set stratum local stratum 6</p>
<p>2:<br />
refclock PPS /dev/pps0 lock NMEA<br />
refclock SHM 0 offset 0.5 delay 0.2 refid NMEA noselect</p>
<p>On any secondary computers that need to sync with the main computer here is what I do</p>
<p>Remove all existing servers and then add our server:<br />
makestep -1 100<br />
# replace IP below with your server<br />
server 192.168.10.2 minpoll 1 maxpoll 2</p>
<p>I see many people also comment out <em>dumponexit</em>. I am not entirely sure why.</p>
<h2>Running time synchronization</h2>
<p>1. Start GPS Daemon: <em>sudo gpsd -n -N -D2 /dev/ttyS0</em> Changing /dev/ttySx for the port you can GPS connected to</p>
<ul>
<li>You should see a bunch of lines such as: gpsd:INFO PPS cycle&#8230;</li>
<li>This can also be run from an init.d script</li>
</ul>
<p>2. Running chrony: <em>sudo /etc/init.d/chrony start</em></p>
<p>The two commands I use most for debugging and checking status are <em>chronyc tracking</em> and <em>chronyc sources</em>.</p>
<ul>
<li>The tracking command shows how good your current time is and what the offset of your system clock is.</li>
<li>The sources command shows information about which sources are available, their status, and when they last were checked. If you are connected to the internet you will see a bunch of servers. If you are just connected to GPS and PPS you will just see those sources.</li>
<li>A good reference for the commands above is <a href="https://docs.fedoraproject.org/en-US/Fedora/18/html/System_Administrators_Guide/sect-Checking_if_chrony_is_synchronized.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">here</a>.</li>
</ul>
<div id="attachment_65709" style="width: 778px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/08/chrony.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-65709" class="size-full wp-image-65709" src="http://robohub.org/wp-content/uploads/2016/08/chrony.jpg" alt="Output of tracking and sources command for chrony while using GPS. If PPS was enabled it would also show as a source. Source: Wikipedia Commons" width="768" height="340" srcset="https://robohub.org/wp-content/uploads/2016/08/chrony.jpg 768w, https://robohub.org/wp-content/uploads/2016/08/chrony-425x188.jpg 425w, https://robohub.org/wp-content/uploads/2016/08/chrony-500x221.jpg 500w" sizes="(max-width: 768px) 100vw, 768px" /></a><p id="caption-attachment-65709" class="wp-caption-text">Output of tracking and sources command for chrony while using GPS. If PPS was enabled it would also show as a source. Source: Wikipedia Commons</p></div>
<p>One thing to be aware of is that with just GPS and no internet time servers I often see it can take 10 minutes for the chrony server to enter online mode. When checking any status such as <em>cronyc sources</em> you get an error saying <strong>506 Cannot talk to daemon</strong>. After connecting to an internet time server or waiting about 10 minutes chrony will come online and start working.</p>
<p>I know there is a lot of detail above, and you might need to tweak things for your application, but I hope it help and you can look back as a reference.</p>
<p>The post <a href="http://robotsforroboticists.com/chrony-gps-for-time-synchronization/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">chrony with GPS for Time Synchronization – Kicks NTP’s A$$</a> appeared first on <a href="http://robotsforroboticists.com/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Robots For Roboticists</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pros and cons for different types of drive selection</title>
		<link>https://robohub.org/pros-and-cons-for-different-types-of-drive-selection/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 29 Jul 2016 11:22:11 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/pros-and-cons-for-different-types-of-drive-selection/</guid>

					<description><![CDATA[<p>In the past we have looked at wheel design and the kinematics of skid steer and mecanum wheels. In this post we will take a quick look at different types of mobility types (ie. wheels, tracks, and how to connect them). I know the items in this list are not direct comparisons. For example listing [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/drive-selection/" data-wpel-link="external" target="_blank">Drive Selection &#8211; Wheels, tracks and more</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_64865" style="width: 1034px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/07/mars-rover-11609.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64865" class="size-large wp-image-64865" src="http://robohub.org/wp-content/uploads/2016/07/mars-rover-11609-1024x670.jpg" alt="Different wheels for robots and rovers. Credit: CC0 public domain" width="1024" height="670" srcset="https://robohub.org/wp-content/uploads/2016/07/mars-rover-11609-1024x670.jpg 1024w, https://robohub.org/wp-content/uploads/2016/07/mars-rover-11609-425x278.jpg 425w, https://robohub.org/wp-content/uploads/2016/07/mars-rover-11609-458x300.jpg 458w, https://robohub.org/wp-content/uploads/2016/07/mars-rover-11609.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><p id="caption-attachment-64865" class="wp-caption-text">Different wheels for robots and rovers. Credit: CC0 public domain</p></div>
<p>In the past, we have looked at <a href="http://robohub.org/drive-kinematics-skid-steer-and-mecanum-ros-twist-included/" target="_blank" data-wpel-link="internal">wheel design and the kinematics of skid steer and mecanum wheels</a>. In this post, we will take a quick look at different types of mobility types (ie. wheels, tracks) and how to connect them. <span id="more-64751"></span></p>
<p>I know the items in this list are not direct comparisons. For example, listing rocker bogie is not necessarily exclusive to other types listed. Also, I know that you can design a vehicle to get around the pros and cons that I list below. The list is based on the common mechanical configurations.</p>
<p>For the purpose of this post:</p>
<ul>
<li><strong>Holonomic motion: </strong>is where a vehicle can go in all X and Y directions and is not constrained.</li>
<li><strong>Non-holonomic motion: </strong>is where a vehicle is constrained to only certain motions. An example is a car that is not capable to drive sideways (with its ackerman steering). Don’t yell at me about the parallel parking magical cars. They are not the norm.</li>
</ul>
<div id="attachment_64869" style="width: 1010px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/07/drive_types_3-use.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64869" class="size-full wp-image-64869" src="http://robohub.org/wp-content/uploads/2016/07/drive_types_3-use.jpg" alt="Source: Robots for Roboticists " width="1000" height="1023" srcset="https://robohub.org/wp-content/uploads/2016/07/drive_types_3-use.jpg 1000w, https://robohub.org/wp-content/uploads/2016/07/drive_types_3-use-415x425.jpg 415w, https://robohub.org/wp-content/uploads/2016/07/drive_types_3-use-293x300.jpg 293w, https://robohub.org/wp-content/uploads/2016/07/drive_types_3-use-32x32.jpg 32w, https://robohub.org/wp-content/uploads/2016/07/drive_types_3-use-64x64.jpg 64w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><p id="caption-attachment-64869" class="wp-caption-text">Source: Robots for Roboticists</p></div>
<table class=" aligncenter" style="height: 1385px; font-size: 0.9em; text-align: left;" width="100%" cellspacing="0" cellpadding="15">
<tbody>
<tr>
<td width="33%"><strong>Type</strong></td>
<td width="33%"><strong>Pros</strong></td>
<td width="33%"><strong>Cons</strong></td>
</tr>
<tr>
<td width="33%">Tracks (Differential Drive)</td>
<td width="33%">Good mobility for rough terrain, low ground pressure</td>
<td width="33%">Complex mechanism, high power usage when turning</td>
</tr>
<tr style="padding-left: 10px;">
<td width="33%">Skid Steer 4 wheel</td>
<td width="33%">Very simple, high weight capacity</td>
<td width="33%">High power usage, requires skidding/slipping</td>
</tr>
<tr>
<td width="33%">Differential drive 2 wheel + Passive Caster(s)</td>
<td width="33%">Easy</td>
<td width="33%">Lower weight designs, less precise controls. bad for obstacles/bumps</td>
</tr>
<tr>
<td width="33%">2 wheel + 1 Powered Steering Caster</td>
<td width="33%">Easy mechanical, powered steering wheel for control</td>
<td width="33%">Lower weight designs, potentially a lot of weight on steering wheel.</td>
</tr>
<tr>
<td width="33%">2 wheel (Segway Drive)</td>
<td width="33%">Easy mechanical, fun!</td>
<td width="33%">Not dynamically stable</td>
</tr>
<tr>
<td width="33%">Ackerman Steering</td>
<td width="33%">Wheels do not need to slip to turn. Fixed rear wheels makes control geometry easier.</td>
<td width="33%">Increased motor count</td>
</tr>
<tr>
<td width="33%">Rear wheel forklift steering</td>
<td width="33%">Tight maneuverability, good if weight is on front wheels</td>
<td width="33%">Less responsive than ackerman, unstable at “high” speeds</td>
</tr>
<tr>
<td width="33%">Independent all wheel steering</td>
<td width="33%">Lot of flexibility for motion</td>
<td width="33%">Complexity of mechanism and large number of motors. More coordination needed for turns.</td>
</tr>
<tr>
<td width="33%">Rocker Bogie / Body Averaging</td>
<td width="33%">Helps body average the chassis to minimize pitch. Allows all wheels to maintain ground contact while distributing the weight.</td>
<td width="33%">Mechanical complexity</td>
</tr>
<tr>
<td width="33%">Omni</td>
<td width="33%">Non-holonomic, light, simple, Best performance when traveling diagonal, number of wheels can be varied</td>
<td width="33%">Motion can be bumpy, sensitive to nonsmooth terrain, low torque for pushing</td>
</tr>
<tr>
<td width="33%">Mecanum O*</td>
<td width="33%">Skid steer is possible, holonomic motions, can support heavy loads</td>
<td width="33%">Motion can be bumpy, very sensitive to nonsmooth terrain, can be noisy, lots of parts</td>
</tr>
<tr>
<td width="33%">Crab Steer</td>
<td width="33%">Allows 4 wheel drive vehicle to translate at an angles/horizontally (holonomic motion). Often wheels can all turn in for point turns.</td>
<td width="33%">All 4 wheels need to be actuated to spin and turn (often with 8 motors, but can be done with less). Can be unstable on hills.</td>
</tr>
<tr>
<td width="33%">Legs (2,4,6,etc..)</td>
<td width="33%">Ease of steeping over difficult terrain</td>
<td width="33%">Hard, complex, high power</td>
</tr>
<tr>
<td width="33%"><a href="http://www.msl.ri.cmu.edu/projects/ballbot/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Single Ball (Ballbot)</a></td>
<td width="33%">Small size base, highly maneuverable, can change robots orientation</td>
<td width="33%">Hard controls, not dynamically stable, good for taller robot and not wider robots</td>
</tr>
<tr>
<td width="33%">Inchworming** (Peristaltic Motion)</td>
<td width="33%">Increased drawbar and slope climbing due to utilizing static wheels/friction</td>
<td width="33%">Requires extra actuation, slower than typical motion, can be high power consumption</td>
</tr>
</tbody>
</table>
<p><em>*Mecanum X vs O configuration is based on how the wheels are mounted. With mecanum wheels the left and right side wheels are physically different. Looking from the bottom you want an O configuration. The X configuration does not allow rotation (without fighting the rollers).</em></p>
<div id="attachment_64867" style="width: 480px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/07/mecanum_X_vs_O.png" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64867" class="wp-image-64867 size-full" src="http://robohub.org/wp-content/uploads/2016/07/mecanum_X_vs_O.png" alt="mecanum_X_vs_O" width="470" height="436" srcset="https://robohub.org/wp-content/uploads/2016/07/mecanum_X_vs_O.png 470w, https://robohub.org/wp-content/uploads/2016/07/mecanum_X_vs_O-425x394.png 425w, https://robohub.org/wp-content/uploads/2016/07/mecanum_X_vs_O-323x300.png 323w" sizes="(max-width: 470px) 100vw, 470px" /></a><p id="caption-attachment-64867" class="wp-caption-text">Mecanum wheel configurations. When viewed from the bottom the direction of the rollers form an X or an O shape.</p></div>
<p><em>** Basic description of inchworming. Inchworming moves one set of wheels at a time to utilize static friction for increased mobility.</em></p>
<div id="attachment_64868" style="width: 697px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/07/inchworming.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64868" class="size-full wp-image-64868" src="http://robohub.org/wp-content/uploads/2016/07/inchworming.jpg" alt="Inchworming image. Image on left shows standard driving. Images on right shows inchworming during each of the two stages of motion. The top image shows the robot lowering while moving the front wheel. The bottom image shows the robot raising up while pulling the rear wheel in." width="687" height="496" srcset="https://robohub.org/wp-content/uploads/2016/07/inchworming.jpg 687w, https://robohub.org/wp-content/uploads/2016/07/inchworming-425x307.jpg 425w, https://robohub.org/wp-content/uploads/2016/07/inchworming-416x300.jpg 416w" sizes="(max-width: 687px) 100vw, 687px" /></a><p id="caption-attachment-64868" class="wp-caption-text">Inchworming image. Image on left shows standard driving. Images on right shows inchworming during each of the two stages of motion. The top image shows the robot lowering while moving the front wheel. The bottom image shows the robot raising up while pulling the rear wheel in.</p></div>
<p>First described <a href="http://www.ri.cmu.edu/pub_files/2009/1/09aiaa.scarab.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">here</a> and further examined by others.</p>
<p>For more examples of unusual locomotion methods, visit <a href="http://www.unusuallocomotion.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">unusuallocomotion.com</a>.</p>
<p>Are there other mobility options that I should have included?</p>
<p><a href="http://robotsforroboticists.com/drive-selection/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">Drive Selection – Wheels, tracks and more</a> appeared first on <a href="http://robotsforroboticists.com/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Drive kinematics: Skid steer and mecanum (ROS twist included)</title>
		<link>https://robohub.org/drive-kinematics-skid-steer-and-mecanum-ros-twist-included/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 19 Jul 2016 13:43:39 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/drive-kinematics-skid-steer-and-mecanum-ros-twist-included/</guid>

					<description><![CDATA[<p>Hi all I am often in need of the basic kinematic motion equations for skid steer vehicles. I have also recently been working with mecanum wheeled vehicles. The skid steer equations are fairly simple and easy to find. The mecanum wheel equations are harder to find and there are different versions floating around. The first [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/drive-kinematics/" data-wpel-link="external" target="_blank">Drive Kinematics: Skid Steer &#38; Mecanum (ROS Twist included)</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_64607" style="width: 910px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/07/john-deer-skid.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64607" class="size-full wp-image-64607" src="http://robohub.org/wp-content/uploads/2016/07/john-deer-skid.jpg" alt="Photo: Wikipedia" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2016/07/john-deer-skid.jpg 900w, https://robohub.org/wp-content/uploads/2016/07/john-deer-skid-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2016/07/john-deer-skid-450x300.jpg 450w" sizes="(max-width: 900px) 100vw, 900px" /></a><p id="caption-attachment-64607" class="wp-caption-text">Photo: Wikipedia</p></div>
<p>I am often in need of the basic kinematic motion equations for skid steer vehicles. I have also recently been working with mecanum wheeled vehicles. The skid steer equations are fairly simple and easy to find, however, I will include it in different versions and include a ROS approach. The mecanum wheel equations are harder to find and there are different versions floating around. The first version I found had a lot of trig and mostly worked. The version I present here is easier to intuitively understand and seems to work better (I don’t need a random scale factor for this version), I also include a ROS approach for them.<span id="more-63902"></span></p>
<h2>Skid Steer / Differential Drive</h2>
<p>Here is some math for 2 and 4 wheel differential drive vehicles, 2 wheels and a castor, or skid steer tracked vehicles.</p>
<h3>Arc based commands</h3>
<p>The basic skid steer equations are:</p>
<p>velocity_right = <em>w</em>(<em>RADIUS_OF_ARC_TO_DRIVE + WHEEL_BASE/2)<br />
velocity_left = <em>w</em>(<em>RADIUS_OF_ARC_TO_DRIVE – WHEEL_BASE/2)</em></em></p>
<p>Where <em>w</em> is the angular rotation, RADIUS_OF_ARC_TO_DRIVE is the arc radius that the robot should drive, and the WHEEL_BASE is the distance from the center of the left wheel to the center of the right wheel (See image above).</p>
<p>This can also be written as:</p>
<p><em>w</em> = (velocity_right-velocity_left)/WHEEL_BASE</p>
<p>There are two special cases:</p>
<p>IF velocity_right == velocity_left :<br />
THEN the radius of the arc is infinite so the robot will drive straight.</p>
<p>IF velocity_right == -velocity_left :<br />
THEN the radius of the arc is 0, and the robot rotates in place (ie. point turn)</p>
<h3>Linear &amp; Angular Velocity Commands for ROS</h3>
<p>In ROS if using the <a href="http://docs.ros.org/api/geometry_msgs/html/msg/Twist.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Twist topic</a> (which is the default for drive messages) (message name is often cmd_vel) you will often set linear_velocity in the <em>linear.x</em> field and angular_velocity in the <em>angular.z</em>field.</p>
<p>velocity_left_cmd = (linear_velocity – angular_velocity * WHEEL_BASE / 2.0)/WHEEL_RADIUS;</p>
<p>velocity_right_cmd = (linear_velocity + angular_velocity * WHEEL_BASE / 2.0)/WHEEL_RADIUS;</p>
<h2>Mecanum Wheel Math</h2>
<p>&nbsp;</p>
<div id="attachment_64603" style="width: 476px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2016/06/mecanum_wheels_andymark-2.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-64603" class="size-full wp-image-64603" src="http://robohub.org/wp-content/uploads/2016/06/mecanum_wheels_andymark-2.jpg" alt="Mecanum wheels from Andymark" width="466" height="411" srcset="https://robohub.org/wp-content/uploads/2016/06/mecanum_wheels_andymark-2.jpg 466w, https://robohub.org/wp-content/uploads/2016/06/mecanum_wheels_andymark-2-425x375.jpg 425w, https://robohub.org/wp-content/uploads/2016/06/mecanum_wheels_andymark-2-340x300.jpg 340w" sizes="(max-width: 466px) 100vw, 466px" /></a><p id="caption-attachment-64603" class="wp-caption-text">Mecanum wheels from Andymark</p></div>
<p><em><em>In ROS if using the Twist message you will often set the linear.x, linear.y and angular.z fields. <em>One unrelated note is that if you are operating on uneven terrain then doing mecanum type motions will fail and have a lot of slip. Skid steer type motions will often work better (using the mecanum wheels).</em></em></em></p>
<p>WHEEL_SEPARATION_WIDTH = DISTANCE_LEFT_TO_RIGHT_WHEEL / 2</p>
<p>WHEEL_SEPARATION_LENGTH = DISTANCE_FRONT_TO_REAR_WHEEL / 2</p>
<h3>Forward kinematics</h3>
<p>Wheel commands units are in rad/s</p>
<p>wheel_front_left = (1/WHEEL_RADIUS) * (linear.x – linear.y – (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*angular.z);</p>
<p>wheel_front_right = (1/WHEEL_RADIUS) * (linear.x + linear.y + (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*angular.z);</p>
<p>wheel_rear_left = (1/WHEEL_RADIUS) * (linear.x + linear.y – (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*angular.z);</p>
<p>wheel_rear_right = (1/WHEEL_RADIUS) * (linear.x – linear.y + (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*angular.z);</p>
<p>To drive a robot you will probably need to also invert one side since the motors are mounted opposite the other side. For example:</p>
<p>wheel_front_right = -1 * wheel_front_right</p>
<p>wheel_rear_right = -1 * wheel_rear_right</p>
<p>Also this gives an output in rad/s. If your motor controller is operating with encoder counts as the unit you will need to convert the units.</p>
<h3>Inverse Kinematics</h3>
<p>linear.x = (wheel_front_left + wheel_front_right + wheel_rear_left + wheel_rear_right) * (WHEEL_RADIUS/4)</p>
<p>linear.y = ( -wheel_front_left + wheel_front_right + wheel_rear_left – wheel_rear_right) * (WHEEL_RADIUS/4)</p>
<p>angular.z = ( -wheel_front_left + wheel_front_right – wheel_rear_left + wheel_rear_right) * (WHEEL_RADIUS/(4 * (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)))</p>
<p>Source for mecanum wheel math: <a href="http://research.ijcaonline.org/volume113/number3/pxc3901586.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">here</a>. There are other versions of how to compute the wheel velocities but this is the one I like best.</p>
<p>If you have any pressing questions, visit the <a href="http://robotsforroboticists.com/forum/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Robots for Roboticists Forum.</a></p>
<hr class="xh2  ">
<p>The post &#8220;<a href="http://robotsforroboticists.com/drive-kinematics/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Drive Kinematics: Skid Steer &amp; Mecanum (ROS Twist included)</a>&#8221; appeared on <a href="http://robotsforroboticists.com/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">Robots For Roboticists</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Antenna separation: How close can you go?</title>
		<link>https://robohub.org/antenna-separation-how-close-can-you-go/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 03 Jun 2016 09:30:00 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[GPS]]></category>
		<guid isPermaLink="false">http://robohub.org/antenna-separation-how-close-can-you-go/</guid>

					<description><![CDATA[<p>Hi When building a new robot the mechanical engineers always ask me how close can the different antennas be to each other. It is not uncommon to try squeezing 5+ antennas on a single robot (GPS, GPS2 for heading, RTK, joystick, e-stop, communications, etc..). So what is the proper response? The real answer is that [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/antenna-seperation/" data-wpel-link="external" target="_blank">Antenna Seperation: How Close Can You Go?</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter wp-image-63069" src="http://robohub.org/wp-content/uploads/2016/05/robot_device-676x507.jpg" alt="robot_device-676x507" width="850" height="638" srcset="https://robohub.org/wp-content/uploads/2016/05/robot_device-676x507.jpg 676w, https://robohub.org/wp-content/uploads/2016/05/robot_device-676x507-425x319.jpg 425w, https://robohub.org/wp-content/uploads/2016/05/robot_device-676x507-400x300.jpg 400w" sizes="(max-width: 850px) 100vw, 850px" />
<p>When building a new robot mechanical engineers always ask me: how close can different antennas be to one another? It is not uncommon to try squeezing 5+ antennas on a single robot (GPS, GPS2 for heading, RTK, joystick, e-stop, communications, etc..). So what is the proper response? The real answer is that it depends heavily on the environment. However, below are the rules of thumb I have learned and have been passed down to me for antenna separation. I do want to give a disclaimer some of this has been passed down as rules of thumb and may not be 100% correct.</p>
<p><strong>Here is the rule:</strong> The horizontal distance between antennas should be greater than 1/4 of its wavelength (absolute minimum separation), but it should not be located at the exact multiples of its wavelength (maybe avoid the first 3-4 multiples). If multiple frequency antennas are near each other, then use the spacing distance of the lower frequency antenna, or even better, try to satisfy the rule for both frequencies.</p>
<table>
<tbody>
<tr>
<th>Device</th>
<th>Frequency</th>
<th>Wavelength</th>
<th>1/4 Wavelength</th>
</tr>
<tr>
<td>WiFi 802.11</td>
<td>5.8GHz</td>
<td>5.17cm</td>
<td>1.29cm</td>
</tr>
<tr>
<td>WiFi 802.11</td>
<td>2.4GHz</td>
<td>12.49cm</td>
<td>3.12cm</td>
</tr>
<tr>
<td>GPS<strong>*</strong></td>
<td>1.227GHz</td>
<td>24.43cm</td>
<td>6.11cm</td>
</tr>
<tr>
<td>Radios</td>
<td>900MHz</td>
<td>33.3cm</td>
<td>8.33cm</td>
</tr>
</tbody>
</table>
<p><a href="http://www.procato.com/calculator-wavelength-frequency/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Here is a nice wavelength calculator I just found to generate the table above.</a></p>
<p><strong>*</strong> <em>If you are using two GPS antennas to compute heading then this does not apply. These numbers are strictly for RF considerations.</em></p>
<p>So, for example, if you have a GPS antenna and a WiFi 2.4GHz antenna you would want them to be separated by at least (more is better, within reason) 8.33cm. And you should avoid putting them at exactly 24.43cm or 33.3cm from each other.</p>
<p>This rule seems to work with the low power antennas that we typically use in most robotics applications. I am not sure how this would work with high power transmitters. For higher power transmitting antennas, you might want greater separation. The power drops off pretty quickly with distance (proportional to the square of the distance).</p>
<p>I also try to separate receive and transmit antennas (as a precaution) to try and prevent interference problems.</p>
<p>An extension of the above rule is ground planes. Ground planes are conductive reference planes that are put below antennas to reflect the waves to create a predictable wave pattern and can also help prevent multipath waves (that are bouncing off the ground, water, buildings, etc…). The further an antenna is from the ground (since the ground can act as a ground plane), the more likely having a ground place becomes necessary. In its simplest form, a ground plane is a piece of metal that extends out from the antennas base at least 1/4 wavelength in each direction. Fancy ground planes might just be several metal prongs that stick out. A very common ground plane is the metal roof of a vehicle/robot.</p>
<p><strong>Note: </strong>Do not confuse ground planes with RF grounds, signal grounds, DC grounds, etc…</p>
<div id="attachment_63250" style="width: 1132px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-63250" class="size-full wp-image-63250" src="http://robohub.org/wp-content/uploads/2016/05/Aerial_roof_markings_on_London_police_car.png" alt="Aerial roof markings on London police car. Source: Wikimedia Commons" width="1122" height="424" srcset="https://robohub.org/wp-content/uploads/2016/05/Aerial_roof_markings_on_London_police_car.png 1122w, https://robohub.org/wp-content/uploads/2016/05/Aerial_roof_markings_on_London_police_car-425x161.png 425w, https://robohub.org/wp-content/uploads/2016/05/Aerial_roof_markings_on_London_police_car-1024x387.png 1024w, https://robohub.org/wp-content/uploads/2016/05/Aerial_roof_markings_on_London_police_car-500x189.png 500w" sizes="(max-width: 1122px) 100vw, 1122px" /><p id="caption-attachment-63250" class="wp-caption-text">Aerial roof markings on London police car. Source: Wikimedia Commons</p></div>
<p>An example of building a ground plane can be with a GPS antenna. It should be mounted in the center of a metal roofed robot/car or on the largest flat metal location. This will minimize the multipath signals from the ground. If there is no flat metal surface to mount the antenna you can create a ground plane by putting a 12.22cm diameter metal sheet directly below the antenna (about 1/2 the signals wavelength, which gives 1/4 wavelength per side).</p>
<p><strong>Note:</strong> Some fancy antennas do not require that you add a ground plane. For example, the Novatel GPS antennas <a href="http://www.novatel.com/assets/Documents/Papers/gps_pinwheel_ant.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">do NOT require you to add a ground plane</a>, as described above.</p>
<p>Other things to watch out for are shadowing between the antennas and sensors and the fresnel zone. <a href="http://robotsforroboticists.com/long-distance-wireless-communications-antennas/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">For more information on the fresnel zone, and why antennas are not actually just line of site, click here.</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Book Review: &#8216;Peer Reviews in Software, A Practical Guide,&#8217; by Karl Wiegers</title>
		<link>https://robohub.org/book-review-peer-reviews-in-software-a-practical-guide-by-karl-wiegers/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Wed, 01 Jun 2016 09:50:53 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[reviews]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://robohub.org/book-review-peer-reviews-in-software-a-practical-guide-by-karl-wiegers/</guid>

					<description><![CDATA[<p>I have been part of many software teams where we desired to do code reviews. In most of those cases the code reviews did not take place, or were pointless and a waste of time. So the question is; how do you effectively conduct peer reviews in order to improve the quality of your systems. [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/book-review-peer-reviews-software-karl-wiegers/" data-wpel-link="external" target="_blank">Book Review: Peer Reviews in Software by Karl Wiegers</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_63214" style="width: 1110px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-63214" class="size-full wp-image-63214" src="http://robohub.org/wp-content/uploads/2016/05/peer-review-software-code-coding-human-check.jpg" alt="Code review of a C++ program with an error found." width="1100" height="694" srcset="https://robohub.org/wp-content/uploads/2016/05/peer-review-software-code-coding-human-check.jpg 1100w, https://robohub.org/wp-content/uploads/2016/05/peer-review-software-code-coding-human-check-425x268.jpg 425w, https://robohub.org/wp-content/uploads/2016/05/peer-review-software-code-coding-human-check-1024x646.jpg 1024w, https://robohub.org/wp-content/uploads/2016/05/peer-review-software-code-coding-human-check-476x300.jpg 476w" sizes="(max-width: 1100px) 100vw, 1100px" /><p id="caption-attachment-63214" class="wp-caption-text">Code review of a C++ program with an error found.</p></div>
<p>I have been part of many software teams where we desired to do code reviews. In most of those cases the code reviews did not take place, or were pointless and a waste of time. So the question is: how do you effectively conduct peer reviews in order to improve the quality of your systems?</p>
<p>I found this book, <a href="http://www.amazon.com/Peer-Reviews-Software-Practical-Guide/dp/0201734850?ie=UTF8&amp;psc=1&amp;redirect=true&amp;ref_=oh_aui_detailpage_o08_s00" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Peer Reviews in Software: A Practical Guide by Karl E. Wiegers</a>. This book was recommended to me, and having “practical guide” in the title caught my attention &#8212;  I have reviewed other books that claimed practical, but were not. Hopefully this book will help provide me (and you) with tools for conducting valuable code reviews.<span id="more-63197"></span></p>
<div id="attachment_63211" style="width: 389px" class="wp-caption alignleft"><img decoding="async" aria-describedby="caption-attachment-63211" class="size-full wp-image-63211" src="http://robohub.org/wp-content/uploads/2016/05/prs_book.jpg" alt="Peer Reviews in Software: A Practical Guide. Photo: Amazon" width="379" height="475" srcset="https://robohub.org/wp-content/uploads/2016/05/prs_book.jpg 379w, https://robohub.org/wp-content/uploads/2016/05/prs_book-339x425.jpg 339w, https://robohub.org/wp-content/uploads/2016/05/prs_book-239x300.jpg 239w" sizes="(max-width: 379px) 100vw, 379px" /><p id="caption-attachment-63211" class="wp-caption-text">Peer Reviews in Software: A Practical Guide. Photo: Amazon</p></div>
<p>As a human, I will make mistakes when programming; finding my mistakes is often difficult since I am very close to my work. How many times have you spent hours trying to find a bug in your code only to realize you had a bad semi-colon or parentheses? Another person who has not worked on the code for hours might have been able to spot the problem right away. When I first started programming it could be embarrassing to have somebody review my code and point out the problems. However now that I am more senior, I do not view it as an embarrassment, but as a learning opportunity since everybody has a different set of experiences that influences their code. I would encourage other developers to view it as a learning experience and not be bashful about reviews. Remember the person is critiquing the work, not you; this is how to become a better developer.</p>
<p>According to Wiegers, there are many types of peer reviews including: inspections, team reviews, walkthroughs, pair programming, peer desk check passaround, and finally ad hoc review.</p>
<p>This book is divided into three sections:</p>
<ol>
<li>Cultural &amp; social aspects</li>
<li>Different types of reviews (with a strong focus on inspection)</li>
<li>How to implement review process within your projects</li>
</ol>
<h2>Cultural &amp; Social Aspects</h2>
<p>In this first section of the book, the author makes the argument that quality work is not free and that “paying” the extra cost of peer reviews is a good investment in the future. By having peer review you can reduce failures before the product is released out into the world and any applicable reworks. Shifting the defect detection to the early stages of a product has huge potential payoff, due to high costs of fixing defects found late in the release cycle, or after release. The space shuttle program found the relative cost for fixing a defect is: $1, if found during initial inspection; $13, if found during a system test; and $92, to fix after delivery! In the book, the author documents various companies who saved substantial amounts of time and money all by having code inspection programs.</p>
<p>One thing I like is the reference to IEEE 1999, which talks about other items that are good to review. People don&#8217;t think about it but other things, such as marketing brochures, requirement specifications, user guides, test plans and many other things, are good candidates for peer review.</p>
<p>I have seen many project teams try to do error tracking and/or code reviews but fail, due to team culture. I saw one case where peer review actually worked: when a dedicated person&#8217;s only job was to manage reliability in the project. He was great at hounding people to track bugs and review code. This book discussed how team culture must be developed to value “quality”. If you are the type of person that does not want to waste time reviewing another&#8217;s code, you must remember you will want the other person to “waste” time looking at your code. In this manner, we must all learn to scratch each other&#8217;s back. There are also two traps to watch out for:</p>
<ol>
<li>Becoming lazy and submitting bad code for review since somebody else will find/fix it, or</li>
<li>Trying to perfect your code before sharing it, in order to protect your ego from getting bruised, and to only show your best work.</li>
</ol>
<p>We also cannot forget managers. Managers need to value quality and provide time and resources for employees to develop good practices. Managers need to understand the point of these exercises are to find flaws and people should not be punished based on those flaws. I have often seen managers not putting time in the schedule for good code reviews.</p>
<h2>Types of reviews</h2>
<p>Before discussing the types of reviews there is a good discussion on the guiding principles for reviews. Some of the principles are:</p>
<ul>
<li>Check your egos at the door</li>
<li>Keep the review team small</li>
<li>Find problems during review, but don’t try to fix them at the review. Give up to 1 minute for discussion of fixes.</li>
<li>Limit review meeting to 2 hours max</li>
<li>Require advanced preparation</li>
</ul>
<p>There are several types of peer reviews discussed in this book. This list starts with the least formal approach and develops until the most formal approach (the book uses the opposite order which I found non intuitive).</p>
<ol>
<li><strong>Ad Hoc</strong> – These are the spur of the moment meetings where you call a coworker to your desk to help with a small problem. Usually, this just solves an immediate problem. (This is super useful when trying to work out various coordinate transforms)</li>
<li><strong>Peer passaround/deskcheck, </strong>– In this approach a copy of the work is sent to multiple reviewers, after which you can then collate all of the reviews. This allows multiple people to look at the code/item and also lets you get something if one person does not respond. In the peer deskcheck version, only one person looks at it instead of passing it around for multiple reviews.</li>
<li><strong>Pair Programming</strong> – This is the idea that two people program together. So while there is no official review two sets of eyes see each line of code being typed. This has an added bonus that now two people will understand the code. The downside is that often one of the coders can “doze-off” and not be effective at watching for flaws. Also, many coders might not like this.</li>
<li><strong>Walkthrough</strong> – This is where the author of the code walks through the code to a group of reviewers. This is often unstructured and heavily dependent on how good of a job the author prepared. In my experience this is good for helping people understand the code and finding large logic flaws, but not so much for finding smalls flaws/bugs.</li>
<li><strong>Team Review</strong> – This is similar to the walkthrough however reviewers are provided with documentation/code in advance to review and their results are collated.</li>
<li><strong>Inspection</strong> – Finally, we have the most formal approach which the author appears to favor. In this approach the author of the code does not lead the review, rather, a moderator, often with the help of checklists, will lead the meeting and read out the various sections. After the moderator reads a section, the reviewers discuss it. The author of the code can answer questions and learn how to improve various sections. Often the author might identify other instances of the same problem that the reviewers did not point out. An issue log should be maintained as a formal way of providing feedback and a list to verify fixes against.</li>
</ol>
<div id="attachment_63212" style="width: 2969px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-63212" class="size-full wp-image-63212" src="http://robohub.org/wp-content/uploads/2016/05/peer_review_types_from_Wiegers_Peer_reviews_in_software.jpg" alt="Suggested review methods from &quot;Peer Reviews in Software&quot;" width="2959" height="1860" srcset="https://robohub.org/wp-content/uploads/2016/05/peer_review_types_from_Wiegers_Peer_reviews_in_software.jpg 2959w, https://robohub.org/wp-content/uploads/2016/05/peer_review_types_from_Wiegers_Peer_reviews_in_software-425x267.jpg 425w, https://robohub.org/wp-content/uploads/2016/05/peer_review_types_from_Wiegers_Peer_reviews_in_software-1024x644.jpg 1024w, https://robohub.org/wp-content/uploads/2016/05/peer_review_types_from_Wiegers_Peer_reviews_in_software-477x300.jpg 477w" sizes="(max-width: 2959px) 100vw, 2959px" /><p id="caption-attachment-63212" class="wp-caption-text">Suggested review methods from &#8220;Peer Reviews in Software&#8221;</p></div>
<p>The book then spends the next few chapters detailing the inspection method of peer review. Here are just a few notes. As always, read the book to find out more.</p>
<ul>
<li>In most situation 3-7 is a good size group for the inspection. The number of people can be based on the item being reviewed.</li>
<li>The review needs to be planned in advance and have time to prepare content to distribute to reviewers.</li>
<li>After the meeting the author should address each item in the issue log that was created and submit it to the moderator (or other such person) to verify that the solutions are good.</li>
<li>Perform an inspection when that module is ready to pass to the next development stage. Waiting too long can leave a person with a lot of bad code that is now too hard to fix.</li>
<li>You can (sort of) measure the ROI by looking at the bugs found and how long they took to find. There are many other metrics detailed in the book.</li>
<li>Keep spelling and grammar mistakes on a separate paper and not on the main issue list.</li>
</ul>
<h2>How to implement review processes within your projects</h2>
<p>Getting a software team and management to change can be difficult. The last part of this book is dedicated to how you can get reviews started, and how to let them naturally grow within the company. One significant thing identified is to have a key senior person act as a coordinator for building a culture of peer review and to provide training to developers. There is a nice long table in the book of the various pitfalls that an organization may encounter and how to deal with them.</p>
<p>This book also discusses special challenges and how it can affect your review process. Some of the situations addressed are:</p>
<ul>
<li>Large work products</li>
<li>Geographic or time separation</li>
<li>Distributed reviewers</li>
<li>Asynchronous review</li>
<li>Generated and non-procedural code</li>
<li>To many participants</li>
<li>No qualified reviewers available</li>
</ul>
<p>At the end of this book, there is a link to <a href="http://www.processimpact.com/goodies.shtml" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">supplemental material</a> online. I was excited to see this. However when I went to the site, I saw it was all for sale and not free (most things were around $5). That kind of burst my bubble of excitement for the supplemental material. There is a second website for the book that is referenced but does not seem to be valid anymore.</p>
<p>Throughout the book the idea is getting proper training for people on how to conduct inspection reviews. Towards the end of the book, the idea of hiring the book’s author as a trainer to help with this training is suggested.</p>
<p>Overall, I think this is a good book. It introduces people on how to do software reviews. The use of graphics and tables in the book are pretty good. It is practical and easy to read. I also like how this book addresses management and makes the business case for peer reviews. I give this book 4.5 out of 5 stars. The missing 0.5 stars is due to the supplemental material not being free and for not providing those forms with the book.</p>
<hr class="xh2  ">
<p>Disclaimer: I do not know the book author. I purchased this book myself from Amazon.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Book Review: Mastering ROS for Robotics Programming, by Lentin Joseph</title>
		<link>https://robohub.org/book-review-mastering-ros-for-robotics-programming-by-lentin-joseph/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Mon, 21 Mar 2016 14:00:29 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[books]]></category>
		<guid isPermaLink="false">http://robohub.org/book-review-mastering-ros-for-robotics-programming-by-lentin-joseph/</guid>

					<description><![CDATA[<p>Mastering ROS for Robotics Programming is a good book that will help you learn ROS and take advantage of some of the powerful nodes (programs) that are out there. The book covers both a 7 DOF robot arm and a differential drive robot throughout the different chapters. That should really help you out no matter [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/book-review-mastering-ros-robotics-programming-lentin-joseph/" data-wpel-link="external" target="_blank">Book Review: Mastering ROS for Robotics Programming by Lentin Joseph</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-58758" src="http://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming.jpg" alt="Lentin_Joseph_Mastering_ROS_for_Robotics_Programming" width="973" height="568" srcset="https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming.jpg 973w, https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming-425x248.jpg 425w, https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming-500x292.jpg 500w" sizes="(max-width: 973px) 100vw, 973px" />Mastering ROS for Robotics Programming is a good book that will help you learn ROS and take advantage of some of the powerful nodes (programs) that are out there. The book covers both a 7 DOF robot arm and a differential drive robot throughout the different chapters. That should really help you out no matter which type of robot you have (hmmm&#8230; what about quadcopters?).</p>
<p><span id="more-60549"></span></p>
<p>The book starts with an introduction to ROS. The introduction does a good job describing the basic ROS constructs such as the directory structure, nodes, services, etc. and goes into detail to describe those constructs. The book continuous to show how to create ROS packages, add custom messages (topics), and creating launch files. The first chapter has everything you need to get a basic ROS system up and running. One thing missing is how to have your launch file start on computer boot up (using the “ROS way” as opposed to just adding it to rclocal).</p>
<p>The book can use more information on using the catkin build system and CMake. I am not sure if that is fair to expect in this book, but it is an essential skill to develop with ROS, and is not listed as a skill that people using this book are expected to have.</p>
<p>ROS only supports versions of Ubuntu that are around when that version of ROS was released. In general, ROS is not upgraded when a new version of Ubuntu is released (this is one of the things that I dislike about ROS). To deal with this, the examples in the book are given for both ROS Indigo (the prior version) and ROS Jade (the current version). Good job to the author for that!</p>
<p>After you are given the basics of ROS, the rest of the book is roughly split into three sections: &#8216;Modeling, Simulating &amp; Autonomy&#8217;, &#8216;Working with Hardware&#8217;, and an example.</p>
<p>For Modeling, Simulating &amp; Autonomy, the book starts with a chapter on how to model your robot with URDF. Afterwards you use the model created to simulate it using Gazebo and learn how to add planning and autonomy to arms and mobile robots. There is an extra chapter dealing with advanced usage of MoveIt for robotic arms, I would have liked to see an advanced chapter for the Navigation Stack. I also would have liked more information on using the transforms within the Navigation Stack. With that said, I am happy the book addresses these items as many other authors do not.</p>
<p>After getting the high-level tour of ROS and making an autonomous robot with existing nodes, the book steps back to teach the reader how to build controllers, work with hardware, (controllers, motors, sensors, cameras, etc.) and visualizations. The book has many examples of working with specific hardware items such as Arduino, Raspberry Pi, Kinect, webcams, Hokuyo, &amp; the Velodyne. Adding a joystick to that list might have been nice. Working with OpenCV and PCL within ROS has a dedicated chapter.</p>
<p>At first I was skeptical of having an example section since I have seen many books do this poorly, however, this book does a good job describing in detail how to configure an example robot without making you feel like they are just regurgitating what they built. It also has more details about the Navigation Stack, which partially makes up for not having an advanced chapter on it.</p>
<p>The best practices section at the end of the book could have had more ROS specific practices, instead of just generic C++ practices. I like the fact that the book uses c++ as that is how most robots are built. It would have been nice to have a chapter with basic discussions on python and java usage. The author briefly mentions setting up ROS on distributed systems, this could be expanded a little (such as in the roswtf section for looking at timing).</p>
<p>Overall, I give this book 4.5 out of 5 stars. By going into detail for both robotic arms and mobile robots, this book is sure to help both a novice or experienced programmer enter the world of ROS and get their robots up and moving.</p>
<p><em>Note: The paperback book has black and white images. I think the e-book has color images.</em></p>
<hr class="xh2  ">
<p>I would like to thank the Publisher PACKT for providing me with a copy of this book for review.</p>
<p>Some words of disclaimer:<br />
I have never met the author of this book and the opinions above are mine.</p>
<hr class="xh2  ">
<p><em>If you enjoyed this post, you might also like:</em></p>
<ul>
<li><a href="http://robohub.org/book-review-practical-field-robotics-by-robert-sturges/" target="_blank" data-wpel-link="internal">Book Review: Practical Field Robotics, by Robert Sturges</a></li>
<li><a href="http://robohub.org/book-review-implementation-of-robot-systems-by-mike-wilson/" target="_blank" data-wpel-link="internal">Book Review: Implementation of Robot Systems, by Mike Wilson</a></li>
</ul>
<p><i>See all </i><a href="http://robohub.org/" data-wpel-link="internal"><i>the latest robotics news</i></a><i> on Robohub, or </i><a class="ext-link" title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-wpel-link="external"><i>sign up for our weekly newsletter</i></a><i>.</i></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Configuring multiple USB devices: An alternative to udev</title>
		<link>https://robohub.org/configuring-multiple-usb-devices-an-alternative-to-udev/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Wed, 16 Dec 2015 19:53:29 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/configuring-multiple-usb-devices-an-alternative-to-udev/</guid>

					<description><![CDATA[<p>Hi all Every time I need to add multiple USB devices to a computer I get nervous and dread the architecture. The problem is when a computer boots it automatically brings up USB devices in whatever order it sees fit (think crazy race conditions). So if you have a motor controller, a camera, and a [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/usb-device-configuration/" data-wpel-link="external" target="_blank">USB device configuration: Alternative to udev</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-57840" src="http://robohub.org/wp-content/uploads/2015/12/USB_icons.jpg" alt="USB_icons" width="1000" height="504" srcset="https://robohub.org/wp-content/uploads/2015/12/USB_icons.jpg 1000w, https://robohub.org/wp-content/uploads/2015/12/USB_icons-425x214.jpg 425w, https://robohub.org/wp-content/uploads/2015/12/USB_icons-500x252.jpg 500w" sizes="(max-width: 1000px) 100vw, 1000px" />Every time I need to add multiple USB devices to a computer I get nervous and dread the architecture. The problem is that when a computer boots it automatically brings up USB devices in whatever order it sees fit (think crazy race conditions). So if you have a motor controller, a camera, and a LIDAR that all use USB, it can be difficult to know which device on the computer is which. You could check and manually change these every time you run your programs, but it&#8217;s better to have your programs auto-detect which device to connect to.<span id="more-57821"></span></p>
<p>There are some specialty cases that can make this problem easier. Most USB devices (in Linux) show up as <em>/dev/ttyUSBX</em>, where X is the number in which that device was initialized (ex. /dev/ttyUSB0). Some devices will come up differently. For example Hokuyo LIDAR’s show up as <em>/dev/ttyACMX</em>. And USB joysticks show up as a joystick device in <em>/dev/input/jsX</em>. So if you have one each of a joystick, a Hokuyo, and a motor controller, you might get lucky and have them all map to different devices. But for the many times you are not lucky, how should you deal with it?</p>
<p><em>(Random note: ACM refers to a USB modem. Most devices that we use are not really modems and just &#8216;lie&#8217; and claim to be an ACM device (often when they do the USB “stuff” on the main processor). Many USB-to-serial converter chips (such as FTDI) do not lie and show up as /dev/ttyUSB.)</em></p>
<p>The traditional answer is to use udev rules. The basic idea is to make a file in <em>/etc/udev/rules.d/</em> that will control how a device gets mapped and started. This allows you to change the links, change permissions, or run a script when a device is detected. A basic udev rule can follow the format of:</p>
<pre>SUBSYSTEMS==”usb”, KERNEL==”ttyACM[0-9]*”, ACTION==”add”, ATTRS{idVendor}==”15d1″, ATTRS{idProduct}==”0000″, MODE=”666″, PROGRAM=”/opt/ros/hydro/lib/urg_node/getID /dev/%k q”, SYMLINK+=”sensors/hokuyo_%c”, GROUP=”dialout”

</pre>
<p>A great tutorial on udev (and also where I got the rule above) is the &#8220;<a href="http://robohub.org/do-more-with-udev/" data-wpel-link="internal">Do more with udev</a>&#8221; tutorial from Clearpath Robotics.</p>
<p>In my experience using udev rules work well to set startup permissions (to allow non-root access to the device) or to run a script when a device is connected. However the symlink that maps a device to a specific name will sometimes create a link that you cannot open (ie. when <em>open(/dev/newSymLink)</em> fails). There are also cases where you cannot use udev in certain embedded systems or where you do not want to “install” udev rules.</p>
<p>There are several ways to avoid using udev. For example you could run the <em>dmesg</em> command to find where the USB device was connected. Another way is to have a script run whenever a device is plugged in that updates a text file that stores the device name.</p>
<p>Another solution (presented below) is ugly but it has tested well in cases where udev was giving me a hard time. The solution below is easier than parsing <em>dmesg</em> and does not require a udev rule to create a symlink that needs to be installed.</p>
<p>The first step, which I got from <a href="http://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-ttyusb0" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">here</a>, gets the mapping of all your devices and the associated port numbers.</p>
<pre>#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath=”${sysdevpath%/dev}”
devname=”$(udevadm info -q name -p $syspath)”
[[ “$devname” == “bus/”* ]] &amp;&amp; continue
eval “$(udevadm info -q property –export -p $syspath)”
[[ -z “$ID_SERIAL” ]] &amp;&amp; continue
echo “/dev/$devname – $ID_SERIAL”
)
done</pre>
<p>Running the script above will give you a list of all the attached USB devices. You can save the script above into a file called <em>list_usb_devices.sh</em>.</p>
<p>The next step is to run that script from your program. To do that I found some <a href="http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c%22" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">code</a> that allows you to run a system call and get the output into a string.</p>
<pre>#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;cstdio&gt;
#include &lt;memory&gt;

std::string system_exec(char* cmd)
{
std::shared_ptr pipe(popen(cmd, “r”), pclose);
if (!pipe) return “ERROR”;
char buffer[128];
std::string result = “”;
while (!feof(pipe.get())) {
if (fgets(buffer, 128, pipe.get()) != NULL)
result += buffer;
}
return result;
}</pre>
<p>Adding the above to the driver for the USB device, you can now use the following to get the port that you need to open:</p>
<pre>// get the names, grep to search for the device we want, cut the name of the port from the full line of text
std::string port = system_exec(“//list_usb_devices.sh |grep -m 1 |cut -c 1-12″);

// Get rid of any newlines (n) in the string
port.erase(std::remove(port.begin(), port.end(), ‘n’), port.end());

// switch to string to c style for using in the open command
const char * device = port.c_str();

// Finally we can now open our device
fd = open(device, O_RDWR | O_NOCTTY);</pre>
<p>This approach is ugly, but it works. By simply using the bash script and the system call from the c++ portion you can easily adapt this to any programming environment.</p>
<p>The above approach is often the wrong approach (since it is ugly), but it can help when udev is not working as expected or it can not be used.</p>
<p>I still avoid using USB devices when possible since they are a pain and are often not reliable. However if you must use them, then the information above **might** make your life a little better. I hope it helps! Please leave comments below if this helped you or with other ways to handle USB devices.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to get started (and progress) in robotics: A quick guide for teens and adults</title>
		<link>https://robohub.org/how-to-get-started-and-progress-in-robotics-a-quick-guide-for-kids-and-adults/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Wed, 09 Dec 2015 16:39:30 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[Robohub focus on Robotics Education]]></category>
		<guid isPermaLink="false">http://robohub.org/how-to-get-started-and-progress-in-robotics-a-quick-guide-for-kids-and-adults/</guid>

					<description><![CDATA[<p>I get many questions from people about how I think kids and adults should get started in robotics, how they should progress, and what they should buy, to learn about robotics. Here is my quick response: I think level 1 is for people older than 12. Level 2 is for people older than 15, and [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/getting-started-kids-adults/" data-wpel-link="external" target="_blank">Robotics for Kids (and Adults) &#8211; Getting Started and How to Progress</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_57494" style="width: 910px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-57494" class="size-full wp-image-57494" src="http://robohub.org/wp-content/uploads/2015/12/Soldering_electronics_make_build_PC_circuit_board_Sparkfun_Inventors_Kit.jpg" alt="SparkFun Inventor's Kit for RedBot." width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2015/12/Soldering_electronics_make_build_PC_circuit_board_Sparkfun_Inventors_Kit.jpg 900w, https://robohub.org/wp-content/uploads/2015/12/Soldering_electronics_make_build_PC_circuit_board_Sparkfun_Inventors_Kit-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2015/12/Soldering_electronics_make_build_PC_circuit_board_Sparkfun_Inventors_Kit-450x300.jpg 450w" sizes="(max-width: 900px) 100vw, 900px" /><p id="caption-attachment-57494" class="wp-caption-text">SparkFun <a href="https://www.sparkfun.com/products/12649" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Inventor&#8217;s Kit for RedBot</a>.</p></div>
<p>I get many questions from people about how I think kids and adults should get started in robotics, how they should progress, and what they should buy, to learn about robotics. This is a quick guide to help you get going.<span id="more-57486"></span></p>
<div class="sprfocus4"><a class="sprfocusl" href="/tag/robohub-focus-on-robotics-education/" data-wpel-link="internal"> </a></div>
<p>I&#8217;ve described three levels below &#8212; Level 1 is for people older than 12; Level 2 is for people older than 15, and Level 3 is for people over 18. An adult can probably start at Level 2 if desired, however starting at Level 1 will give you important basic skills and knowledge that you can build on.</p>
<p>Don’t worry about the details. You do not need to learn how SPI or wifi work, for example, but you will slowly pick up the details as you use them.</p>
<hr class="xh2  ">
<p>&nbsp;</p>
<h2><strong>Level 1 – Getting Started with Micros</strong><br />
<a href="http://www.amazon.com/gp/product/1449389716/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1449389716&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=L2DJIQ6WCVJH565N" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="alignleft wp-image-57490 size-medium" src="http://robohub.org/wp-content/uploads/2015/12/Make_Arduino_for_Bots_and_Gadgets-349x425.jpg" alt="Make_Arduino_for_Bots_and_Gadgets" width="349" height="425" srcset="https://robohub.org/wp-content/uploads/2015/12/Make_Arduino_for_Bots_and_Gadgets-349x425.jpg 349w, https://robohub.org/wp-content/uploads/2015/12/Make_Arduino_for_Bots_and_Gadgets-246x300.jpg 246w, https://robohub.org/wp-content/uploads/2015/12/Make_Arduino_for_Bots_and_Gadgets.jpg 410w" sizes="(max-width: 349px) 100vw, 349px" /></a></h2>
<ol>
<li><b>Set a clear and realistic goal</b> – Robots are hard, so match your expectations to your skills. Your first robot should be really simple.</li>
<li><b>Recommended Book</b> – <a href="http://www.amazon.com/gp/product/1449389716/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1449389716&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=L2DJIQ6WCVJH565N" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Make: Arduino Bots and Gadgets: Six Embedded Projects with Open Source Hardware and Software and Arduino Robot Bonanza</a></li>
<li><b>Get your hands dirty</b> – Learn how to mechanically and electrically build a robot.
<ul>
<li>For this task, design and build a robot that uses an Arduino Uno, 2-4 motors, 2-4 simple sensors, a switch, a LED and a battery.</li>
<li>The <a href="https://www.sparkfun.com/products/12649" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sparkfun Inventors Kit for Redbot</a> is a great choice for this step.</li>
<li>Design on paper what the robot should look like and the parts that you need (if you buy a kit, use it, but then modify it).</li>
<li>Build the robot using basic hand and power tools.</li>
</ul>
</li>
<li><b>Learn how to program</b> – Use the Arduino to program the robot.
<ul>
<li>Start by simply making the light on the Arduino blink. If you have never done this before, it will take longer than you think it!</li>
<li>Spin a single motor.</li>
<li>Read from your sensors and play with them – use Microsoft Excel to <a href="http://www.societyofrobots.com/sensors_interpret.shtml" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">generate a calibration curve</a>.</li>
<li>Combine the sensors and motor code to do what you desire.</li>
</ul>
</li>
<li><b>Join a robotics club</b> – There are many options! For example:
<ul>
<li>School robotics club</li>
<li><a href="http://www.firstinspires.org/robotics/frc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">First Robotics</a></li>
<li><a href="http://www.societyofrobots.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Society of Robots</a></li>
</ul>
</li>
</ol>
<hr class="xh2  ">
<p>&nbsp;</p>
<h2>Level 2 – Getting Started with Embedded Computing</h2>
<a href="http://www.amazon.com/gp/product/1457186039/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1457186039&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=QHNJA3OMPG5P7T4Z" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="alignleft wp-image-57491 size-medium" src="http://robohub.org/wp-content/uploads/2015/12/Make_a_Raspberri_Pi-344x425.jpg" alt="Make_a_Raspberri_Pi" width="344" height="425" srcset="https://robohub.org/wp-content/uploads/2015/12/Make_a_Raspberri_Pi-344x425.jpg 344w, https://robohub.org/wp-content/uploads/2015/12/Make_a_Raspberri_Pi-243x300.jpg 243w, https://robohub.org/wp-content/uploads/2015/12/Make_a_Raspberri_Pi.jpg 405w" sizes="(max-width: 344px) 100vw, 344px" /></a>
<ol>
<li><b>Set a clear and realistic goal</b> – Build upon what you learned in Level 1 to set goals for level 2.</li>
<li><b>Recommended Book</b> – <a href="http://www.amazon.com/gp/product/1457186039/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1457186039&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=QHNJA3OMPG5P7T4Z" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Make a Raspberry Pi-Controlled Robot: Building a Rover with Python, Linux, Motors, and Sensors</a></li>
<li><b>Get your hands dirty</b> – Learn how to mechanically and electrically build a robot.
<ul>
<li>For this task, design and build a robot that uses a <a href="https://www.sparkfun.com/categories/233" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Raspberry Pi</a> computer, 2-4 motors, 2-4 sensors, and a battery</li>
<li>Design your parts with a CAD tool (such as <a href="http://www.sketchup.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Sketchup</a> or Solidworks)</li>
<li>Think about how you will interface your sensors to the computer?</li>
<li>Use new materials and construction techniques. Try to use a 3D printer or laser cutter if possible.</li>
</ul>
</li>
<li><b>Learn how to program</b> – Use the Linux computer to program the robot.
<ul>
<li>Learn basic C++ or Python, try talking to serial ports.</li>
<li>Make your robot act as desired.</li>
</ul>
</li>
</ol>
<hr class="xh2  ">
<h2></h2>
<h2></h2>
<h2>Level 3 – Advanced Computing</h2>
<ol>
<li><b>Set clear and realistic goals</b> – You should increase the difficulty of your goals as you advance. At this point, try setting a goal that you&#8217;d like to attempt, even if you are not sure you can achieve it.</li>
<li><b>Learn basic trig and statistics</b> – Learn the basic math that you need for robotics.</li>
<li><b>Get someone else’s hands dirty</b> – Design a part and <a href="http://www.mfg.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">shop it out to be machined</a>.</li>
<li><b>Learn how to use more advanced sensors</b> – Such as a Camera and/or LIDAR.</li>
<li><b>Software</b> – Learn the <a href="http://www.ros.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Robot Operating System (ROS)</a>.</li>
<li><b>Algorithms</b> – Continue making software more advanced. Autonomy, mapping, device drivers, etc…</li>
</ol>
<p>Each level will take time to develop and learn, but following this path will ensure that you have the knowledge you&#8217;ll need to progress to the next level.</p>
<hr class="xh2  ">
<p>&nbsp;</p>
<p><strong>Additional Resources</strong></p>
<p>I tend to like <a href="https://www.sparkfun.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sparkfun</a> for buying hobby parts. Other places you should look are <a href="https://www.adafruit.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Adafruit</a>, and <a href="https://www.pololu.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pololu</a>. They all have blogs and tutorials for using the hardware they sell, including basic robotics, Arduino, and Raspberry Pi.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Where to place fuses and how to protect your robot and motors</title>
		<link>https://robohub.org/where-to-place-fuses-and-how-to-protect-your-robot-and-motors/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Sun, 02 Aug 2015 13:30:19 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/where-to-place-fuses-and-how-to-protect-your-robot-and-motors/</guid>

					<description><![CDATA[<p>Hi all I wanted to write a quick post today about where to place fuses and how to protect your robot. When you design a system it is often tempting to place a fuse on every component. This idea is fine for most batteries, sensors, and computers. However this can really cause destruction when you [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/proper-fuse-locations-protection-shunt-regulation/" data-wpel-link="external" target="_blank">Fuse Locations, Protection, Shunt Regulation, &#38; Motors</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-large wp-image-52769" src="http://robohub.org/wp-content/uploads/2015/07/shunt_regulator_a-m-c-1024x762.jpg" alt="shunt_regulator_a-m-c" width="1024" height="762" srcset="https://robohub.org/wp-content/uploads/2015/07/shunt_regulator_a-m-c-1024x762.jpg 1024w, https://robohub.org/wp-content/uploads/2015/07/shunt_regulator_a-m-c-425x316.jpg 425w, https://robohub.org/wp-content/uploads/2015/07/shunt_regulator_a-m-c-403x300.jpg 403w, https://robohub.org/wp-content/uploads/2015/07/shunt_regulator_a-m-c.jpg 1075w" sizes="(max-width: 1024px) 100vw, 1024px" />When you design a system it is often tempting to place a fuse on every component. This idea is fine for most batteries, sensors, and computers. However this can really cause destruction when you are working with motors. I have seen several motor drivers burn up (probably the FET’s got damaged) from having this set up wrong.<span id="more-52727"></span></p>
<p>To start with the simple devices &#8230; having a fuse where the batteries enter the system is a good idea. After that I like to fuse each voltage rail (ie. DC-DC converter) so that we can take groups of sensors/computers offline at a time for testing as well as for the protection the fuses provide. I think fusing each bus is often a good compromise between fusing everything and fusing nothing.</p>
<p>The place where fusing gets tricky is with motors. To start, whenever you have a lot of energy (relative to your system) being converted from mechanical to electrical energy through your motor, a shunt regulator should be used. Any time your motors might be back driving, decelerating quickly, or dropping due to gravity (such as in a robotic arm) you have the potential for the voltage on your power bus to increase. When the voltage starts increasing you can burn out the components on your bus. For example if your motor controller is rated for 55V Maximum and you are driving a 48V motor, it is very easy for the back driving of the motor to raise the voltage above that maximum value. Remember <em>Every motor is a generator; and every generator is a motor &#8211;</em> it just depends which direction you spin it. The solution to this problem is to put a <em>shunt regulator</em> on your bus.</p>
<p>A shunt regulator is pretty much a big resistor that can shunt energy to ground in order to prevent the bus voltage from increasing to dangerous levels and destroying your robot. You generally want to set (or purchase) the shunt regulator at a value higher than the bus voltage. For example on a 48V motor you might want to set the shunt regulation voltage to 56V. One thing to be careful about is if your motors are on the main bus with the batteries, and you are charging the batteries in place, then the bus voltage increases from the charger. The shunt regulator voltage setpoint must be higher than the highest voltage that your battery charger will use while charging the batteries. Wiring the shunt regulator is super-simple. All you need to do is run two wires to the positive and ground rails of the power bus that you are trying to protect.</p>
<p>It&#8217;s common to go ahead and put a fuse before each motor driver (and its motor), and put the shunt regulator on the main bus (with no fuse). This looks pretty but you just set yourself up for problems: if the fuse blows, the amplifier is now disconnected from the shunt regulator, allowing the voltage to increase on that segment and destroy your motor (and driver)!</p>
<p>So what is the solution? There are generally two approaches:</p>
<ul>
<li>Do not fuse each motor driver individually. This lets you put all your motors and the shunt regulator on the same segment, so that if the fuse blows there is still a path to the shunt regulator.</li>
<li>Fuse each motor driver separately. However you put a power diode across the fuse to allow current to flow from the motor amplifier to your main bus where the shunt regulator is.</li>
</ul>
<p>There are two other approaches for this that are seldom used in robotics.</p>
<ul>
<li>You can put a shunt regulator next to each motor driver, but this is often not done due to cost and volume.</li>
<li>You can increase the capacitance of your power supply/system, allowing it to store more energy.</li>
</ul>
<p>When you choose the value for the fuse there are generally two approaches:</p>
<ol>
<li>Choose the value based on what you expect currents to be (plus some margin).</li>
<li>Select a fuse based on protecting a device from the maximum current that will destroy it.</li>
</ol>
<p>When you select fuses for a motor you will often want to use the second method of selecting a fuse just to avoid having to deal with voltage spikes blowing fuses. An example of when you might want the first option is if you want to limit current so something will not damage its environment if things go bad. You will also usually want to get a slow blow fuse and not a fast or quick blow fuse. This will give a little extra margin before the fuse blows to handle small transients.</p>
<hr />
<p>There are several places to purchase shunt regulators from. Two of the common sources are <a href="http://www.maxonmotor.com/maxon/view/product/235811" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Maxon Motors</a> and <a href="http://www.a-m-c.com/products/shunt-regulators.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Advanced Motion Controls</a>. In some cases you can get a shunt regulator integrated into your motor driver, for example <a href="http://www.galil.com/motion-controllers/multi-axis/dmc-41x3" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Galil Motion Control</a> has some nice (and inexpensive) integrated options.</p>
<hr />
<p><a href="https://www.servo2go.com/support/attachments/Galil%20Using%20Shunt%20Regulators.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Here is an interesting app note from Galil Motion Control about computing voltage increases.</a></p>
<hr />
<p>Main image is from <a href="http://www.a-m-c.com/products/shunt-regulators.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Advanced Motion Controls</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Book Review: &#8216;Practical Field Robotics&#8217; by Robert Sturges</title>
		<link>https://robohub.org/book-review-practical-field-robotics-by-robert-sturges/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Tue, 07 Jul 2015 15:22:25 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[field robotics]]></category>
		<guid isPermaLink="false">http://robohub.org/book-review-practical-field-robotics-by-robert-sturges/</guid>

					<description><![CDATA[<p>Practical Field Robotics: A Systems Approach by Robert H. Sturges, Jr. from Virginia Tech is an interesting book about how to design a field robot from a high level systems approach, and how to build a robotic lawnmower. This book has 2 primary sections. The first part of the book looks at 3 different example [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/book-review-practical-field-robotics-by-robert-sturges/" data-wpel-link="external" target="_blank">Book Review: Practical Field Robotics by Robert Sturges</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><em><a href="http://www.amazon.com/gp/product/1118941144/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1118941144&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=66KBK6LPHXAKR5UE" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="alignnone size-full wp-image-51797" src="http://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges.jpg" alt="Practical_Field_Robotics_Sturges" width="1000" height="758" srcset="https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges.jpg 1000w, https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges-425x322.jpg 425w, https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges-396x300.jpg 396w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><a href="http://www.amazon.com/gp/product/1118941144/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1118941144&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=BHZ4IRFI26DIBQYO" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Practical Field Robotics: A Systems Approach</a></em> by Robert H. Sturges, Jr. from Virginia Tech is an interesting book about how to design a field robot from a high level systems approach, and how to build a robotic lawnmower.<span id="more-51792"></span></p>
<p>This book has two primary sections. The first part of the book looks at three different example robotic systems from the domains of nuclear service robotics (teleoperated), mining robotics (large and autonomous), and a grass cutting robot (cheap consumer product). The second part of the book focuses on moving beyond those designs to cover the detailed software and systems that make a robot work.</p>
<p>The author presents a series of layers that can be applied to systems to characterize and guide a design. These layers are a way to guide the definition of requirements in order to build a robotic (or any other) system.</p>
<ul>
<li><strong>Field Environment</strong> – This is where the operating environment needs to be defined. These items can include: thermal, radiation, humidity, site layout, terrain, water, dimensions of interest, etc.</li>
<li><strong>Field Work</strong> – This includes the tasks that the robot needs to complete in the environment from above.</li>
<li><strong>Equipment Requirements</strong> – What constraints need to be placed on the robot due to the layers above. For example in a reactor building you can not use halogens on your robot/equipment.</li>
<li><strong>Conceptional &amp; Operational Designs</strong> – This layer is where you can really spend a lot of time. This is where you take the requirements and constraints that you defined in the above layers and actually create the high level details for the system that you will build. This can include creating concept of operations, figuring out what a mechanism should be, and determining your high level design.</li>
<li><strong>Safety &amp; Reliability</strong> – Once you have a basic design you need to evaluate the safety and reliability of the resultant design. This applies to the robot, the operators, the environment, etc. Note that this comes before the detailed design is completed.</li>
<li><strong>Detailed System Design – &lt;system&gt; </strong> – Once you have a basic design and you make sure it will be safe and reliable you are finally able to create the detailed design that you will build. You can have multiple instances of this layer for each of your various systems.</li>
</ul>
<p>One thing I ignored above is that the author discusses creating free body diagram’s (FBD) to help design the above systems.</p>
<p>The second half of the book moves on to the next levels of design. For example when performing the exercises above you create an FBD that has a block for <em>Send Sound</em>. The next level is detailing that block; you can create an FBD of that step alone. The author expands this by discussing the electronics, software (assembly style code) and how to set parameters in order to execute a <em>Send Sound</em> block. The author does this for several different types of functions. In practice the second half of the book is just a detailed view into how they built their robotic lawnmower project.</p>
<p>The author says several times that &#8220;<em>This book covers electronic, electrical, mechanical, control, and software disciplines as needed,&#8221;</em> however I disagree. The book does discuss some small details of the above and I guess it maybe meets the “as needed” clause that is on that assertion. However when it comes to building “Practical Field Robotics” I do not think there is any real discussion about the electronic, electrical, mechanical, and controls needed. There is a chapter that details software but it is pretty specific to the autonomous lawn mower project that is discussed. I expected it to cover the high level modules that a robot would need, but instead it is a very detailed review of the code needed for their robotic lawnmower project.</p>
<p>I think the first half of this book is a useful approach to systems engineering. However I am not sure how valuable the second half of the book is. I think if the author added another section to the book describing a systems-level approach to electrical, mechanical, etc. that would be great. You could imagine looking at a power system from the batteries to different DC/DC converts, to shunt regulators, etc. You could also imagine looking at basic mechanical systems such as 4-bar linkages and motors. This systems approach can be pushed even farther if we discuss sensors. However that was not done.</p>
<p>In conclusion if your goal is to learn how to build a field robot this book might not be for you. If you are looking to study systems engineering, then this book is worth the read.</p>
<a href="http://www.amazon.com/gp/product/1118941144/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1118941144&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=4EV5P3C2KNDETHSA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="alignnone size-full wp-image-51800" src="http://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges_back.jpg" alt="Practical_Field_Robotics_Sturges_back" width="897" height="1360" srcset="https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges_back.jpg 897w, https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges_back-280x425.jpg 280w, https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges_back-675x1024.jpg 675w, https://robohub.org/wp-content/uploads/2015/07/Practical_Field_Robotics_Sturges_back-198x300.jpg 198w" sizes="(max-width: 897px) 100vw, 897px" /></a>
<hr />
<p>I would like to thank <a href="http://ca.wiley.com/WileyCDA/WileyTitle/productCd-1118941144.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wiley</a> for providing me with a hard copy of this book for review.</p>
<p>Some words of disclaimer:<br />
I have never met the author of this book and the opinions are mine.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to convert Linux into an embedded system</title>
		<link>https://robohub.org/how-to-convert-linux-into-an-embedded-system/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 12 Jun 2015 17:30:14 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/how-to-convert-linux-into-an-embedded-system/</guid>

					<description><![CDATA[<p>Hi all Running Linux on your embedded system can be great for giving you a stable base, lots of tools, and you can often solve problems with a quick google search. I define embedded as any custom-built computer system, not only tiny devices. In many cases you can develop on the computer itself for ease [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/convert-linux-embedded-system/" data-wpel-link="external" target="_blank">Convert Linux into an Embedded System</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-50874" src="http://robohub.org/wp-content/uploads/2015/06/CoreModule-745.jpg" alt="CoreModule-745 linux" width="900" height="500" srcset="https://robohub.org/wp-content/uploads/2015/06/CoreModule-745.jpg 900w, https://robohub.org/wp-content/uploads/2015/06/CoreModule-745-425x236.jpg 425w, https://robohub.org/wp-content/uploads/2015/06/CoreModule-745-500x278.jpg 500w" sizes="(max-width: 900px) 100vw, 900px" />Running Linux on your embedded system can be great for giving you a stable base, lots of tools, and you can often solve problems with a quick Google search.<span id="more-50620"></span></p>
<p>I define embedded as any custom-built computer system, not only tiny devices. In many cases you can develop on the computer itself for ease of development, however in other cases you will need to be able to set up a cross compile environment (for example if you have a slow ARM computer and you want to compile things on your fast Intel i7 processor).</p>
<p>This post will give you a high level list of the steps I take when setting up my Linux systems, with links for more information is some cases.</p>
<p>Linux is great since you can modify just about anything, it is free, you can strip out components you do not need, and you can configure just about anything (including the scheduler). The downside is that you can configure just about anything and break something in the process. Linux also tends to be a little behind when new technologies are released; common problems have been wireless cards, SSDs, firewire and USB3. Linux is in essence just a kernel that let&#8217;s you build operating system distributions on it. Some of the common distros are Debian, Ubuntu (I know this is Debian, but this is the flavor that is very common, supported, and one that I often use), Fedora, Suse, and Wind River.</p>
<p>A common question is whether you need a real-time version of Linux, and the answer is that most people do not. Look at your system and determine how critical it is to have guaranteed timing that an event will happen within a specific time allotment; usually the answer is no. I heard a speaker from Space X who said they mostly just use Ubuntu and not any real-time system on their rockets. If you do need real-time Linux, there are several variants including <a href="http://www.windriver.com/products/linux/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wind River</a> (costs $$$) and <a href="http://www.rtems.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RTEMS</a> (FREE).</p>
<p>There are many people who come from the world of servers who want to setup virtual machines (VMs) and use the Linux VMs to run the robot. I generally don’t like this. I have had many reliability problems from VMs that are constantly being turned on and off. I have also had VMs randomly not recognize devices/ports that are then recognized with a reboot. You also take a large performance hit since there is a lot of overhead in running a VM. The notion that you can have a VM on the robot and then a VM on your desktop for development usually does not work since they do not stay in sync. If you are mass producing a system, then you should just create a master drive or image, and clone that to all of the other drives; a VM is not needed.</p>
<p>Here is a rough list of steps for how to convert your Linux system into an embedded system:</p>
<ol>
<li>Choosing a filesystem. Select a volatile RAM drive for maximum reliability (and hardest development cycle). For a generic drive use journaling for reliability if the system crashes or shuts down uncleanly. In Linux this generally means EXT3 or EXT4.</li>
<li>Set the OS as read-only so you can handle system crashes. <a href="http://robotsforroboticists.com/read-operating-systems/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Learn more</a>.</li>
<li>Set bootloader to not stop on failure. This is especially true for new versions of Ubuntu; if the computer does not shut down cleanly it will halt at the bootloader until you press a key. <a href="http://robotsforroboticists.com/ubuntu-boot-automatically-failed-shutdown-stuck-bootloader/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Learn More</a>.</li>
<li>Set BIOS (I know this is not technically Linux) to autostart when power is applied (the default is to use the switch on the computer).</li>
<li>While I am in the BIOS I will often enable some of the options to speed up boot time, including reducing the length of the countdown before booting.</li>
<li>If large amounts of storage are needed, use an SSD for the OS and a spinning disk drive or second SSD for the data.</li>
<li>Change the default setting to not do a disk scan after X days or X boots. If your computer decides to do those scans you tend to stand around thinking your robot is broken, and then after it finally boots you wonder how it fixed itself.</li>
<li>Have a system watchdog. This will let you detect if your software crashes so you can restart the system. At minimum you can add a software watchdog. Even better is to purchase a computer with an integrated hardware watchdog.</li>
<li>Create a script in <em>/etc/init.d/</em> for starting your process. Any paths you use should be absolute (and not relative) paths. The newer way to do this is with upstart, though I don&#8217;t have much experience with this yet.</li>
<li>Add symlinks to your <em>/etc/init.d/</em> in <em>/etc/rc*.d</em> for the code you want to run at a given runlevel. I usually put a symlink into <em>/etc/rc2.d/, /etc/rc3.d/, and /etc/rc5.d/</em>. The other way to do this is to just edit the <em>/etc/rc.local</em> file.</li>
<li>Add /etc/udev entries for mapping devices (such as USB). This can sometimes be a tricky process that needs some experimentation with to get right. <a href="http://www.clearpathrobotics.com/blog/udev/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Learn More</a>.</li>
<li>Add other drives to /etc/fstab so that the drives come up the same with proper mount points and permissions every time. One thing to watch out for is that if the drive is not available, fstab might panic and not boot fully. If you think your drive might not be available (or you just want to be cautious) you can set <em>nofail</em> as one of the options.</li>
<li>Disable all software updates (except maybe security updates). I have seen many times where a software update will break code that has been working for a long time.</li>
<li>Good tools to install are <em>ssh</em> (or <em>openssh</em>) server and rsync for managing and updating code.</li>
<li>Use GCC tool chains when possible. Do NOT mess with other tool chains unless you have a <em>very</em> good reason.</li>
<li>Use <em>top</em> or <em>htop</em> to monitor system usage after loading your code. I try to only use around 75% of CPU and memory to allow for mostly repeatable code timing.</li>
<li>If I am using a wired network (which I almost always do) I try to put my settings in <em>/etc/networking/interfaces</em> and not in the GUI network manager. The reason for this is that it is easier to remotely change the setting (I use SSH for everything) if you ever need to change them in the future. I rarely use wireless in an embedded application for reliability reasons. If I am using wireless I will often use the GUI out of laziness, but there are ways to still use config files for wireless (which is the better way).</li>
</ol>
<p>There you have it &#8211; my list of things I do to stabilize and prepare a fresh Linux install to work in an embedded application.</p>
<p>What other steps do you take? Leave it in the comments below.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Book Review: Implementation of Robot Systems, by Mike Wilson</title>
		<link>https://robohub.org/book-review-implementation-of-robot-systems-by-mike-wilson/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 01 May 2015 15:41:35 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[books]]></category>
		<guid isPermaLink="false">http://robohub.org/book-review-implementation-of-robot-systems-by-mike-wilson/</guid>

					<description><![CDATA[<p>Hi all Today I am reviewing Implementation of Robot Systems by Mike Wilson. This is a book about how to integrate robots into the manufacturing process. In this book Mike Wilson takes you through the process of deploying and developing your robotic systems since &#8220;All successful projects require a methodical approach to project planning.&#8221; By [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/book-review-implementation-of-robot-systems-by-mike-wilson/" data-wpel-link="external" target="_blank">Book Review: Implementation of Robot Systems by Mike Wilson</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><em><a href="http://www.amazon.com/gp/product/B00QA8TX8Q/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B00QA8TX8Q&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=VVWU3H6FGOXRSG7K" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter size-full wp-image-49226" src="http://robohub.org/wp-content/uploads/2015/04/Implementation-of-Robot-Systems-An-introduction-to-robotics-automation-and-successful-systems-integration-in-manufacturing-Kindle-edition-by-Mike-Wilson.-Professional-Technical-Kindle-eBooks-Amazon.com_..jpeg" alt="Implementation of Robot Systems  An introduction to robotics  automation  and successful systems integration in manufacturing   Kindle edition by Mike Wilson. Professional   Technical Kindle eBooks   Amazon.com." width="875" height="425" srcset="https://robohub.org/wp-content/uploads/2015/04/Implementation-of-Robot-Systems-An-introduction-to-robotics-automation-and-successful-systems-integration-in-manufacturing-Kindle-edition-by-Mike-Wilson.-Professional-Technical-Kindle-eBooks-Amazon.com_..jpeg 875w, https://robohub.org/wp-content/uploads/2015/04/Implementation-of-Robot-Systems-An-introduction-to-robotics-automation-and-successful-systems-integration-in-manufacturing-Kindle-edition-by-Mike-Wilson.-Professional-Technical-Kindle-eBooks-Amazon.com_.-425x206.jpeg 425w, https://robohub.org/wp-content/uploads/2015/04/Implementation-of-Robot-Systems-An-introduction-to-robotics-automation-and-successful-systems-integration-in-manufacturing-Kindle-edition-by-Mike-Wilson.-Professional-Technical-Kindle-eBooks-Amazon.com_.-500x243.jpeg 500w" sizes="(max-width: 875px) 100vw, 875px" />Implementation of Robot Systems</a></em> by Mike Wilson is a book about how to integrate robots into the manufacturing process. Wilson takes you through the process of deploying and developing your robotic systems, because, as Wilson puts it: “All successful projects require a methodical approach to project planning.” By following his lessons from over 30 years of experience working with robotics and automation, you can learn how to spec, design, order, monitor, and evaluate manufacturing robots.<span id="more-48809"></span></p>
<p><a href="http://www.amazon.com/gp/product/B00QA8TX8Q/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B00QA8TX8Q&amp;linkCode=as2&amp;tag=therobpod-20&amp;linkId=VVWU3H6FGOXRSG7K" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="alignleft size-full wp-image-49227" src="http://robohub.org/wp-content/uploads/2015/04/implementation_robotic_systems_mike_wilson.jpg" alt="implementation_robotic_systems_mike_wilson" width="266" height="400" srcset="https://robohub.org/wp-content/uploads/2015/04/implementation_robotic_systems_mike_wilson.jpg 266w, https://robohub.org/wp-content/uploads/2015/04/implementation_robotic_systems_mike_wilson-200x300.jpg 200w" sizes="(max-width: 266px) 100vw, 266px" /></a>After the introductory section discussing the history of robots in manufacturing we jump into a discussion of the different types of robots (articulated, SCARA, cartesian, parallel mechanisms, etc…), how they perform, and how to select the proper robot type. For performance he picks out the following four items that you need to evaluate for a given application and robot.</p>
<p>1. Weight carrying capacity<br />
2. Repeatability (path and tool position)<br />
3. Reach and Working envelope (configuration, number of axes, etc..)<br />
4. Speed (for each axis or given path).</p>
<p>That list is followed by a list of how to select your robot. It is a combination of the items above and a few more things such as:</p>
<p>5. Mounting capabilities<br />
6. Dimensions and weight<br />
7. Protection and environmental considerations<br />
8. Electrical requirements</p>
<p>The following two chapters are all about the common components in a manufacturing system and the applications that robots are commonly used for. So to build your robotic system you will need to start by considering:</p>
<ul>
<li><strong>Handling Equipment:</strong> conveyors, ground vehicles, part feeders, bowl feeders, linear feeders, blow feeders, bandoleer feeders, and magazine feeders</li>
<li><strong>Vision Systems:</strong> For inspection and positioning</li>
<li><strong>Process Equipment:</strong> There are two types of process equipment.
<ol>
<li>Equipment that handles parts</li>
<li>Equipment that applies a process: Welding, Painting, dispensing, cutting, etc..</li>
</ol>
</li>
<li><strong>Grippers and Tool Changers</strong></li>
<li><strong>Tooling &amp; Fixturing</strong></li>
<li><strong>Assembly Automation Components</strong></li>
<li><strong>System Controls</strong></li>
<li><strong>Safety &amp; Guarding</strong></li>
</ul>
<p>While I just provided a list, the book goes into detail about each of the above categories.</p>
<p>Now that the reader knows what they need to consider and how to evaluate a solution, we can look at typical applications. The primary applications discussed include: welding (arc, spot and laser), dispensing (painting, adhesives, and sealant), processing (cutting, grinding, deburing, and polishing), handling (casting, molding, forging, stamping, inspection, palatizing, and packing), followed by some electronics assembly. For each of these topics the concept and requirements are first discussed, followed by a section on developing a solution.</p>
<p>After developing the ideas required to iterate a system we are ready to develop specifications for each section. The author discusses the process starting with the concept and requirements, all the way to testing, warranties, and training.</p>
<p>Once your solution is in place it is important to quantify the benefits that you are receiving. The author discusses the 10 key benefits of robots as developed by the International Federation of Robotics in 2005:</p>
<ol>
<li>Reduce operating cost</li>
<li>Improve product quality and consistency</li>
<li>Improve quality of work for employees</li>
<li>Increase production output</li>
<li>Increase product manufacturing flexibility</li>
<li>Reduce material waste and increase yield</li>
<li>Comply with safety rules and improve workplace health and safety</li>
<li>Reduce labor turnover and difficulty of recruiting workers</li>
<li>Reduce capital costs</li>
<li>Save space in high-value manufacturing areas</li>
</ol>
<p>These ten areas are a good start for justifying robots as part of a business model. They can also be used to evaluate a system before purchasing.</p>
<p>After reading this book I found it interesting to see the different processes and methods that robots are typically used for in manufacturing. If you are looking to get into the field, then you should read this book. While I think it is great that the author walks the reader through the different tasks, and how to evaluate the robotic solutions, I often felt that the book was repetitive.</p>
<p>I think this book is good for researchers looking to break into manufacturing robotics, to help get a good idea of various manufacturing processes. It might also useful when writing grants to have metrics that you can discuss. For a practicing (maybe beginner) engineer, this book has good chapters on project management and how to evaluate a system pre and post installation.</p>
<hr class="xh2  ">
<p>I would like to thank Wiley for providing me with a hard copy of this book for review.</p>
<p>The post <a href="http://robotsforroboticists.com/book-review-implementation-of-robot-systems-by-mike-wilson/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">Book Review: Implementation of Robot Systems by Mike Wilson</a> appeared first on <a href="http://robotsforroboticists.com/" rel="nofollow external noopener noreferrer" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>
<p><hr class="xh2  "><br />
<i>If you liked this article, you may also be interested in:</i></p>
<ul>
<li><a title="Permanent Link: Toughbook: The super rugged laptop teardown" href="http://robohub.org/toughbook-the-super-rugged-laptop-teardown/" rel="bookmark" data-wpel-link="internal">Toughbook: The super rugged laptop teardown</a></li>
<li><a title="Permanent Link: Selecting a camera and lens for your robot" href="http://robohub.org/selecting-a-camera-and-lens-for-your-robot/" rel="bookmark" data-wpel-link="internal">Selecting a camera and lens for your robot</a></li>
<li><a title="Permanent Link: Things to think about when transporting your robot" href="http://robohub.org/things-to-think-about-when-transporting-your-robot/" rel="bookmark" data-wpel-link="internal">Things to think about when transporting your robot</a></li>
<li><a title="Permanent Link: Developing trust in autonomous robots: Seminar with Michael Wagner" href="http://robohub.org/developing-trust-in-autonomous-robots-seminar-with-michael-wagner/" rel="bookmark" data-wpel-link="internal">Developing trust in autonomous robots: Seminar with Michael Wagner</a></li>
</ul>
<p><i>See all </i><a href="http://robohub.org/" data-wpel-link="internal"><i>the latest robotics news</i></a><i> on Robohub, or </i><a href="http://eepurl.com/t-UEf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><i>sign up for our weekly newsletter</i></a><i>.</i></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Software engineering principles</title>
		<link>https://robohub.org/software-engineering-principles/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Wed, 15 Apr 2015 21:26:09 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/software-engineering-principles/</guid>

					<description><![CDATA[<p>Hi all I have often thought about what the proper software methodology should be for the various robots that I build. My thoughts have evolved over time as I have seen these tool work. I do not have any formal software engineering training, however these are things that I have seen, heard, read, etc.. that [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/software-engineering-principles/" data-wpel-link="external" target="_blank">Software Engineering Principles</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" src="http://robohub.org/wp-content/uploads/2015/04/coding-425x283.png" alt="coding" width="425" height="283" class="alignleft size-medium wp-image-48411" srcset="https://robohub.org/wp-content/uploads/2015/04/coding-425x283.png 425w, https://robohub.org/wp-content/uploads/2015/04/coding-450x300.png 450w, https://robohub.org/wp-content/uploads/2015/04/coding.png 900w" sizes="(max-width: 425px) 100vw, 425px" />
<p>I have often thought about what the proper software methodology should be for the various robots that I build. My thoughts have evolved over time as I have seen these tool work. While I do not have any formal software engineering training, these are the common principles that I have seen, heard, read, etc. that I believe in (at 2am while I write this).<span id="more-47939"></span></p>
<div style="clear:both"></div>
<p><em>Disclaimer: Most of the suggestions here have come from other sources. Please check out the links attached for more information.</em></p>
<p>I will start with how to write code, since that is the basis of everything else. After that we will move into the software engineering infrastructure needed to make the software work properly.</p>
<div style="clear:both"></div>
<h2>General Programming Rules</h2>
<p>Without having basic rules that you follow when coding, your code is doomed to fail and be unreliable. Everything else is built upon this. Many people start programming and want to use crazy template magic where everything inherits something else, however you must STOP and write simple code that is easy to understand and test.</p>
<ul>
<li><strong>Keep control structures simple</strong> – Limit your branching, don’t have long nested <em>if, case, and loop</em> statements, no recursive magic.</li>
<li><strong>Endless loops</strong> – Do not use boundless loops unless you really want to be stuck there forever (such as the main loop). Everything else must have an upper/lower bound for exiting the loop. Think more about <em>for</em> loops than <em>while</em> loops.</li>
<li><strong>No dynamic memory</strong> – Forget that <em>malloc</em> exists. It can cause programs to act differently at each run time, and can also add memory leaks that can be hard to detect.</li>
<li><strong>asserts</strong> – Asserts can help you to enforce that the proper thing is helping in each function. I generally do not like the default assert functions that simply cause an exit; sometimes that is appropriate, but in many cases you should try recovering from the error instead of just exiting. You need to evaluate what is the safer approach in your application.</li>
<li><strong>Keep scope</strong> – Try to assign and initialize variables, structures, etc. in as small a scope as possible. This includes limiting your usage of global variables.</li>
<li><strong>Pointers</strong> – Limit your use of pointers when this is easily possible. You should really avoid multiple levels of pointers. They can be very confusing to follow and lead to all sorts of problems if you reference memory addresses that you should not be touching.</li>
<li><strong>Check return value from all (non void) functions</strong> – If a function can (and should be able to) return an error value, make sure to catch it and act on it. It can also be good to check the bounds of a value returned instead of blindly trusting it.</li>
<li><strong>Turn on all compiler warnings</strong> – So you catch things early. This is especially important when formatting text, working with memory, and when bit banging.</li>
<li><strong>Use parentheses to control order of operations</strong> – I have seen many people assume or forget about the proper order of operations. Using parentheses can clarify and enforce the desired result.</li>
<li><strong>Hard coded number</strong> – Please use variables for any value that might need to be changed by a programmer. If you have an even slightly non-obvious number, include a comment about the source of that number and how to derive it.</li>
<li><strong>Preprocesor</strong> – Limit the preprocessor to “simple” things, such as <em>#define</em> and <em>#if</em>. Using complex macros can lead to hard-to-understand code, poor portability, and a increased probability of bugs.</li>
<li><strong>Standards</strong> – Keep your code consistent. This includes naming, white space, and where your curly braces go. This makes it easier to follow the code. If you are editing existing code, use the format of the existing code.</li>
<li><strong>Sleep with <em>noop’s</em> or empty <em>for</em> loops</strong> – These should be avoided since they will run differently on different systems. This is primarily for embedded systems.</li>
<li><strong>Document your code</strong> – Need I say more?</li>
</ul>
<p><strong>Helpful links:</strong><br />
<a href="http://www.eetindia.co.in/ARTICLES/1999DEC/PDF/EEIOL_1999DEC01_EMS_TA_1.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rules for defensive C programming</a><br />
<a href="http://spinroot.com/gerard/pdf/P10.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Power of Ten – Rules for Developing Safety Critical Code</a><br />
<!--Pitfalls for Real-Time Software Developers, <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.133.761&#038;rep=rep1&#038;%23038;type=pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Part 1]</a> <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.122.4906&#038;rep=rep1&#038;%23038;type=pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">[Part 2]</a>--></p>
<div style="clear:both"></div>
<h2>Software Repositories</h2>
<p>Having a code repo should be a given for every programmer and programming team. There are many free tools available, so there is no excuse to not use them.</p>
<p>Having a software repository lets you save your code at various points so that you can roll back to prior working versions. Repositories also let you log what was changed in each file and by whom. These tools are a great way to share code with a team &#8211; there is no need to email code back and forth. You can also put documentation in the repo so that is is always available.</p>
<p>There are many options to choose, from cvs, svn, mercurial, git, bitkeeper, etc. Just pick one!</p>
<p>Lately I have been using a hosted repo service called <a href="http://github.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">github.com</a> &#8211; I like all of the tools that are packaged with git on the website. <a href="https://bitbucket.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">bitbucket.org</a> is another similar option.</p>
<p>I generally like to create repositories with the following directories in the root directory:</p>
<ul>
<li><strong>bin</strong> – A place to put all of the binaries after they are compiled. By default this directory should have nothing checked into the repository.</li>
<li><strong>config</strong> – If I have lots of config files I will put them all in this directory.</li>
<li><strong>doc</strong> – Documentation for the system (datasheets, diagrams, notes, etc..)</li>
<li><strong>externals</strong> – Source code and libraries from outside parties (ie. you did not write them)</li>
<li><strong>includes</strong> – Header files that other multiple programs want access to at compile time</li>
<li><strong>libs</strong> – A place to put all of the libraries after they are compiled. By default this directory should have nothing checked into the repository.</li>
<li><strong>src</strong> – This is where all of the code we write should live.</li>
<li><strong>tools</strong> – This is for random “tools” that do not fit anywhere else.</li>
</ul>
<p>In addition to the directories above, I will usually put the main make file for the project and a README in the root directory.</p>
<p><strong>Links:</strong><br />
<a href="http://robotsforroboticists.com/repos/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Software repositories or just plain repo</a></p>
<div style="clear:both"></div>
<h2>Bug/Issue tracking</h2>
<p>Having a central database to track bugs is very important for developing great code that runs bug free. This lets anyone who identifies a bug to report it in such a way that it does not get lost. Just telling the developer or emailing them is not sufficient. People forget things easily. Ideally, you do not want the developer to close a bug; you want somebody to report the bug, the developer to fix it, and then the original person who identified the bug verify that it was properly fixed.</p>
<p>A bug report needs three things:</p>
<ol>
<li>What you expected to happen</li>
<li>What did happen</li>
<li>Steps to reproduce observed behavior (ie bug). Try to minimize the number of steps needed to reproduce error. Include versions of code that you are using.</li>
</ol>
<p><strong>Links:</strong><br />
<a href="http://www.joelonsoftware.com/articles/fog0000000029.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Painless Bug Tracking</a></p>
<div style="clear:both"></div>
<h2>Automated Testing</h2>
<p>Each of your processes/functions should have a set of tests (often called “unit tests”) performed on them to verify functionality. These tests make sure that functions work with various input extremes and combinations. Ideally you should have a test for each possible control path within a function.</p>
<p>For example if you are testing a “sum(number1, number2)” function, you can have the following test file:</p>
<pre>int main () {
assert( 2 = sum(1,1));
assert( 0 = sum(-1,1));
assert( NULL = sum(1,NULL)); // or whatever you want it to be doing…
assert( 0 = sum(0,0));
assert( 1999998 = sum(999999,999999));
assert( 5 = sum(4.2,1)); // assuming integers and that floats are rounded.

RETURN (TRUE);
}
</pre>
<p><em>In this example assert will print an error message about where it failed and exit. (This is just my quick example, and can definitely be expanded and improved. It can also be changed to fail at compile time so that you do not need to “run” it.)</em></p>
<div style="clear:both"></div>
<h2>Automatic (Daily) build system</h2>
<p>Having a build server that builds every time somebody commits code, or at minimum, every night, is valuable for identifying inadvertent bugs introduced into your system and automatically running your tests.</p>
<p>Often you will make a change to one module that will cause another module to fail. But as developers we get focused on our modules and tend to not try recompiling all of the code to make sure that we did not break anything. It is always better to find out you broke something earlier than later.</p>
<p>Certain things tend to cause other modules to break more than others. For example making a change to a widely used header file or message definition file can affect other items.</p>
<p>This also makes programmers only commit code that compiles to the repo and not broken code. If they commit broken code the build tools can/should send out emails to notify people that the build failed (and whose fault it was).</p>
<p>You can either just make a quick script to check out the repo, build it, parse the output and email the results; or you can get a proper build system such as <a href="https://jenkins-ci.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jenkins</a>. Generally using somebody else’s product will be more reliable and a better use of your time.</p>
<p><strong>Links:</strong><br />
<a href="http://www.joelonsoftware.com/articles/fog0000000023.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Daily Builds Are Your Friend</a></p>
<div style="clear:both"></div>
<h2>Code Reviews</h2>
<p>Code reviews are tough, but they are also one of the best ways to reduce the number of bugs in a piece of software. The traditional code review &#8211; where a person gets up and talks others in the room through the code (that the people have never seen before) &#8211; DOES NOT WORK! This might be good for getting people familiar with the program&#8217;s operation, but it is not the best way to do a code review and find problems.</p>
<p>To do a code review you should have the programmer send a review request to 1-3 other software engineers. The review request should have an overview of the code, a flowchart, and directions to access the code. The number of engineers and the experience level of those engineers should be based on how critical the code it. Each reviewer should:</p>
<ol>
<li>Review the code (obviously) – Don’t dwell on style, you have better things to do with your time.</li>
<li>Develop a list of questions about the code</li>
<li>Write some tests and make sure they pass (these can be committed to always run in the nightly build).</li>
</ol>
<p>Some of things reviewers should watch out for are when reviewing code before a large review:</p>
<ul>
<li>Does the code do what it is supposed to do (and not do what it is not supposed to do)?</li>
<li>Should the code/function be written in a more efficient manner?</li>
<li>Is the control flow simple/clean/good (if, else, return, etc..)?</li>
<li>Do switch statements have a default catch all?</li>
<li>Is the code commented adequately?</li>
<li>Are variables declared at the proper scope (minimizing globals)?</li>
<li>Are there memory leaks?</li>
<li>What happens if things return NULL?</li>
<li>Error/Exception handling</li>
<li>Buffer overflows (doing raw things with char’s, int’s, etc.. memory locations)</li>
<li>Pointer and pointer based math</li>
<li>Array indexing</li>
<li>Closing all handles (files, ports, etc..)</li>
<li>Macro usage</li>
<li>64bit vs 32 bit modifications</li>
<li>Multithreading (is it needed?, number of threads, race points, deadlocks, data passing, priority inversion, etc.)</li>
<li>Operators (precedence and proper usage [ &amp; vs &amp;&amp;, = vs == ])</li>
<li>If input items from users and functions is checked before being used</li>
</ul>
<p>(Did you notice how this list is similar to the good programming practices above?)</p>
<p>After doing the above steps it is now OK to hold the big meeting where people sit down and walk through and review the code; although this is not strictly necessary.</p>
<p>Reviewing code can be hard. Getting your programmers used to reading code and reviewing it will help strengthen their own coding. It can also be useful to have dedicated QA people who review code.</p>
<p><strong>Links:</strong><br />
<a href="http://betterembsw.blogspot.com/2011/11/embedded-system-code-review-checklist.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Embedded System Code Review Checklist</a><br />
<a href="https://msdn.microsoft.com/en-us/library/bb871031.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Microsoft: Best Practices: Code Reviews</a></p>
<div style="clear:both"></div>
<h2>Build System</h2>
<p>You should be using a build tool so that you are not manually compiling each file. Probably the most common one is <a href="http://en.wikipedia.org/wiki/Make_%28software%29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">make</a>.</p>
<p>Each make file should have at minimum the following directives:</p>
<ul>
<li><strong>all</strong> – Build all of the production code</li>
<li><strong>clean</strong> – Deletes the binary and object files. This lets the next build be completely clean.</li>
<li><strong>install</strong> – Installs the binaries and libraries into the proper location. This can be a process such as:
<ol>
<li>Copy old binary to &lt;binaryName&gt;_&lt;archivedDateTime&gt;</li>
<li>Copy new binary to location with active processes</li>
</ol>
</li>
<li><strong>test</strong> – Builds a set of unit/system tests that verify operation and make sure bugs were not introduced.</li>
</ul>
<p>I believe you should be able to build, install, test, or clean your entire system with one command. As such I will normally create a make file for each process, and then create one master make file that calls all of the individual make files. Having a single make file that can build everything is good for installing a new system and makes setting up the nightly build easier.</p>
<div style="clear:both"></div>
<h2>Summary</h2>
<ul>
<li>Write good code.</li>
<li>Use a repository service (assuming it is not super sensitive data) such as <a href="https://github.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">github</a> or <a href="https://bitbucket.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">bitbucket</a>. That gives you the repo, the issue tracking, and the ability to easily do code reviews.</li>
<li>Setup a server that builds your repository and runs your tests, at least once a day.</li>
</ul>
<p>Do you have other favorite tools to make your software more reliable? Please leave comments below.</p>
<p><em>Main image based on sample code from wikipedia and hammer from pixabay.com/.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dry vs wet, oil vs grease: Choosing the right lubrication for your robot</title>
		<link>https://robohub.org/dry-vs-wet-oil-vs-grease-choosing-the-right-lubrication-for-your-robot/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 27 Mar 2015 16:34:14 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/dry-vs-wet-oil-vs-grease-choosing-the-right-lubrication-for-your-robot/</guid>

					<description><![CDATA[<p>One thing that is often looked is lubrication (lube). Changing your lubrication and selecting the proper type can dramatically modify the performance of your system. This change of lubrication was one of the primary reasons MSL was delayed from launching to Mars. Improper lubrication can cause your mechanical parts to wear out and fail. It [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/lubrication-oil-grease/" data-wpel-link="external" target="_blank">Lubrication: Dry vs Wet &#8211; Oil vs Grease</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><a href="http://robohub.org/wp-content/uploads/2015/03/grease_gun.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-47572" src="http://robohub.org/wp-content/uploads/2015/03/grease_gun.jpg" alt="grease_gun" width="800" height="395" srcset="https://robohub.org/wp-content/uploads/2015/03/grease_gun.jpg 800w, https://robohub.org/wp-content/uploads/2015/03/grease_gun-425x209.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/grease_gun-500x246.jpg 500w" sizes="(max-width: 800px) 100vw, 800px" /></a>In 2008, the Mars Science Laboratory&#8217;s launch was delayed, in large part <a href="http://www.thespacereview.com/article/1319/1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">due to issues with lubrication</a>. Lubrication can dramatically impact the performance of your system: improper lubrication can cause your mechanical parts to wear out and fail, and lead to increased power usage and annoying audible sounds. This post looks at the main types of lubrication and where you should use them.<span id="more-47510"></span></p>
<p>Tribology &#8211; the study of friction, wear, and lubrication &#8211; can help us determine the best approach.</p>
<p>Where do you need lubrication (lube) on a robot? The simple answer is: at any joint that moves. In practice this means near actuated joints, bearings, sliders, chains, and in gear boxes. Lube can also be used to reduce rust on metal components.</p>
<p>There are generally two classes of lubrication: wet, and dry (or solid).</p>
<p><strong>Wet</strong> lubes stay “wet” while on the part, which is good for operating in wet/humid conditions. The down side is that dirt can stick to it.</p>
<p><strong>Dry</strong> lube often goes on wet but then dries on the part it has been applied to. Soil particles do not stick to dry lube, but generally it does not last as long as a wet lube and needs to be reapplied more often. That said, dry lubes tends to stay in place a better than wet lubes. The dry lubes are generally more expensive and have lower performance. Dry lubes are usually required for space and vacuum applications to minimize out-gassing.</p>
<p>Another lubrication decision to make is grease vs oil. This is especially true for motor gearboxes.</p>
<p><strong>Grease</strong> adheres better than oil, tends to last longer, and has the added benefit of helping to keep dirt out by acting as a sealant. That said, if a lot of particulate matter gets into the grease, it can compromise the lubricant, so using seals to “hide” the lubricant is a good idea. Grease is thicker than oil when it&#8217;s cold, and can be very hard &#8211; making it difficult to form an effective coating on the parts. It can take a lot of energy to heat up and/or spin a motor when using grease from a cold start, and running with cold grease can be equivalent to running with no lubrication or running with a solid mass in the way. The result is that a cold motor lubricated with grease can draw a higher current that will drop as the grease starts to move, heat up, and form a light coating on the parts.</p>
<p><strong>Oil</strong> is often a better choice if you need to start from a cold temperature and/or want to reduce your current consumption. There is usually an optimal oil viscosity given a mechanical speed and power input, since the viscosity and lubricating effectiveness changes based on the heating effects. Oil often is used at higher speeds because it has a lower viscous drag than grease. There is a continuum of various “weights” in greases and oils across the viscosity spectrum that you can look at when choosing your lube. Oil is also good where lube needs to be circulated through something (examples are for automated lube systems or for transferring heat for thermal management).</p>
<div id="attachment_47571" style="width: 1252px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-47571" class="size-full wp-image-47571" src="http://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves.jpg" alt="Two plots of different standard engine oil. Showing the viscosity with temperature. (Click for larger image)." width="1242" height="458" srcset="https://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves.jpg 1242w, https://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves-425x156.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves-1024x377.jpg 1024w, https://robohub.org/wp-content/uploads/2015/03/viscosity_vs_temperature_comparison_curves-500x184.jpg 500w" sizes="(max-width: 1242px) 100vw, 1242px" /></a><p id="caption-attachment-47571" class="wp-caption-text">Two plots of different standard engine oil. Showing the viscosity with temperature. (Click for larger image).</p></div>
<p>People often put too much lube on their system. Usually only a thin coat is needed on your moving parts, and any extra globs are generally a waste. Factory systems that require regular lubrication often use automated systems that apply the lube on a schedule.</p>
<p>The above is general information. There are many different types of oil and grease, each with different characteristics. When you really start getting into the details there are all sorts of material compatibilities, corrosion properties, organic vs. synthetic lubes, viscosities, temperatures, speeds, forces, fretting, water displacement film layers, etc.. that you must take into account. If you are too lazy to select a lubricant (and I often am), purchasing a “general purpose” grease or oil will probably give you medium performance, medium viscosity, and medium just about every other parameter.</p>
<p>It is important to note that lubricants can sometimes be avoided in mechanisms (I know I am contradicting what I have said above). Low friction bushing materials like teflon, nylon, rulon-J, bronze, and even steel on steel, are simple options for mechanisms with low-speed joints that can require no lubrication.</p>
<p>Do you know more about lube? Please leave your comments below.</p>
<hr />
<p>I would like to thank Nick for helping me edit this and provide information to improve this article.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Toughbook: The super rugged laptop teardown</title>
		<link>https://robohub.org/toughbook-the-super-rugged-laptop-teardown/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Wed, 25 Mar 2015 19:24:40 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/toughbook-the-super-rugged-laptop-teardown/</guid>

					<description><![CDATA[<p>Hi all Today I have a Panasonic Toughbook CF-18 that I will have the opportunity to tear down and see just what makes these computers so rugged. Please keep reading for the details of scan through for some nice pictures (you can click an image for the larger version). The computer weighs 4lb 10.8 oz [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/toughbook-super-rugged-laptop-teardown/" data-wpel-link="external" target="_blank">TOUGHBOOK: The Super Rugged Laptop Teardown</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>In this post I tear down a <a href="http://www.panasonic.com/business/toughbook/laptop-computers.asp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Panasonic Toughbook</a> CF-18 to see just what makes these computers so rugged. <span id="more-47430"></span>Keep reading for details, or scan through for pictures (you can click an image for the larger version).</p>
<a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_full.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter wp-image-47519 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_full.jpg" alt="toughbook_full" width="600" height="650" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_full.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_full-392x425.jpg 392w, https://robohub.org/wp-content/uploads/2015/03/toughbook_full-276x300.jpg 276w" sizes="(max-width: 600px) 100vw, 600px" /></a>
<div id="attachment_47520" style="width: 610px" class="wp-caption aligncenter"><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_rotated.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47520" class="wp-image-47520 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_rotated.jpg" alt="toughbook_rotated" width="600" height="686" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_rotated.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_rotated-371x425.jpg 371w, https://robohub.org/wp-content/uploads/2015/03/toughbook_rotated-262x300.jpg 262w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47520" class="wp-caption-text">Swivel touchscreen top. Can swivel 180degrees in the clockwise direction. Lock button for the screen is at the base of the swivel.</p></div>
<p>The computer weighs 4lb 10.8 oz and feels as solid as a brick. The entire case and most of the internals are made from metal, which makes for a very strong laptop that feels like it can be abused. The designers were nice enough to leave the screws exposed for easy maintenance, repair, and teardowns. Gotta love it! The bottom of the laptop claims that there are dangerous voltages inside and no user-serviceable parts.</p>
<div id="attachment_47521" style="width: 310px" class="wp-caption aligncenter"><a href="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_warning.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47521" class="wp-image-47521 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_warning.jpg" alt="toughbook_warning" width="300" height="118" /></a><p id="caption-attachment-47521" class="wp-caption-text">Uh Oh… We better not open this!</p></div>
<p>Using the laptop can be a bit difficult at first. The keyboard is small (9.2 x 4.2 inches) and can be hard to type with. It requires a good amount of force to type (somewhat more than a standard laptop), which I found pleasing. Also, the mouse is not the most responsive and has a small touch area (2 x 1.5 inches). The touchscreen is really nice for the era and helps to compensate for the mouse.</p>
<p>The display on the monitor was pretty good. It had even back-lighting and sufficient power.</p>
<p><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_front.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter wp-image-47522 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_front.jpg" alt="toughbook_front" width="600" height="176" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_front.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_front-425x124.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_front-500x146.jpg 500w" sizes="(max-width: 600px) 100vw, 600px" /></a><br />
The front panel has a metal lock that holds the lid shut. This is a two-part lock that will keep the lid closed nicely. On the left is a strong slide switch for power with a few soft buttons on the right for contrast, locks, etc..</p>
<p><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_left_side.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter wp-image-47523 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_left_side.jpg" alt="toughbook_left_side" width="600" height="212" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_left_side.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_left_side-425x150.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_left_side-500x176.jpg 500w" sizes="(max-width: 600px) 100vw, 600px" /></a><br />
The left side has a majority of the connectors. It has the power, USB, modem, ethernet, and the PC-CARD slots. Each port is covered by a rubber sealing cover, to help keep dust and water out. The stylus for the touchscreen slides into the bottom part of the screen.</p>
<p><a href="http://i2.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_right_side.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter wp-image-47524 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_right_side.jpg" alt="toughbook_right_side" width="600" height="235" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_right_side.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_right_side-425x166.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_right_side-500x195.jpg 500w" sizes="(max-width: 600px) 100vw, 600px" /></a><br />
The right side has both the battery and the hard drive. In order to open those slots you need to move the switch over and then down in two separate motions &#8230; really strong. All of these covers (also on other sides) are screwed down to the metal bottom frame.</p>
<div id="attachment_47525" style="width: 610px" class="wp-caption aligncenter"><a href="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_battery_HD.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47525" class="wp-image-47525 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_battery_HD.jpg" alt="toughbook_battery_HD" width="600" height="450" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_battery_HD.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_battery_HD-425x318.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_battery_HD-400x300.jpg 400w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47525" class="wp-caption-text">Hard drive and battery removed from slots.</p></div>
<p>The battery is a Li-ion 7.4V 7.65Ah from Matsushita Electric in Japan.</p>
<div id="attachment_47526" style="width: 610px" class="wp-caption aligncenter"><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_back.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47526" class="wp-image-47526 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_back.jpg" alt="toughbook_back" width="600" height="465" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_back.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_back-425x329.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_back-387x300.jpg 387w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47526" class="wp-caption-text">Note the strap and the clip on the right to open the strap. Nice!</p></div>
<p>The back of the laptop has speaker, microphone, VGA, serial (RS-232), and a lock port. In addition, there is a strap running across the back that can be used as a carrying handle.</p>
<p>The bottom of the laptop has a large panel that can be removed to get into the laptop, a docking port, as well as the speaker on its own plate.</p>
<p>I was wondering where the RAM was hidden since I thought that it would be considered a serviceable item. I found it under the speaker. After removing the speaker mounting plate there was a 256MB DDR PC-2700 333MHz RAM (with a label that says “FOR PANASONIC”). The speaker panel is sealed with 4 screws and some sticky foam. There is what looks like a thermal gap pad between the RAM chips and the metal of the speaker mount, possibly to help thermal dissipation. At first I was surprised to see standard crappy metal clips holding the RAM modules in, but then I saw a curved piece of metal on the speaker plate that coupled with the gap pad make sure the RAM module cannot move.</p>
<div id="attachment_47527" style="width: 610px" class="wp-caption aligncenter"><a href="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_RAM.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47527" class="wp-image-47527 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_RAM.jpg" alt="toughbook_RAM" width="600" height="450" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_RAM.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_RAM-425x318.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_RAM-400x300.jpg 400w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47527" class="wp-caption-text">RAM inside the speaker compartment.</p></div>
<p>Finally to get into the computer&#8217;s bottom I had to open 17 screws (4 of them on the speaker module). The screws all had traces of locktite on them, making it difficult to open. My fingers were really hurting after opening the first few screws. Opening the bottom plate caused the “Warranty Void” sticker in the battery compartment between the bottom and the case to come loose.</p>
<div id="attachment_47528" style="width: 610px" class="wp-caption aligncenter"><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_inside.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47528" class="wp-image-47528 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_inside.jpg" alt="toughbook_inside" width="600" height="441" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_inside.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_inside-425x312.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_inside-408x300.jpg 408w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47528" class="wp-caption-text">The cover is finally open.</p></div>
<div id="attachment_47517" style="width: 610px" class="wp-caption aligncenter"><a href="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/03/toughbook_in_slots.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-47517" class="wp-image-47517 size-full" src="http://robohub.org/wp-content/uploads/2015/03/toughbook_in_slots.jpg" alt="toughbook_in_slots" width="600" height="534" srcset="https://robohub.org/wp-content/uploads/2015/03/toughbook_in_slots.jpg 600w, https://robohub.org/wp-content/uploads/2015/03/toughbook_in_slots-425x378.jpg 425w, https://robohub.org/wp-content/uploads/2015/03/toughbook_in_slots-337x300.jpg 337w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-47517" class="wp-caption-text">Showing how battery and hard drive slide in.</p></div>
<p>I was not able to non-destructively open the top since I could not get the screws loose. Sorry about that. <img decoding="async" class="wp-smiley" src="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-includes/images/smilies/icon_sad.gif?w=600" alt=":(" data-recalc-dims="1" /></p>
<p>Doing a <a href="https://www.youtube.com/results?search_query=toughbook+torture" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">youtube search for toughbook torture</a> yields some nice videos.</p>
<p>I hope you enjoyed the pictures. If you have any field experience with the Toughbooks or have a question, please leave comments below.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Developing trust in autonomous robots: Seminar with Michael Wagner</title>
		<link>https://robohub.org/developing-trust-in-autonomous-robots-seminar-with-michael-wagner/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Fri, 06 Mar 2015 15:19:59 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[CMU]]></category>
		<category><![CDATA[human-robot interaction]]></category>
		<category><![CDATA[lectures & seminars]]></category>
		<guid isPermaLink="false">http://robohub.org/developing-trust-in-autonomous-robots-seminar-with-michael-wagner/</guid>

					<description><![CDATA[<p>Hi all I recently had the opportunity to hear a talk from a colleague that I have worked with many times over the last bunch of years. The talk was all about how to build safe and robust systems. This is a critical topic that we often pass-over but needs to be addressed if robots [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/developing-trust-autonomous-robots-seminar-michael-wagner/" data-wpel-link="external" target="_blank">Developing Trust in Autonomous Robots Seminar from Michael Wagner</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-23178" src="http://robohub.org/wp-content/uploads/2013/10/see_no_evil_mask_hand_over_eye_ethic.jpg" alt="see_no_evil_mask_hand_over_eye_ethic" width="849" height="565" srcset="https://robohub.org/wp-content/uploads/2013/10/see_no_evil_mask_hand_over_eye_ethic.jpg 849w, https://robohub.org/wp-content/uploads/2013/10/see_no_evil_mask_hand_over_eye_ethic-300x199.jpg 300w, https://robohub.org/wp-content/uploads/2013/10/see_no_evil_mask_hand_over_eye_ethic-450x300.jpg 450w" sizes="(max-width: 849px) 100vw, 849px" />I recently had the opportunity to hear a talk from a colleague that I have worked with many times over the years. The talk was all about how to build safe and robust systems &#8211; a critical topic that we often pass over, but one that needs to be addressed if robots are to enter into the workforce alongside people.<span id="more-46677"></span></p>
<p>Below are some key takeaway points from the talk (with some embellishment by me), followed by a video clip of the talk itself.</p>
<h2>Physical Safety</h2>
<ul>
<li>One way to determine how close people can be to autonomous vehicle is to look at the speed with which you can stop the vehicle, and the distance traveled in that time. When looking at the time to stop the vehicle you need to look at human reaction time, signal latencies, and mechanical stopping time of vehicle.</li>
<li><b>You can improve the above time by having an independent safety critical system onboard that evaluates safety at run-time and can stop vehicle faster than a human can.</b> I really like this idea and have taken a similar (more basic) approach in the past</li>
</ul>
<h2>Testing Motivation</h2>
<ul>
<li><a href="http://www.iec.ch/functionalsafety/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">IEC-61508</a> is a key safety standard for determining how safe a system needs to be. It provides guidance on what traits map to a given safety integrity level. However, dynamically changing parameters and AI generally make a system fall into the NOT safe categories.</li>
<li>For safety critical systems we need to look at the worst case scenarios (and not the nominal or best case).</li>
<li>We need to test, since some scenarios will violate assumptions that we did not even know that we made.</li>
<li>“No amount of experimentation can ever prove me right; a single experiment can prove me wrong” – Albert Einstein</li>
<li>Software cares about the range of the inputs and not necessarily about the duration that you run the code for. (Duration can also matter and needs to be tested for memory usage, and other unexpected parameters that will only show up after code has been running for awhile.)</li>
<li>The value of a test is not the test, but how you improve the system and learn from it</li>
</ul>
<h2>Testing Approach</h2>
<ul>
<li>Field testing is very important. Field test till errors diminish. Then simulate system for the “next million miles.”</li>
<li>The question becomes how to simulate and error check the code. One method is with <em>robustness testing, </em>which lets the software use automated methods to find the problems, so that the developers know what to fix.</li>
<li>With robustness testing you can apply random inputs to the system and see what causes it to crash or hang. This lets you simulate inputs and not just scenarios.</li>
<li>You can also probabilistically modify the real world inputs that are entering your system, and verify the outputs.</li>
<li>Use system requirements to generate safety rules that are checked in real-time. The great thing about safety rules is that if a rule ever fails, you know something is wrong, and the code/test/robot can stop.</li>
<li>You can also add a <em>dictionary test</em> on your code, where you control the inputs to see what the outputs will be. You can build a dictionary over time so that as you continue testing the system you do not reintroduce old errors that you have seen already.</li>
<li>Temporal logic is useful to create rules such as “get a message within x seconds”; as opposed to “a message must respond eventually”. Tests need to reflect that.</li>
</ul>
<h2>Things that commonly fail testing:</h2>
<ul>
<li>Improper handling of floating point numbers (out-of-bounds, NaN, infinite (inf), etc.</li>
<li>Array indexing</li>
<li>Memory issues. Leaking, too much specified, not enough specified, buffer overflows, etc.</li>
<li>Time going backwards and old/stale data (I have seen this error more times than I can remember)</li>
<li>Problems handling dynamic state</li>
</ul>
<hr />
<p>And now the part you have been waiting for:</p>
<div class=" "><iframe title="RI Seminar: Michael Wagner : Developing Trust in Autonomous Robots" width="500" height="281" src="https://www.youtube-nocookie.com/embed/0-Mw1eHafC4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<div class="divideronpost"></div>
<p><em><em>If you liked this article, you may also be interested in:</em></em></p>
<ul>
<li><a title="Programming safety into self-driving cars" href="http://robohub.org/programming-safety-into-self-driving-cars/" rel="bookmark" data-wpel-link="internal">Programming safety into self-driving cars</a></li>
<li><a title="Safety concerns for collaborative robots" href="http://robohub.org/safety-concerns-for-collaborative-robots/" rel="bookmark" data-wpel-link="internal">Safety concerns for collaborative robots</a></li>
<li><a title="ShanghAI Lectures: Weidong Chen “Enhancing Autonomy and Safety of Assistive Robots”" href="http://robohub.org/shanghai-lectures-weidong-chen-enhancing-autonomy-and-safety-of-assistive-robots/" rel="bookmark" data-wpel-link="internal">ShanghAI Lectures: Weidong Chen “Enhancing Autonomy and Safety of Assistive Robots”</a></li>
<li><a title="Quadrocopter failsafe algorithm: Recovery after propeller loss" href="http://robohub.org/quadrocopter-failsafe-algorithm-recovery-after-propeller-loss/" rel="bookmark" data-wpel-link="internal">Quadrocopter failsafe algorithm: Recovery after propeller loss</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a href="http://eepurl.com/t-UEf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Selecting a camera and lens for your robot</title>
		<link>https://robohub.org/selecting-a-camera-and-lens-for-your-robot/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Thu, 26 Feb 2015 20:38:15 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Vision]]></category>
		<guid isPermaLink="false">http://robohub.org/selecting-a-camera-and-lens-for-your-robot/</guid>

					<description><![CDATA[<p>Choosing a camera can be confusing. It is important to determine your requirements and then figure out how to achieve that between the camera and the optics. The first thing that most people talk about is resolution. The classic resolution of a camera is based on pixels; such as 600 pixels x 400 pixels. The [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/camera-lens-selection/" data-wpel-link="external" target="_blank">Camera &#38; Lens Selection</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_46597" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-46597" class="wp-image-46597 size-large" src="http://robohub.org/wp-content/uploads/2015/02/ids_usb3-1024x640.jpg" alt="IDS Imaging Development Systems - USB3 Vision industrial cameras" width="1024" height="640" srcset="https://robohub.org/wp-content/uploads/2015/02/ids_usb3-1024x640.jpg 1024w, https://robohub.org/wp-content/uploads/2015/02/ids_usb3-425x265.jpg 425w, https://robohub.org/wp-content/uploads/2015/02/ids_usb3-479x300.jpg 479w, https://robohub.org/wp-content/uploads/2015/02/ids_usb3.jpg 1100w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-46597" class="wp-caption-text">IDS Imaging Development Systems &#8211; USB3 Vision industrial cameras</p></div>
<p>Choosing a camera can be confusing. It is important to determine your requirements, and then figure out how these can be achieved between the camera and the optics.<span id="more-46116"></span></p>
<p>The first thing that most people talk about is <b>resolution</b>. The classic resolution of a camera is based on pixels (e.g.600 pixels x 400 pixels). The other type of resolution we must talk about is the <b>spatial resolution</b>. The spatial resolution is how close the pixels are to each other; or how many pixels-per-inch (ppi) is on the sensor. In practice it is the spatial resolution that really controls how an image will look. Sometimes the spatial resolution is measured in micrometers. When we use a lens on the camera, this effective resolution can change.</p>
<p>After determining the resolution requirements you should look at the <strong>focal length</strong>. The focal length you choose depends on what zoom level you need. A larger focal length (such as 200) will be zoomed in, a focal length of 30-50 is about what we see with our eyes, and a smaller focal length (such as 10) will be zoomed out and you will see a larger picture (lenses with small focal lengths are often called a wide-angle lenses). An extreme example of a small focal length is a fish-eye lens that can see around 180° (with a fairly distorted image). If the focal length is specified as a range, it is probably an adjustable zoom lens.<br />
<a href="http://www.nikonusa.com/en/Learn-And-Explore/Article/g3cu6o2o/understanding-focal-length.html#!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter size-full wp-image-3794" src="http://i1.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/02/focal_length_nikon.jpg?resize=600%2C404" alt="focal length sequence" data-recalc-dims="1" /></a></p>
<p>The next thing to look at is the <b>Maximum Aperture</b> or <b>f number</b>. The f number is often specified as f/2.8 or F2.8. The larger the number, the less light that can enter into the aperture. If you need to take images in a low light condition you will want a small f number to avoid needing external lighting of the scene. The smaller the f number, the shallower the <b>depth of field</b> will be. The depth of field is the part of the image that appears in focus (and sharp).</p>
<div id="attachment_3793" style="width: 330px" class="wp-caption alignleft"><a href="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/02/320px-Aperture_diagram_wikipedia.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" aria-describedby="caption-attachment-3793" class="wp-image-3793 size-full" src="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/02/320px-Aperture_diagram_wikipedia.png?resize=320%2C127" alt="f numbers and aperture size" width="320" height="127" data-recalc-dims="1" /></a><p id="caption-attachment-3793" class="wp-caption-text">F-numbers. Each step is allows half the light as the preceding step.</p></div>
<p>Arguably this should have been mentioned first, but you will also need to look at the <b>Field of View</b> or <b>FOV</b>. The FOV is the angular measurement window that can be seen by the lens. The FOV is usually specified with two numbers, such as 60° X 90°. In this case 60° is the horizontal FOV and 90° is the vertical FOV. Sometimes instead of giving 2 numbers people will just specify 1 number based on the diagonal. FOV can be related to the focal length of the lens.</p>
<p>We can compute the FOV by knowing the size of the camera imaging array (ie CCD) from the datasheet and the focal length of the lens.</p>
<div class="minitext" style="border: 2px solid #ccc; padding: 10px; color: #000;">
<img decoding="async" class="latex" title="FOV = 2 \, * \, arctan (\frac{CCD\, size}{focal\, length\, of\, lens})" src="http://s0.wp.com/latex.php?latex=FOV+%3D+2+%5C%2C+%2A+%5C%2C+arctan+%28%5Cfrac%7BCCD%5C%2C+size%7D%7Bfocal%5C%2C+length%5C%2C+of%5C%2C+lens%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="FOV = 2 \, * \, arctan (\frac{CCD\, size}{focal\, length\, of\, lens})" />
<p>So for a 36 X 24mm sensor size and a focal length of 50mm, we can get the following camera FOV’s:</p>
<p><img decoding="async" class="latex" title="X \,direction \,FOV:\, 39.6 = 2 \, * \, arctan (\frac{36}{50})" src="http://s0.wp.com/latex.php?latex=X+%5C%2Cdirection+%5C%2CFOV%3A%5C%2C+39.6+%3D+2+%5C%2C+%2A+%5C%2C+arctan+%28%5Cfrac%7B36%7D%7B50%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="X \,direction \,FOV:\, 39.6 = 2 \, * \, arctan (\frac{36}{50})" /><br />
<img decoding="async" class="latex" title="Y\, direction\, FOV:\, 27 = 2\, * \, arctan (\frac{24}{50})" src="http://s0.wp.com/latex.php?latex=Y%5C%2C+direction%5C%2C+FOV%3A%5C%2C+27+%3D+2%5C%2C+%2A+%5C%2C+arctan+%28%5Cfrac%7B24%7D%7B50%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Y\, direction\, FOV:\, 27 = 2\, * \, arctan (\frac{24}{50})" /></p>
</div>
<p>To calculate the image (or camera) resolution required based on a specific lens FOV to detect a certain size obstacle there is a simple equation.</p>
<div class="minitext" style="border: 2px solid #ccc; padding: 10px; color: #000;">
<img decoding="async" class="latex" title="Sensor\, Resolution = Image\, Resolution = 2 \,*\, \frac{Viewing\, Area}{Smallest\, Feature} " src="http://s0.wp.com/latex.php?latex=Sensor%5C%2C+Resolution+%3D+Image%5C%2C+Resolution+%3D+2+%5C%2C%2A%5C%2C+%5Cfrac%7BViewing%5C%2C+Area%7D%7BSmallest%5C%2C+Feature%7D+&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Sensor\, Resolution = Image\, Resolution = 2 \,*\, \frac{Viewing\, Area}{Smallest\, Feature} " />
</div>
<p>So for example if your lens has a FOV of 60°x90°, the working distance from the sensor (ie where the camera hits the target) is 2meters away, and the smallest obstacle that you need to be able to detect (with a minimum of 2 pixels on it) is 0.01meters:</p>
<div class="minitext" style="border: 2px solid #ccc; padding: 10px; color: #000;">
<p>First we need the size of the area viewed, on the plane at the working distance in each direction. Simply put, based on the FOV angle and a distance what is the length of the side opposite the lens.</p>
<p><img decoding="async" class="latex" title="Viewing\, Area = 2 \,*\, working \,distance \,*\, tan(\frac{FOV}{2})" src="http://s0.wp.com/latex.php?latex=Viewing%5C%2C+Area+%3D+2+%5C%2C%2A%5C%2C+working+%5C%2Cdistance+%5C%2C%2A%5C%2C+tan%28%5Cfrac%7BFOV%7D%7B2%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Viewing\, Area = 2 \,*\, working \,distance \,*\, tan(\frac{FOV}{2})" /><br />
<img decoding="async" class="latex" title="X\, direction\, viewing \,area: 2.3m = 2 \,*\, 2m \,*\, tan(\frac{60}{2})" src="http://s0.wp.com/latex.php?latex=X%5C%2C+direction%5C%2C+viewing+%5C%2Carea%3A+2.3m+%3D+2+%5C%2C%2A%5C%2C+2m+%5C%2C%2A%5C%2C+tan%28%5Cfrac%7B60%7D%7B2%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="X\, direction\, viewing \,area: 2.3m = 2 \,*\, 2m \,*\, tan(\frac{60}{2})" /><br />
<img decoding="async" class="latex" title="Y\, direction\, viewing\, area: 4m = 2 \,*\, 2m \,*\, tan(\frac{90}{2})" src="http://s0.wp.com/latex.php?latex=Y%5C%2C+direction%5C%2C+viewing%5C%2C+area%3A+4m+%3D+2+%5C%2C%2A%5C%2C+2m+%5C%2C%2A%5C%2C+tan%28%5Cfrac%7B90%7D%7B2%7D%29&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Y\, direction\, viewing\, area: 4m = 2 \,*\, 2m \,*\, tan(\frac{90}{2})" /></p>
<p>Now that we know the viewing area on our working plane, we can compute the sensor resolution:</p>
<p><img decoding="async" class="latex" title="Sensor\, Resolution = Image\, Resolution = 2 \,X\, \frac{Viewing\, Area}{Smallest\, Feature} " src="http://s0.wp.com/latex.php?latex=Sensor%5C%2C+Resolution+%3D+Image%5C%2C+Resolution+%3D+2+%5C%2CX%5C%2C+%5Cfrac%7BViewing%5C%2C+Area%7D%7BSmallest%5C%2C+Feature%7D+&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Sensor\, Resolution = Image\, Resolution = 2 \,X\, \frac{Viewing\, Area}{Smallest\, Feature} " /><br />
<img decoding="async" class="latex" title="X\, direction\, sensor\, resolution\, required:\, 460 = 2 \,*\, \frac{2.3m}{0.01m} " src="http://s0.wp.com/latex.php?latex=X%5C%2C+direction%5C%2C+sensor%5C%2C+resolution%5C%2C+required%3A%5C%2C+460+%3D+2+%5C%2C%2A%5C%2C+%5Cfrac%7B2.3m%7D%7B0.01m%7D+&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="X\, direction\, sensor\, resolution\, required:\, 460 = 2 \,*\, \frac{2.3m}{0.01m} " /><br />
<img decoding="async" class="latex" title="Y\, direction\, sensor\, resolution\, required:\, 800 = 2 \,*\, \frac{4m}{0.01m} " src="http://s0.wp.com/latex.php?latex=Y%5C%2C+direction%5C%2C+sensor%5C%2C+resolution%5C%2C+required%3A%5C%2C+800+%3D+2+%5C%2C%2A%5C%2C+%5Cfrac%7B4m%7D%7B0.01m%7D+&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Y\, direction\, sensor\, resolution\, required:\, 800 = 2 \,*\, \frac{4m}{0.01m} " /></p>
</div>
<p>So we now know that when we choose a camera it must have a minimum resolution of 460 X 800 to meet the requirement of seeing a 0.01m item from 2m away.</p>
<p>We can also look at the working distance and how that affects other camera/lens parameters.</p>
<div class="minitext" style="border: 2px solid #ccc; padding: 10px; color: #000;">
<img decoding="async" class="latex" title="Focal\, Length \,*\, Viewing\, Area = Sensor\, Size \,*\, Working\, Distance" src="http://s0.wp.com/latex.php?latex=Focal%5C%2C+Length+%5C%2C%2A%5C%2C+Viewing%5C%2C+Area+%3D+Sensor%5C%2C+Size+%5C%2C%2A%5C%2C+Working%5C%2C+Distance&amp;bg=ffffff&amp;%23038;fg=000&amp;%23038;s=0" alt="Focal\, Length \,*\, Viewing\, Area = Sensor\, Size \,*\, Working\, Distance" />
</div>
<p>In many cases the focal length and the sensor size are fixed. So we can then look at how changing the viewing area or changing the working distance affects each other. On other cameras the focal length is adjustable and we can also look at how changing that affects the other parameters.</p>
<div id="attachment_46601" style="width: 710px" class="wp-caption alignleft"><img decoding="async" aria-describedby="caption-attachment-46601" class="wp-image-46601 size-full" src="http://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia.jpg" alt="vignetting_wikipedia" width="700" height="705" srcset="https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia.jpg 700w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-421x425.jpg 421w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-100x100.jpg 100w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-297x300.jpg 297w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-32x32.jpg 32w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-64x64.jpg 64w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-96x96.jpg 96w, https://robohub.org/wp-content/uploads/2015/02/vignetting_wikipedia-128x128.jpg 128w" sizes="(max-width: 700px) 100vw, 700px" /><p id="caption-attachment-46601" class="wp-caption-text">Note the vignetting at the corners of the image.</p></div>
<p>With all lenses, and particularly with cheaper (&lt;$150) lenses, distortion and vignetting can be a big problem. Common distortion modes are where the X or Y axis appears to no longer be straight and perpendicular with each other (rectilinear). Often you will see an image look wavy or bulging. With vignetting the edges and particularly the corners become darkened. You can often reverse the effects of warping by using a <a href="http://en.wikipedia.org/wiki/Image_rectification" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">homography for image rectification</a>.</p>
<p>With any lens and camera system you need to check the mount types. There are many different styles for mounting a lens to a camera. Wikipedia has a long list of mounts that can be found <a href="http://en.wikipedia.org/wiki/Lens_mount" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">here</a>. The most common mount that I have seen for computer vision cameras (ie. no viewfinder and designed for machine vision applications) is the <b>C</b> mount. Choose a lens that you can lock into place. Not only should you be able to lock the lens into place you should be able to lock any rotating knobs into place (such as for zoom and focus). This is usually accomplished with set screws. I am not that familiar with them but I will note that there are many different filters that can be attached to your lens for things such as polarization and blocking certain parts of the spectrum (such as IR). Your iPhone camera typically has a built in IR filter in the lens to remove IR components from your images.</p>
<div class=" "><iframe title="Understanding Camera Mounting Interfaces" width="500" height="281" src="https://www.youtube-nocookie.com/embed/QlSULbRSai8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>Another semi-obvious thing to look into is whether you need a black and white (often expressed as B&amp;W, BW, or B/W) or color camera. In many cases B/W cameras will be easier for your algorithms to process. However having color can give you more channels for humans to look at and for algorithms to learn from. In addition to black and white, there are hyper spectral cameras that let you see various frequency bands. Some of the common spectral ranges that you might want are ultra-violet (UV), near-infrared (NIR), visible near-infrared (VisNIR), and infrared (IR). You will also want to pay attention to the <b>Dynamic Range</b> of the camera. The larger the dynamic range, the greater the light difference that can be handled within an image. If the robot is operating outdoors in sun and shade you might want to consider a <b>high dynamic range (HDR)</b> camera.</p>
<img decoding="async" class="aligncenter size-large wp-image-3799" src="http://i0.wp.com/robotsforroboticists.com/wordpress/wp-content/uploads/2015/02/EM_spectrum_wikipedia.png" alt="light spectrum" data-recalc-dims="1" />
<p>You will also want to consider the interface you have to the camera &#8211; both the electrical and software interface. On the electrical side, the common camera protocols are camera-link, USB2.0, USB3, firewire (IEEE1394), and gigabit ethernet (GigE). GigE cameras are nice since they just plug into an ethernet port making wiring easy. Many of them can use power-over-ethernet (PoE) so the power goes over the ethernet cable and you only have one cable to run. The downside of GigE is the latency and non deterministic nature of ethernet. The other interfaces might be better if latency is a problem. Also, you generally can only send full video over GigE with a wired connection, and not from a wireless connection. This is because you need to set the ethernet port to use jumbo packets, which can not be done on a standard wireless connection. Probably the most common reason I see GigE cameras not working properly is that the ethernet port on the computer is not configured for jumbo packets. For software, you want to make sure that your camera has an SDK that will be easy for you to use. If you are using ROS or OpenCV, you will want to verify that the drivers are good. You will also want to check what format the image is supplied back to you from the camera: will it be a <a href="http://en.wikipedia.org/wiki/Raw_image_format" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">raw image format</a>? or will it be a file format such as png of jpg?</p>
<p>If you are doing stereo vision, you want to make sure the cameras have a <b>triggering</b> method, so that when you issue an image capture command you get images from both cameras simultaneously. The triggering can be in software or hardware, but hardware is typically better and faster. If you are having problems with your stereo algorithm this can be the source of the problem, especially if you are moving fast.</p>
<p>Finally, if you are looking for video, you also need to look out for the <b>Frame Rate</b> typically specified in <b>Frames per Second (fps)</b>. This refers to how many images the camera can take in a second. We can then call that sequence of images a video.</p>
<p>Hope this helps. If you have camera experiences you would like to share &#8211; especially related to good/bad SDKs and what works/doesn&#8217;t-work with ROS &#8211; please share in the comments below.</p>
<div class="divideronpost"></div>
<p>While writing this post I saw <a href="http://en.wikipedia.org/wiki/Machine_vision" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><span class="s1">Wikipedia</span></a> said “MV is related to, though distinct from, computer vision.” This surprised me as I always viewed machine vision and computer vision to be similar fields, just different terms used in different industries. So I followed the references and found an interesting article from <i>Bruce Batchelor</i> <a href="http://ece631web.groups.et.byu.net/References/Machine-Computer%20Vision.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><span class="s1">here</span></a>. After reading his article I am still not sure if I agree. I think there are people who are theorists that only care about the vision aspects, there are integrator’s who only care about the system and don’t know much about the vision aspects. However there is also a large segment in the middle, such as roboticists, that care about both sides of the problem. Working in robotics you need to care about the real world applications while also understanding the vision problems and develop new vision methods and techniques.</p>
<p>As roboticists are we doing both? are we only doing computer vision? only machine vision? What do you think? Leave your comments below.</p>
<div class="divideronpost"></div>
<p>For optics and some good technical notes you can visit <a href="http://www.edmundoptics.com/technical-resources-center/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><span class="s1">Edmund Optics</span></a>. They have a large supply of everything optics related.</p>
<div class="divideronpost"></div>
<p>Sources:</p>
<ul>
<li><a href="http://www.gizmag.com/camera-lens-buying-guide/29141/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://www.gizmag.com/camera-lens-buying-guide/29141/</a></li>
<li><a href="http://vitaleartconservation.com/PDF/affects_of_lens_quality_on_image_resolution_v3a_draft.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://vitaleartconservation.com/PDF/affects_of_lens_quality_on_image_resolution_v3a_draft.pdf</a></li>
<li><a href="http://www.gizmag.com/camera-lens-buying-guide/29141/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://www.gizmag.com/camera-lens-buying-guide/29141/</a></li>
<li><a href="http://digital.ni.com/public.nsf/allkb/1948AE3264ECF42E86257D00007305D5" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://digital.ni.com/public.nsf/allkb/1948AE3264ECF42E86257D00007305D5</a></li>
<li><a href="http://www.nikonusa.com/en/Learn-And-Explore/Article/g3cu6o2o/understanding-focal-length.html#!" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://www.nikonusa.com/en/Learn-And-Explore/Article/g3cu6o2o/understanding-focal-length.html#!</a></li>
<li><a href="http://en.wikipedia.org/wiki/Angle_of_view" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://en.wikipedia.org/wiki/Angle_of_view</a></li>
</ul>
<div class="divideronpost"></div>
<p><em><em>If you liked this article, you may also be interested in:</em></em></p>
<ul>
<li><a title="Permanent Link: Things to think about when transporting your robot" href="http://robohub.org/things-to-think-about-when-transporting-your-robot/" rel="bookmark" data-wpel-link="internal">Things to think about when transporting your robot</a></li>
<li><a title="Permanent Link: Controlling a brushless DC motor with no encoders" href="http://robohub.org/controlling-a-brushless-dc-motor-with-no-encoders/" rel="bookmark" data-wpel-link="internal">Controlling a brushless DC motor with no encoders</a></li>
<li><a title="UMich team works on perception and localization using cameras" href="http://robohub.org/umich-team-works-on-perception-and-localization-using-cameras/" rel="bookmark" data-wpel-link="internal">UMich team works on perception and localization using cameras</a></li>
<li><a title="Multi-viewpoint robotic camera system creates real ‘bullet time’ slow motion replays" href="http://robohub.org/multi-viewpoint-robotic-camera-system-creates-real-bullet-time-slow-motion-replays/" rel="bookmark" data-wpel-link="internal">Multi-viewpoint robotic camera system creates real ‘bullet time’ slow motion replays</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a href="http://eepurl.com/t-UEf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Things to think about when transporting your robot</title>
		<link>https://robohub.org/things-to-think-about-when-transporting-your-robot/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Thu, 05 Feb 2015 19:20:42 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/things-to-think-about-when-transporting-your-robot/</guid>

					<description><![CDATA[<p>Throughout my career I have had to ship different robots to different locations around the world. Here is a little bit about what I have learnt about transportation. The 3 basic ways for a robot to travel are by land, by air, and by sea. Typically by truck (I guess there are also trains, but [&#8230;]</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/transporting-robot/" data-wpel-link="external" target="_blank">Transporting your Robot</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://robotsforroboticists.com/" data-wpel-link="external" target="_blank">Robots For Roboticists</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="attachment_45590" style="width: 810px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-45590" class="size-full wp-image-45590" src="http://robohub.org/wp-content/uploads/2015/01/Shipping_Containers_at_the_terminal_at_Port_Elizabeth_New_Jersey_-_NOAA.jpg" alt="Source: Wikipedia." width="800" height="533" srcset="https://robohub.org/wp-content/uploads/2015/01/Shipping_Containers_at_the_terminal_at_Port_Elizabeth_New_Jersey_-_NOAA.jpg 800w, https://robohub.org/wp-content/uploads/2015/01/Shipping_Containers_at_the_terminal_at_Port_Elizabeth_New_Jersey_-_NOAA-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2015/01/Shipping_Containers_at_the_terminal_at_Port_Elizabeth_New_Jersey_-_NOAA-450x300.jpg 450w" sizes="(max-width: 800px) 100vw, 800px" /><p id="caption-attachment-45590" class="wp-caption-text">Source: Wikipedia.</p></div>
<p>Throughout my career I have had to ship various robots to different locations around the world. Here is a little bit about what I have learned about transporting robots.<span id="more-45517"></span></p>
<p>The three basic ways for a robot to travel are by land, by air, and by sea.</p>
<p>Typically, shipping over land is the easiest option. You can find a trucking company (or train, though I have never used one) that will transport your robot. When you get a truck you can sometimes get a partial truck where you are given a certain volume to use, or you can get a full truck where the entire truck is dedicated to your payload. The nice thing with a truck is you provide them with a time, date, and location, and the driver will bring your stuff to you. Ground transportation generally is the least restrictive. You will need to follow Department of Transportation (DOT) restrictions (and other rules) for things such as max width and height of your load.</p>
<p>Transporting by air is good when you need to get something somewhere fast. This is especially true when you need to cross oceans. The downside is that this is also an expensive way to travel. Putting a large robot with support equipment on a plane can be pricey. You are also limited in what you can put on the plane &#8230; an airline might refuse to ship a gas/petrol powered robot or lithium batteries, for example.</p>
<p>Shipping by sea is a nice way to transport your robot across oceans (or long distances around a coast) if you have lots of time on your hands … Sending a shipping container (which is easy to pack, almost like a truck) from the North America to South America by boat can take an easy month. A big benefit is that you can ship lithium batteries across oceans this way. And shipping by sea is often cheaper than doing so by land or by air.</p>
<p>Often you will need multiple shipping companies. For example, you might have: a local truck to the port, the ship/boat company, a truck from the destination port to a large city, and then another smaller truck to your location. There are shipping agents that can help you arrange all of that. Also, for smaller robots (where small is relative) don’t forget about UPS and FedEx to ship your freight. You can look in your local yellow pages or on Google to find shipping companies and shipping agents near you.</p>
<h2>Types of Trucks</h2>
<p>When you are planning to ship by truck, you will need to consider the different types of trucks to choose from. Within each of these types there are also different lengths of trucks that you can request. You should be aware that truck drivers will usually want to inspect the loads to make sure they are secure. With many types of trucks, the truck driver will be the one that secures the load, and not you. When you have a truck come to your loading area, you should find out in advance how long it is to make sure the truck will be able to drive in and out of your area.</p>
<div class="divideronpost"></div>
<p><b>Pickup + Trailer</b> – This is just a standard pickup truck that you can also get a trailer to tow behind it. This is the smallest and simplest type of truck mentioned here.</p>
<div class="divideronpost"></div>
<p><b>Tow Truck</b> – These are the standard trucks that haul cars. It is easy and inexpensive to get a local tow truck and driver to help you move a robot. You will usually want to request a tow truck with a flat-bed and not one that drags a car behind it. Keep in mind that the driver from the tow company will be the one operating/driving the truck, and that the truck will usually have an open top, so your cargo will not be protected from the elements.</p>
<div class="divideronpost"></div>
<div id="attachment_45693" style="width: 435px" class="wp-caption alignleft"><img decoding="async" aria-describedby="caption-attachment-45693" class="size-medium wp-image-45693" src="http://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-425x425.jpg" alt="Box truck. Source: Wikipedia" width="425" height="425" srcset="https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-425x425.jpg 425w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-290x290.jpg 290w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-100x100.jpg 100w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-220x220.jpg 220w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-300x300.jpg 300w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-32x32.jpg 32w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-64x64.jpg 64w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-96x96.jpg 96w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia-128x128.jpg 128w, https://robohub.org/wp-content/uploads/2015/01/boxtruck_wikipedia.jpg 512w" sizes="(max-width: 425px) 100vw, 425px" /><p id="caption-attachment-45693" class="wp-caption-text">Box truck. Source: Wikipedia</p></div>
<p><b>Panel Truck or Box Truck</b> – This is another easy to get truck. You have probably seen large versions of these trucks on the highway, or smaller versions in the city; they have a metal box in the back for transporting goods.</p>
<p>The small and medium sized versions of these trucks are easy to rent and you can drive them your self (as opposed to getting a truck with a driver). This is the type of truck I use most because I can rent and use them on my own schedule.</p>
<div class="divideronpost"></div>
<div id="attachment_45694" style="width: 410px" class="wp-caption alignleft"><img decoding="async" aria-describedby="caption-attachment-45694" class="size-full wp-image-45694" src="http://robohub.org/wp-content/uploads/2015/01/flatbed_wikipedia.jpg" alt="Flatbed truck. Source: Wikipedia" width="400" height="297" /><p id="caption-attachment-45694" class="wp-caption-text">Flatbed truck. Source: Wikipedia</p></div>
<p><b>Flat Bed</b> – A flat-bed is a truck has a flat platform instead of a box. These are good for carrying large loads and being able to get a forklift in from all sides. The downside is that your robot is not protected from the elements and is exposed (but of course you can use a tarp).</p>
<div class="divideronpost"></div>
<div id="attachment_45692" style="width: 435px" class="wp-caption alignleft"><img decoding="async" aria-describedby="caption-attachment-45692" class="size-medium wp-image-45692" src="http://robohub.org/wp-content/uploads/2015/01/lowboy_wikipedia-425x195.jpg" alt="Low Boy truck. Source: Wikipedia" width="425" height="195" srcset="https://robohub.org/wp-content/uploads/2015/01/lowboy_wikipedia-425x195.jpg 425w, https://robohub.org/wp-content/uploads/2015/01/lowboy_wikipedia-500x230.jpg 500w, https://robohub.org/wp-content/uploads/2015/01/lowboy_wikipedia.jpg 1000w" sizes="(max-width: 425px) 100vw, 425px" /><p id="caption-attachment-45692" class="wp-caption-text">Low Boy truck. Source: Wikipedia</p></div>
<p><b>Low Boy</b> – The carrying surface of a Low Boy truck is close to the ground, and it offers better clearance when transporting tall/large payloads. Low Boys can come apart in various ways that allow you to drive a robot onto them.</p>
<div class="divideronpost"></div>
<p><strong>Tip</strong></p>
<p>When doing a roundtrip shipment, a truck driver might hang around town waiting for you, and may try to get a few local hauls while waiting. It can often be helpful to pay the driver a little extra for them to help you in the field, even with non-trucking tasks. Many of the truckers I have met are good at solving field logistic issues and improvising to fix mechanical items. We have even asked truck drivers to help record video!</p>
<h2>Crates</h2>
<p>A good crate can make all the difference when shipping items. You generally want a crate that is elevated by multiple blocks so that it can be lifted by a pallet jack (or fork lift) from any of its sides. A common mistake people make is to build a crate with just a few slats that only allow forks to enter from one side.</p>
<p>When you build your crate, you will want to use stamped wood that is certified to be pest free so that countries will allow your wood/crate across their borders. There are many places (such as Hawaii’s Dept. of Agriculture) that will insist on inspecting the crate for foreign infestations.</p>
<p>You will also want to think about how to seal the crate. For this, there are various methods ranging from screws to latches, clips and climps. Ask yourself if you will have access to tools at your destination, or if will they all be in the crate that you need to open. Using climps or latches can be an easy way to secure a crate shut; these can be bought online from packaging and shipping suppliers.</p>
<div class=" "><iframe title="Climp installation demo" width="500" height="375" src="https://www.youtube-nocookie.com/embed/aDrIAn24c_s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>There are professional crate makers that can do a beautiful job building crates. They often build crates for companies that ship to exhibits, and can help walk you through exactly what you need and make a crate that fits your robot perfectly. They will also have different supplies you can purchase, such as stamped wood for international shipping, foam sheets, various ways to seal the crate, and ways to secure your load in the crates.</p>
<p>Once your robot is in its crate, you will want to tie it down so that it is secure. I will often use wheel chocks or 2×4 lumber to help hold a robot&#8217;s wheels in place, and then use some screw-in eye bolts to help tie the rest of the robot down. Heavy items like batteries can often be removed from the robot and secured to the base of the crate. This will help prevent a heavy battery from coming loose inside your robot.</p>
<p>You may also want to label all sides of your crate &#8220;FRAGILE&#8221; and note the direction that the crate should face (&#8220;THIS SIDE UP&#8221;).</p>
<h2>Batteries in the Air</h2>
<p>If you plan on shipping batteries by air (especially lithium-ion) you need to plan in advance, because airlines are concerned about batteries exploding and catching on fire mid-flight.</p>
<p>If you built your own battery pack, then you have little chance of getting it approved to fly. It is possible to get prototype batteries certified to fly, but it is not easy or fun. If each cell or individual battery is certified to fly you might be able to take your pack apart and then ship it. If you have batteries that are safe to fly, you should attach documentation directly to the battery pack so that anyone inspecting has proof of their safety.</p>
<h2>International Shipping</h2>
<p>Shipping your robot internationally can be complicated. You may want to work with a shipping agent that has experience in international shipping. You will need to generate your manifest weeks or months in advance so that it can be approved &#8211; this will minimize problems with customs and shipping. Taxes and regulations vary from country to country.</p>
<p>There is something called a <em>carnet </em>that allows you to declare that the items you are bringing into a country will be taken back out with you when you leave. A carnet can help you to get through customs and avoid paying taxes. The downside is that it costs money to prepare the carnet. They are also not foolproof: once I tried to use a carnet to get my robot through customs at the airport and none of the officials there knew what it was &#8230; it took lots of people lots of time to figure it out.</p>
<p>If you want to avoid packing your robot, you should build flying robots! Just don&#8217;t let the FAA find out! (Note: For everyone who did not figure it out my bad attempt at humor. I do not endorse tricking the FAA.)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Controlling a brushless DC motor with no encoders</title>
		<link>https://robohub.org/controlling-a-brushless-dc-motor-with-no-encoders/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Mon, 05 Jan 2015 21:33:16 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<guid isPermaLink="false">http://robohub.org/controlling-a-brushless-dc-motor-with-no-encoders/</guid>

					<description><![CDATA[This is just a quick post on controlling DC brushless motors with no encoders. This post applies to brushless motors that typically use hall sensors for commutation. This post does not apply to the hall-less ESC (electronic speed control) motors that typically run at very high speeds and are used for things such as quadcopters [&#8230;]]]></description>
										<content:encoded><![CDATA[<img decoding="async" src="http://robohub.org/wp-content/uploads/2015/01/copley_CME_2_autoPhaseHallConfig.jpg" alt="copley_CME_2_autoPhaseHallConfig" width="489" height="400" class="aligncenter size-full wp-image-44462" srcset="https://robohub.org/wp-content/uploads/2015/01/copley_CME_2_autoPhaseHallConfig.jpg 489w, https://robohub.org/wp-content/uploads/2015/01/copley_CME_2_autoPhaseHallConfig-425x347.jpg 425w, https://robohub.org/wp-content/uploads/2015/01/copley_CME_2_autoPhaseHallConfig-366x300.jpg 366w" sizes="(max-width: 489px) 100vw, 489px" />
<p>This is just a quick post on controlling DC brushless motors with no <a href="http://robotsforroboticists.com/incremental-encoder-selection" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">encoders</a>. This post applies to brushless motors that typically use hall sensors for commutation. <span id="more-44461"></span>This post does not apply to the hall-less <a href="http://en.wikipedia.org/wiki/Electronic_speed_control" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ESC (electronic speed control)</a> motors that typically run at very high speeds and are used for things such as quadcopters and boats.</p>
<p>To go back to basics, brushless motors have three phases (typically) that need to be commutated. The motor controller typically knows how to commutate the motor by having a hall effect sensor on each of the three phases. The problem is, when starting from a stop (no motion) or when operating at “slow” speeds, the controller does not have all of the information it needs to optimally commutate the motor. To get that added information the controller wants to use an encoder for the higher resolution. Using the encoder, the motor controller can now know exactly where the motor is for better control. This means a few things:</p>
<ul>
<li>The motor can spin a little and figure out how to commutate without waiting for the 3 hall effect sensors to change. This improves the starting of motion.</li>
<li>The controller can know the precise position so that it can servo on a position and not jerk/move as it tries to hold a position.</li>
<li>You can now do position control.</li>
<li>The commutation and torque/speed profiles are more efficient since the controller has position feedback and can do sinusoidal commutation instead of the more basic trapezoidal commutation.</li>
</ul>
<p>So you are now in a position where you have just the halls and no encoder. What can you do about it:</p>
<ol>
<li>Only operate at high speeds so that the hall sensors are sufficient for speed control (you might still have a high variability in your speed based on applied load).</li>
<li>You will need to tune the <a href="http://robotsforroboticists.com/pid-control/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PID (or PI or PD) filter</a> more than normally. The PID constants will often need to be much higher (I have seen 1000 times higher) to compensate for disturbances in the motor. You will probably also need the higher gains to help the motor start to spin.</li>
<li>This is a bit of a hack but on most hall sensors (assuming it can source enough current) you can tie two of the halls to the quadrature encoder inputs on the motor controller to get a rough uneven position control. That can also respond to changing loads.</li>
<li>Instead of issuing a “servo here” command to hold a position, you will probably need to disable motion (cut off power to motor). If you are in an application where backdriving a motor is fine or where your gearing provides sufficient holding torque this could be ok.</li>
</ol>
<p>When you are purchasing your motor controller you should check if it can support hall based feedback only. Some controllers do better than others at handling the lack of encoder feedback.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Incremental encoder selection</title>
		<link>https://robohub.org/incremental-encoder-selection/</link>
		
		<dc:creator><![CDATA[Robots for Roboticists]]></dc:creator>
		<pubDate>Mon, 22 Dec 2014 18:31:47 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://robohub.org/incremental-encoder-selection/</guid>

					<description><![CDATA[We would like to welcome our newest Robohub contributor, David Kohanbash, whose blog &#8211; Robots for Roboticists &#8211; covers a broad range of technical topics that is sure to interest makers and practitioners. We hope you enjoy! Incremental encoders are good for speed control and can be used for position control when we have a homing routine [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="attachment_44222" style="width: 930px" class="wp-caption alignnone"><img decoding="async" aria-describedby="caption-attachment-44222" class="size-full wp-image-44222" src="http://robohub.org/wp-content/uploads/2014/12/quadrature_franksworkshop_x.png" alt="www.franksworkshop.com.au/Electronics/Photoplotter/Photoplotter.htm" width="920" height="400" srcset="https://robohub.org/wp-content/uploads/2014/12/quadrature_franksworkshop_x.png 920w, https://robohub.org/wp-content/uploads/2014/12/quadrature_franksworkshop_x-425x184.png 425w, https://robohub.org/wp-content/uploads/2014/12/quadrature_franksworkshop_x-500x217.png 500w" sizes="(max-width: 920px) 100vw, 920px" /><p id="caption-attachment-44222" class="wp-caption-text">www.franksworkshop.com.au/Electronics/Photoplotter/Photoplotter.htm</p></div>
<p><i>We would like to welcome our newest Robohub contributor, David Kohanbash, whose blog &#8211; Robots for Roboticists &#8211; covers a broad range of technical topics that is sure to interest makers and practitioners. We hope you enjoy!</i></p>
<p>Incremental encoders are good for speed control and can be used for position control when we have a homing routine to get absolute position, or the system is constrained to less than one rotation. <span id="more-44214"></span>One way an incremental encoder can also be an absolute encoder is if it is single turn. Usually an encoder on the back-shaft of a motor will be multi-turn, however if you have the encoder on the output shaft (or if it is a secondary position encoder) it can be single-turn.</p>
<p>Throughout this post I am focusing on digital/analog optical quadrature encoders. While there are other types of incremental encoders (with all sorts of fancy output options) these are probably the most common. These come as a standard option for many motors as well as in kits that you can snap onto a motor.</p>
<p>Quadrature encoders have at minimum 4 wires:<br />
– Power (often +5V)<br />
– Ground<br />
– A+<br />
– B+</p>
<p>A+ and B+ are the signal lines that generate the pulses that we use for determining position. There are several other signal lines that are often seen with encoders:<br />
– I+ (or sometimes Z+)<br />
– I- (or sometimes Z-)<br />
– A-<br />
– B-</p>
<p>I+ is known as the index pulse. For every full rotation of the encoder shaft there is one index pulse to help give an absolute reference in the rotation. This is often useful when homing a motor you can look for the index pulse.</p>
<p>The A-, B-, and I- are the inverse of the + versions of those signals. This is useful when operating in a high noise environment or where signal integrity is an issue.</p>
<p>If signal integrity is a concern (or an active issue) you can add a line driver to improve the signal.</p>
<p>In design reviews and in practice I often see people purchasing the highest resolution encoder that they can get. Often the cost of the encoder wheel does not change much based on the resolution.</p>
<p>Incremental quadrature encoders typically range from 100-1000 counts/rotation, however you can find encoders with many thousands of counts/rotation. Since they are quadrature and there are 4 state changes per each set of A &amp; B phases, the resolution is 4 times the counts/turn.</p>
<p>In theory if you need 1degree of resolution per rotation, you need an encoder with 360 counts. Using a quadrature encoder this can be reduced to only 90 counts in the encoder wheel! If you have gearing on the motor this can be further improved to limit the number of encoder ticks required.</p>
<p>When you pick an encoder it can be tempting to select the highest resolution available, but you should stop and think first. Some controllers will have a hard time tracking position if the motor is spinning fast and there are too many encoder ticks per unit time. On the flip side if you have a slow-moving motor you might need the high-resolution so that you can see the change in motor position during a given time step in your controller.</p>
<p>Some other things that you need to consider are operating conditions and mounting. Operating conditions is fairly straight forward; can the encoder survive the temperature, vibration, shock, water, etc.. that it will need to endure. Mounting can be a bit more interesting. There are all sorts of options for encoder mounts. Some of the mounting options are hollow shafts, solid shafts, recessed shafts, collars, etc.. Often when ordering a motor if you can get one with a backshaft that will be the easiest way to connect the encoder (assuming you dont have the manufacturer adding it for you). If you are using a brake on the motor, the brake might need to connect to the backshaft, and you will need to be creative or get a pass-through on the brake to add the encoder.</p>
<p>In closing when selecting an encoder you should check the following:<br />
1. Is an incremental (ie non-absolute) encoder good for this application?<br />
2. Does your controller interface to the output format of the encoder?<br />
3. What resolution is needed?<br />
4. What environment will the encoder be operated in?<br />
5. Mechanical fit &amp; mounting.<br />
6. How the electrical noise is (so you can get the differential channels)?<br />
7. How long should the cable be (assuming it is attached and not just a connector)?</p>
<p>A final piece of advice is to use shielded cables for your encoder signals. This is especially important for long cable runs (where you might need a driver) and noisy environments.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: robohub.org @ 2026-10-22 14:26:16 by W3 Total Cache
-->