
Open Source Automatic Mobile Robot (AMR) Design

RoboAMR 2021
Last Updated: 2.23.2021
Building Automatic Mobile Robots, also known as AMRs, has gotten much easier thanks to Roboteq’s comprehensive solutions of Motion Controllers, Electric Motors, Guidance Sensors, Power Management and Software.
We make building an AMR so simple that we designed a demonstrator using all our components together with parts of selected partners. This AMR can serve as a simple ready-to-use Robot, or as the Chassis + Drive + Navigation foundation for a more sophisticated system. Its fast charging 1000Wh battery ensures several hours of operation between charges.
The AMR frame is made of high-grade aluminum, uniquely designed to bear heavy loads while still being as light weight as possible. The chassis can be easily customized to user specifications such as hooks and cargo platforms.
Open Hardware Design
All drawings, documentation and models of the AMR are Open Hardware and are licensed under the CERN-OHL-P v2. You may redistribute and modify these files and make products using them under the terms of the CERN-OHL-P v2 (https:/cern.ch/cern-ohl).
These files are distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-P v2 for applicable conditions.
Disclaimer
All published specification, including dimensions, carrying weight, autonomy, are only indicative. The design does not adhere to any functional safety standard. Users must perform their own tests and validation according to rules and standards in effect in their application field and location.
Project Files
The mechanical drawing source files, 3d models, bill of material, wiring diagram, are available free of charge from Roboteq. Please contact us to request until they are posted online.
Design Objectives
Emphasis was put on the following set of design goals to produce a versatile and functional AMR:
- Easy to build using readily available standard components, requiring only cutting and drilling. Strictly minimal use of custom machined parts.
- Easily scalable to other dimensions. Width, heigh, length can be changed as needed.
- Have an efficient and maneuverable drivetrain for moving within confined spaces and tight routes.
- The AMR must be able to navigate floors with dips and cracks with the wheels always making full contact.
- Able to withstand heavy vertical loads, such as mounting a robotic arm to the AMR to carrying entire shelves of inventory.
- Bi-directional driving capabilities with identical maneuverability in both directions.

Robot Specifications:
Dimensions: 935Lx555Wx200Hmm
Weight: 60kg (approx) including batteries
Batteries: 15 cells, 54V max, 20Ah Lithium Ion
Rocker Range of Motion - 10mm
Weight Carrying Capacity - 900 kilograms
Maximum Speed: 2.7 m/s
Max continuous torque at each wheel: 60 Nm
Max total pull force: 154 N (156kg)
Mechanical Design
The Robot chassis is mostly made of standard and widely available 25x25mm X-Profile aluminum. The Robot rests on 6 wheels: a center left/right set of motor/gearbox/wheel and casters at each corner. The chassis is essentially composed of two simple rectangular frames connected via pivot to create a cantilever that ensures the robot’s weight and its load are shared on all six wheels. The articulated chassis ensures that all wheels permanently make contact on the floor even on uneven surfaces.


The top, larger frame carries almost no components. It serves as a large surface upon which loads can be mounted or carried. This frame has two casters and the pivots that attaches to the lower frame. The frame is made entirely of X profiles that are simply cut to size.
The chassis is designed with cantilevered wheels so as to best distribute the load weight over it six wheels. The cantilever also lets wheels pairs move up and down relative to the others, and therefore follow the shape of floor even if not perfectly flat.Details of the cantilever and weight distribution is shown in the figure below. Based on this model, the total carrying capacity – assuming it is evenly distributed - is the lowest carrying capacity of the weakest element divided by the weight ratio.

Weight Distribution and Carrying Capacity
The lower, smaller frame carries most of the Robot’s components. The pivots creates an articulated cantilever with the upper frame so that all six wheels always make contact with the floor. It is made of several lengths of X profile aluminum bars, a custom machined holder for the motors, custom cut and drilled L profiles for the battery holder, and a custom cut and drilled aluminum plate for mounting most of the electronic components.

Component |
Max Carrying per Component |
Max F based on Component |
Motor x 2 |
600kg |
3840kg |
4” Caster x 2 |
155kg |
992kg |
5” Caster x 2 |
200kg |
1066kg |
Pivot |
670kg |
2144kg |
From this table, we see that the Robot’s maximum load is limited to 990kg by the smaller casters. This value can be raised by selecting higher capacity casters. Moving the pivot closer to the motor will shift the load away from the caster but will restrict the cantilever motion.
With a load of 900kg on top of the robot, each component will be subject to the load in the table below:
Component |
Carrying per Component |
Motor |
140kg |
4” Caster x 2 |
140kg |
5” Caster x 2 |
169kg |
Pivot |
281kg |
Stress and torsion of the aluminum X profiles can be analysed using calculator such as this found at https://8020.net/deflection-calculator
Motor, Gearbox, Wheel Sizing
The AMR is fitted with a pair of Nidec CTD 089LDA30XROB Motors/Gearbox/Brake and wheel assemblies. The motor is built into a compact 160mm long, 89 frame, and can deliver 29Nm of continous torque at the output of its precision, ultra-silent 9:1 Shimpo gearbox. The motor is rated 48V and 3000 RPM max, resulting in a maximum robot speed of 2.7m/s on the ground with its 156mm wheel. This motor version is equipped with a mechanical brake.
While this motor is suitable for most typical industrial AMR applications, the exact dimensioning of the motor, gearbox and wheel is a complex calculation that depends on several factors:
- Total weight of loaded robot
- Maximum desired acceleration and deceleration
- Floor inclination
- Rolling resistance resulting from floor harness and tire stiffness
- System friction


Roboteq has establish a mathematical model for estimating the motor requirements based on these factors. Please contact us for an evaluation of your specific requirements.
Electronics, Power, and Sensor Components
At the heart of the system is an FBL2360 dual channel motor controller connected to two Permanent Magnets Brushless motors.
Power comes from a Lithium Ion battery pack connected to the Battery Management System. Charge contact allow the robot to connect to the battery charger at docking stations.
The Robot uses magnetic track sensors to follow paths made of magnetic tape affixed to the floor. The optical flow sensor includes an IMU and provides information about the robot’s motion for navigation and/or safety purposes.
Thanks to its built-in scripting language, the motor controller also acts as the Robot’s navigation and supervisory computer.
The block diagram below shows a more detailed view of each component and how they are wired together. It also includes an interface to ultrasound distance sensors for collistion avoidance, and a WiFi adapter for communication to a host computer.
The Robot combines the following Roboteq and Nidec components. Click on components for detailed description.


Robot Mechanical Construction
Below is a view of the complete, fully assembled robot

Subassembly 1 - Top Frame

Materials:
Item # |
Quantity |
Description |
Vendor Ref |
Vendor |
1 |
2 |
6.25inch_Cardinal_Caster |
2426T54 |
McMaster-Carr |
8 |
1 |
1"x1"x1 foot Aluminum Corner Brace |
8982K39 |
McMaster-Carr |
13 |
1 |
Washer |
95211A160 |
McMaster-Carr |
18 |
2 |
25mmx50mmx900mm Extrusion |
|
80/20 |
19 |
2 |
25mmx50mmx424mm Extrusion |
|
80/20 |
20 |
1 |
25mmx25mmx424mm (8020) |
|
80/20 |
25 |
2 |
25mmx25mmx37mm(8020) |
|
80/20 |
26 |
1 |
Rubber Tread Strip 1meter(8020) |
|
80/20 |
27 |
2 |
25_series_Endcap+Plug(8020) |
|
80/20 |
29 |
2 |
25mmx25mmx140mm(8020) |
|
80/20 |
30 |
14 |
25 Series End Clip Fastener(8020) |
|
80/20 |
31 |
33 |
12mm M6 Button Head Bolt(8020) |
|
80/20 |
32 |
23 |
M6 Standard T Nut(8020) |
|
80/20 |
Building Steps:

- Cut three lengths of the rubber tread strip (#26), two at 37mm and one at 424mm.
- Press fit the 37mm cuts of rubber tread strip (#26) into the t-slot of the 37mm single extrusion (#25). Then press the 424mm cuts of rubber tread strip (#26) into the bottom t-slot of a 424mm double extrusion (#19).
- Press the end cap and end cap plug (#27) into the ends of both 37mm single extrusion (#25).
- Using the end clip fastening method, slide the 37mm single extrusions (#25) into the bottom t-slot of each 900mm double extrusion (#18) up to the center access hole.
- Using the end clip fastening method, slide both 140mm single extrusions (#29) up to the access holes on the 424mm single extrusion (#20). Then drill and fasten the aluminum angle (#8) to the bottoms of the 140mm single extrusions (#29).
- Make sure to add 2 free sliding T-nuts to the bottom slot of the 424mm single extrusion (#20) and 2 T-nuts to the bottom t-slot to the rear 424mm double extrusion (#19).
- Using the end clip fastening method, slide the 424mm single extrusion (#20) into the bottom t-slot of the 900mm double extrusions (#18) up to the second to last rear access holes.
- Fit the 424mm double extrusions (#19) in between the 900mm double extrusions (#18) using the end clip fastening method to create a square frame.
- Mount the casters (#1) using the T-nut fastening method and washers (#13).
- Prepare T-nuts and button head screws on the outside perimeter of the frame as shown in the following CAD file.
- Check your work using the provided top frame CAD file at Roboteq downloads.
Subassembly 2 - Pivot Group

Materials:
Item # |
Quantity |
Description |
Vendor Ref |
Vendor |
2 |
2 |
12mm Shaft Support |
61815K34 |
McMaster-Carr |
3 |
2 |
Side Mounted Pillow Bearing |
5912K81 |
McMaster-Carr |
4 |
2 |
12mm Diameter Shaft 200mm |
1482K18 |
McMaster-Carr |
5 |
2 |
1mm Bearing Shim |
90214A527 |
McMaster-Carr |
9 |
4 |
Imperial Bolt Bushing |
8491A115 |
McMaster-Carr |
10 |
1 |
Motor Bolt 55mm FullThread |
91290A206 |
McMaster-Carr |
12 |
1 |
Nylon Lock Nut |
97260A101 |
McMaster-Carr |
13 |
1 |
Washer |
95211A160 |
McMaster-Carr |
14 |
1 |
Oversized_Washer |
98363A112 |
McMaster-Carr |
15 |
1 |
Motor Bolt 45mm |
91290A204 |
McMaster-Carr |
31 |
55 |
12mm M6 Buttonhead Bolt(8020) |
|
80/20 |
-
Building Steps: (2 total Pivot Groups)
- Cut and deburr the imperial bolt bushings (#9) to a length of 6mm and press into mounting holes of item 3. (x4)
- Cut and deburr the 12mm shaft (#2) to a length of 32mm (x2).
- Slide 2 bearing shims (#5) onto the cut 12mm shaft (#2) and insert the 12mm shaft (#2) into both the bearing and shaft support. Then tighten the shaft support set screw once the shaft is flush to both outer faces.
- Insert miscellaneous bolts and nuts to prepare for mounting.
- Check you work with the “Pivot Groups” 3D model at Roboteq downloads.

Subassembly 3 - Bottom Frame

Item # |
Quantity |
Description |
Vendor Ref |
Vendor |
6 |
1 |
12"x12"x0.160" Aluminum Plate |
89015K94 |
McMaster-Carr |
7 |
4 |
1"x1"x2 ft Aluminum Corner Brace |
8982K39 |
McMaster-Carr |
10 |
1 |
Motor Bolt 55mm FullThread |
91290A206 |
McMaster-Carr |
11 |
1 |
35mm Short Bolt |
91290A202 |
McMaster-Carr |
12 |
1 |
Nylon Lock Nut |
97260A101 |
McMaster-Carr |
14 |
1 |
Oversized_Washer |
98363A112 |
McMaster-Carr |
15 |
1 |
Motor Bolt 45mm |
91290A204 |
McMaster-Carr |
16 |
1 |
60mm Bolt |
91290A207 |
McMaster-Carr |
17 |
1 |
50mm Bolt |
91290A205 |
McMaster-Carr |
21 |
6 |
25mmx25mmx350mm (8020) |
|
80/20 |
22 |
2 |
25mmx25mmx618mm (8020) |
|
80/20 |
23 |
8 |
25mmx25mmx90mm Extrusion(8020) |
|
80/20 |
24 |
1 |
25mmx25mmx400mm(8020) |
|
80/20 |
28 |
2 |
Motor Mount Bracket |
|
80/20 |
30 |
30 |
25 Series End Clip Fastener(8020) |
|
80/20 |
31 |
55 |
12mm M6 Button Head Bolt(8020) |
|
80/20 |
32 |
44 |
M6 Standard T-nut(8020) |
|
80/20 |
34 |
2 |
4in Shepherd Regent Caster |
|
Shepherd Caster |
35 |
1 |
M4 8mm Buttonhead Screw |
92095A189 |
McMaster-Carr |
-
Building Steps:
- Machine the aluminum plate (#6) and all aluminum angles (#7) to specification in provided part file at URL***
- Prepare by inserting 2 t-nuts into the bottom t-slot of the front two 350mm single extrusions crossbars and inserting 3 t-nuts into the top t-slots of the fourth and fifth 350mm single extrusion crossbars, counting from the front, (#21).
- Use the end clip fastening method and slide all six 350mm single extrusions (#21) into 618mm single extrusions (#22) to make a flat frame with 6 crossbars.
- Like step 5 of the top frame, assemble the battery holders by assembling the machined aluminum corner angles (#17) and 90mm single extrusion (#23) to make “U” shaped brackets. Assemble these brackets on the underside of the flat frame using end clip fasteners.
- Mount the casters (#35) using the t-nut fastening method and Washers (#13).
- Mount the electronics plate (#6) on top of the two center crossbars as shown in the photos below.
- Mount the motor mounts (#28) using the following hardware: #10,#11,#12,#14,#15, and #16.
- Fasten the 400mm single extrusion (#24) between both motor mounts using 50mm bolts (#17).
- Check your work with the “Bottom Frame” Model provided at Roboteq downloads.



Combining Subassemblies

Building Instructions:
- Begin by combining the bottom frame and pivot group using the longer bolt to thread into the crossbar and shorter bolt to fasten with the nut and washer. Use the following holes for mounting:

the following holes for mounting:
2. Keeping the button head screws in the shaft support and T-nuts in the bottom channel of item 18, fasten the shaft support to the top chassis using the t-nut fastening method.
3. The shaft support should be fastened in a position where the front end of both the top and bottom frame are flush at the front end. Refer to the image below.

4. Check all fasteners and tighten them until the aluminum creaks.
Mounting Motors and Electronics

Building Instructions:
1. Begin by removing the wheel on each motor and fastening the outer ring of the motor to the motor mount bracket with the provided hardware. The wiring should face the front of the AGV. Refer to the image below for Motor positioning. Carefully reattach wheels once finished.<

2. Mount the FBL2360, BMS1060, RIOX, DC Contactor and DC to DC converter on the custom machined aluminum plate. Refer to the images below.


3. Mount both MGS1600GY using M4 screws (#35) to their corresponding machined aluminum angles. Reference the image below for placement.

4. Then proceed to carefully insert both battery packs into their slots. If tolerances are tight, loosen some end clip fasteners, place the batteries, then tighten them again.
5. Check you work with the completed model CAD Files at Roboteq downloads.
Configuration and Scripting
option explicit
' This script provide basic control for an AGV.
' Motor will turn on upon the presence of a track and stop when track disappears.
' The track position information is used to provide left/right steering.
' At forks, the AGV will follow the left or right track depending whether the last
' marker detected was on the left or right side of the track.
' Make sure you precede merges with a marker so that the AGV remains on the main track.
' The presence of a left and right marker simultaneously will cause the AGV to stop for
' 30 seconds or until the operator presses the button
' declare variables
dim Gain as integer
dim DefaultThrottle as integer
dim TapeDetect as boolean
dim MarkerLeft as boolean
dim MarkerRight as boolean
dim Throttle as integer
dim Tape_Position as integer
dim LineSelect as integer
dim Steering as integer
dim GoButton as boolean
dim RunState as boolean
dim NotOnStopMarker as boolean
dim PauseTime as integer
' initialize constants
Gain = -7 ' Use negative value to invert steering command
DefaultThrottle = 250 ' Motor power level while the AGV runs
LineSelect = 1 ' Use left track by default
PauseTime = 30000 ' in miliseconds
' main loop to repeat every 10ms
top:
wait(10)
' read sensor data
TapeDetect = getvalue(_MGD)
MarkerLeft = getvalue(_MGM, 1)
MarkerRight = getvalue(_MGM, 2)
' Read button state
GoButton = getvalue(_DI, 2)
if (GoButton) then SetTimerCount(1, 0) ' Pressing the button will clear the pause timer
if GetTimerState(1) then RunState = true ' When pause timer is cleared, AGV is allowed to run
' Use TapeDetect and Pause Timer to apply throttle or not
if (TapeDetect and GetTimerState(1))
Throttle = DefaultThrottle
else
Throttle = 0
end if
' Check Marker presence to select Left or Right track
if (MarkerLeft) then LineSelect = 1
if (MarkerRight) then LineSelect = 2
' Detect when transitioning onto stop markers
if (NotOnStopMarker and MarkerLeft and MarkerRight)
NotOnStopMarker = false ' Mark stop marker detection so that it is not detected again until AGV moved away
SetTimerCount(1, PauseTime) ' Load stop timer timout value
RunState = false
else
NotOnStopMarker = true
end if
Tape_Position = getvalue(_MGT, LineSelect)
' use tape position multiplied with gain as steering
Steering = Tape_Position * Gain
' Send throttle and steering to controller Configured in Mixed mode
setcommand(_G, 1, Throttle)
setcommand(_G, 2, Steering)
' Log output. Useful for troubleshooting. Comment out when done.
print("\r", TapeDetect,"\t", Tape_Position,"\t", MarkerLeft,"\t", MarkerRight,"\t", Throttle,"\t", Steering,"\t",RunState,"\t",LineSelect)
goto top ' Loop forever