Skip to content

Commit d076ea2

Browse files
Add mobile robot kinematics 101 and improve steering library docs (#954)
1 parent 0ae3e42 commit d076ea2

18 files changed

+1533
-33
lines changed

diff_drive_controller/doc/userdoc.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ As input it takes velocity commands for the robot body, which are translated to
1111

1212
Odometry is computed from hardware feedback and published.
1313

14+
For an introduction to mobile robot kinematics and the nomenclature used here, see :ref:`mobile_robot_kinematics`.
15+
1416
Other features
1517
--------------
1618

doc/controllers_index.rst

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,15 @@ Guidelines and Best Practices
2121
*
2222

2323

24-
Controllers for Mobile Robots
25-
*****************************
24+
Controllers for Wheeled Mobile Robots
25+
*************************************
2626

2727
.. toctree::
2828
:titlesonly:
2929

30-
Ackermann Steering Controller <../ackermann_steering_controller/doc/userdoc.rst>
31-
Bicycle Steering Controller <../bicycle_steering_controller/doc/userdoc.rst>
3230
Differential Drive Controller <../diff_drive_controller/doc/userdoc.rst>
3331
Steering Controllers Library <../steering_controllers_library/doc/userdoc.rst>
3432
Tricycle Controller <../tricycle_controller/doc/userdoc.rst>
35-
Tricycle Steering Controller <../tricycle_steering_controller/doc/userdoc.rst>
3633

3734
Controllers for Manipulators and Other Robots
3835
*********************************************

doc/images/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.bkp

doc/images/ackermann_steering.drawio

Lines changed: 251 additions & 0 deletions
Large diffs are not rendered by default.

doc/images/ackermann_steering.svg

Lines changed: 3 additions & 0 deletions
Loading

doc/images/ackermann_steering_traction.drawio

Lines changed: 287 additions & 0 deletions
Large diffs are not rendered by default.

doc/images/ackermann_steering_traction.svg

Lines changed: 3 additions & 0 deletions
Loading

doc/images/car_like_robot.drawio

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
<mxfile host="Electron" modified="2024-05-27T21:55:55.958Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.4.8 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="RfbfFYuakI-CmlcmD0pO" version="24.4.8" type="device">
2+
<diagram name="Page-1" id="2wCjeB2BCqXbrsJG6yFQ">
3+
<mxGraphModel dx="378" dy="268" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="1" shadow="0">
4+
<root>
5+
<mxCell id="0" />
6+
<mxCell id="1" parent="0" />
7+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-15" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=-75;fillColor=#2F405F;" parent="1" vertex="1">
8+
<mxGeometry x="510" y="240" width="80" height="20" as="geometry" />
9+
</mxCell>
10+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-5" value="" style="rounded=1;whiteSpace=wrap;html=1;rotation=-30;fillColor=#2F405F;" parent="1" vertex="1">
11+
<mxGeometry x="320" y="350" width="80" height="20" as="geometry" />
12+
</mxCell>
13+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-1" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
14+
<mxGeometry width="50" height="50" relative="1" as="geometry">
15+
<mxPoint x="160" y="440" as="sourcePoint" />
16+
<mxPoint x="160" y="360" as="targetPoint" />
17+
</mxGeometry>
18+
</mxCell>
19+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-2" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
20+
<mxGeometry width="50" height="50" relative="1" as="geometry">
21+
<mxPoint x="160" y="440" as="sourcePoint" />
22+
<mxPoint x="240" y="440" as="targetPoint" />
23+
</mxGeometry>
24+
</mxCell>
25+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-3" value="$$y_w$$" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#2F405F;" parent="1" vertex="1">
26+
<mxGeometry x="120" y="360" width="60" height="30" as="geometry" />
27+
</mxCell>
28+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-4" value="$$x_w$$" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Times New Roman;fontColor=#2F405F;" parent="1" vertex="1">
29+
<mxGeometry x="210" y="440" width="60" height="30" as="geometry" />
30+
</mxCell>
31+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-8" value="$$y_b$$" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
32+
<mxGeometry x="280" y="290" width="60" height="30" as="geometry" />
33+
</mxCell>
34+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-9" value="$$x_b$$" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;" parent="1" vertex="1">
35+
<mxGeometry x="380" y="300" width="60" height="30" as="geometry" />
36+
</mxCell>
37+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-6" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
38+
<mxGeometry width="50" height="50" relative="1" as="geometry">
39+
<mxPoint x="360" y="360" as="sourcePoint" />
40+
<mxPoint x="320" y="290" as="targetPoint" />
41+
</mxGeometry>
42+
</mxCell>
43+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-12" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
44+
<mxGeometry width="50" height="50" relative="1" as="geometry">
45+
<mxPoint x="360" y="360" as="sourcePoint" />
46+
<mxPoint x="430" y="320" as="targetPoint" />
47+
</mxGeometry>
48+
</mxCell>
49+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-14" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" parent="1" edge="1">
50+
<mxGeometry width="50" height="50" relative="1" as="geometry">
51+
<mxPoint x="360" y="360" as="sourcePoint" />
52+
<mxPoint x="620" y="210" as="targetPoint" />
53+
</mxGeometry>
54+
</mxCell>
55+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-16" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" parent="1" edge="1">
56+
<mxGeometry width="50" height="50" relative="1" as="geometry">
57+
<mxPoint x="360" y="360" as="sourcePoint" />
58+
<mxPoint x="247" y="162" as="targetPoint" />
59+
</mxGeometry>
60+
</mxCell>
61+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-17" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" parent="1" source="q5q8uRjG3jJ6PqbUAPb0-15" edge="1">
62+
<mxGeometry width="50" height="50" relative="1" as="geometry">
63+
<mxPoint x="370" y="370" as="sourcePoint" />
64+
<mxPoint x="240" y="170" as="targetPoint" />
65+
</mxGeometry>
66+
</mxCell>
67+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-18" value="ICR" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lato;" parent="1" vertex="1">
68+
<mxGeometry x="210" y="179" width="60" height="30" as="geometry" />
69+
</mxCell>
70+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-19" value="" style="endArrow=none;html=1;rounded=0;entryX=0.988;entryY=1.03;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" target="q5q8uRjG3jJ6PqbUAPb0-41" edge="1">
71+
<mxGeometry width="50" height="50" relative="1" as="geometry">
72+
<mxPoint x="360" y="360" as="sourcePoint" />
73+
<mxPoint x="540" y="360" as="targetPoint" />
74+
</mxGeometry>
75+
</mxCell>
76+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-26" value="" style="curved=1;endArrow=classic;html=1;rounded=0;fontColor=#2980B9;strokeColor=#2980B9;" parent="1" edge="1">
77+
<mxGeometry width="50" height="50" relative="1" as="geometry">
78+
<mxPoint x="460" y="360" as="sourcePoint" />
79+
<mxPoint x="445" y="312" as="targetPoint" />
80+
<Array as="points">
81+
<mxPoint x="460" y="340" />
82+
</Array>
83+
</mxGeometry>
84+
</mxCell>
85+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-27" value="$$\theta$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#2980B9;" parent="1" vertex="1">
86+
<mxGeometry x="430" y="318" width="80" height="30" as="geometry" />
87+
</mxCell>
88+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-30" value="" style="curved=1;endArrow=classic;html=1;rounded=0;strokeColor=#FF1717;" parent="1" edge="1">
89+
<mxGeometry width="50" height="50" relative="1" as="geometry">
90+
<mxPoint x="605" y="217" as="sourcePoint" />
91+
<mxPoint x="570" y="180" as="targetPoint" />
92+
<Array as="points">
93+
<mxPoint x="594" y="193" />
94+
</Array>
95+
</mxGeometry>
96+
</mxCell>
97+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-31" value="$$\phi$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#ff0000;" parent="1" vertex="1">
98+
<mxGeometry x="570" y="170" width="70" height="30" as="geometry" />
99+
</mxCell>
100+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-32" value="" style="endArrow=classic;html=1;strokeWidth=2;rounded=0;strokeColor=#FF1717;" parent="1" edge="1">
101+
<mxGeometry width="50" height="50" relative="1" as="geometry">
102+
<mxPoint x="550" y="250" as="sourcePoint" />
103+
<mxPoint x="573" y="165" as="targetPoint" />
104+
</mxGeometry>
105+
</mxCell>
106+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-33" value="Front wheel" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontFamily=Lato;" parent="1" vertex="1">
107+
<mxGeometry x="580" y="240" width="90" height="30" as="geometry" />
108+
</mxCell>
109+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-34" value="Rear wheel" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontFamily=Lato;" parent="1" vertex="1">
110+
<mxGeometry x="300" y="400" width="80" height="30" as="geometry" />
111+
</mxCell>
112+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-39" value="$$v_{front}$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#ff0000;" parent="1" vertex="1">
113+
<mxGeometry x="500" y="150" width="90" height="30" as="geometry" />
114+
</mxCell>
115+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-40" value="" style="endArrow=classic;html=1;strokeWidth=2;rounded=0;strokeColor=#FF1717;" parent="1" edge="1">
116+
<mxGeometry width="50" height="50" relative="1" as="geometry">
117+
<mxPoint x="360" y="360" as="sourcePoint" />
118+
<mxPoint x="413" y="330" as="targetPoint" />
119+
</mxGeometry>
120+
</mxCell>
121+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-41" value="$$v_{rear}$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#ff0000;" parent="1" vertex="1">
122+
<mxGeometry x="380" y="330" width="90" height="30" as="geometry" />
123+
</mxCell>
124+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-42" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=1;" parent="1" edge="1">
125+
<mxGeometry width="50" height="50" relative="1" as="geometry">
126+
<mxPoint x="360" y="360" as="sourcePoint" />
127+
<mxPoint x="400" y="430" as="targetPoint" />
128+
</mxGeometry>
129+
</mxCell>
130+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-43" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=1;" parent="1" edge="1">
131+
<mxGeometry width="50" height="50" relative="1" as="geometry">
132+
<mxPoint x="550" y="250" as="sourcePoint" />
133+
<mxPoint x="590" y="320" as="targetPoint" />
134+
</mxGeometry>
135+
</mxCell>
136+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-44" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" parent="1" edge="1">
137+
<mxGeometry width="50" height="50" relative="1" as="geometry">
138+
<mxPoint x="398" y="424" as="sourcePoint" />
139+
<mxPoint x="585" y="316" as="targetPoint" />
140+
</mxGeometry>
141+
</mxCell>
142+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-45" value="$$l$$" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
143+
<mxGeometry x="490" y="360" width="80" height="30" as="geometry" />
144+
</mxCell>
145+
<mxCell id="q5q8uRjG3jJ6PqbUAPb0-47" value="" style="ellipse;whiteSpace=wrap;html=1;fillColor=#000000;" parent="1" vertex="1">
146+
<mxGeometry x="251" y="171" width="5" height="5" as="geometry" />
147+
</mxCell>
148+
<mxCell id="nqfxVOKmGKpuGtbRDlFu-1" value="$$v_{b,x}$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#2980B9;" parent="1" vertex="1">
149+
<mxGeometry x="330" y="310" width="90" height="30" as="geometry" />
150+
</mxCell>
151+
<mxCell id="ujk3rQ-hGakSXP_pFLQ8-1" value="" style="endArrow=classic;html=1;strokeWidth=2;rounded=0;strokeColor=#2980B9;" parent="1" edge="1">
152+
<mxGeometry width="50" height="50" relative="1" as="geometry">
153+
<mxPoint x="359" y="359" as="sourcePoint" />
154+
<mxPoint x="412" y="329" as="targetPoint" />
155+
</mxGeometry>
156+
</mxCell>
157+
<mxCell id="ujk3rQ-hGakSXP_pFLQ8-2" value="" style="curved=1;endArrow=classic;html=1;rounded=0;strokeColor=#2980B9;" parent="1" edge="1">
158+
<mxGeometry width="50" height="50" relative="1" as="geometry">
159+
<mxPoint x="351" y="347" as="sourcePoint" />
160+
<mxPoint x="371" y="347" as="targetPoint" />
161+
<Array as="points">
162+
<mxPoint x="340" y="373" />
163+
<mxPoint x="380" y="373" />
164+
</Array>
165+
</mxGeometry>
166+
</mxCell>
167+
<mxCell id="ujk3rQ-hGakSXP_pFLQ8-3" value="$$\omega_{b,z}$$" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#2980B9;" parent="1" vertex="1">
168+
<mxGeometry x="270" y="330" width="120" height="30" as="geometry" />
169+
</mxCell>
170+
</root>
171+
</mxGraphModel>
172+
</diagram>
173+
</mxfile>

doc/images/car_like_robot.svg

Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)