16.2: Pick and Place
- Page ID
- 67839
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Consider the robot depicted in the following image.

This style of robot is often called a “pick-and-place” robot. It has two motors that rotate around the z-axis to move the end effector in the \(x−y\) plane; one “linear actuator” which moves up-and-down in the \(z\)-direction; and then finally a third rotating “wrist” joint that turns the “hand” of the robot. Let’s model our robot using the following system diagram:

The origin for this robot is located at the base of the first “tower” and is in-line with the first joint. The \(x\)-direction goes from the origin to the right and the \(z\)-axis goes from the origin upwards.
This is a little more tricky than the 2D case where everything was rotating around the axes that projects out of the \(x−y\) plane.
In 2D we only really worry about one axis of rotation. However in 3D we can rotate around the \(x\), \(y\), and \(z\) axis. The following are the 3D transformation matrices that combine rotation and translations:
X-Axis rotation
\[\begin{split}
\left[ \begin{matrix}
x' \\
y' \\
z' \\
1
\end{matrix}
\right]
=
\left[ \begin{matrix}
1 & 0 & 0 & dx \\
0 & cos(q) & -sin(q) & dy \\
0 & sin(q) & cos(q) & dz \\
0 & 0 & 0 & 1
\end{matrix}
\right]
\left[ \begin{matrix}
x \\
y \\
z \\
1
\end{matrix}
\right]
\end{split} \nonumber \]
Y-Axis rotation
\[\begin{split}
\left[ \begin{matrix}
x' \\
y' \\
z' \\
1
\end{matrix}
\right]
=
\left[ \begin{matrix}
cos(q) & 0 & sin(q) & dx \\
0 & 1 & 0 & dy \\
-sin(q) & 0 & cos(q) & dz \\
0 & 0 & 0 & 1
\end{matrix}
\right]
\left[ \begin{matrix}
x \\
y \\
z \\
1
\end{matrix}
\right]
\end{split} \nonumber \]
Z-Axis rotation
\[\begin{split}
\left[ \begin{matrix}
x' \\
y' \\
z' \\
1
\end{matrix}
\right]
=
\left[ \begin{matrix}
cos(q) & -sin(q) & 0 & dx \\
sin(q) & cos(q) & 0 & dy \\
0 & 0 & 1 & dz \\
0 & 0 & 0 & 1
\end{matrix}
\right]
\left[ \begin{matrix}
x \\
y \\
z \\
1
\end{matrix}
\right]
\end{split} \nonumber \]
Construct a joint transformation matrix called \(J_1\), which represents a coordinate system that is located at the top of the first “tower” (robot’s sholder) and moves by rotating around the \(z\)-axis by \(\theta_1\) degrees. Represent your matrix using sympy
and the provided symbols:
Construct a joint transformation matrix called \(J_2\), which represents a coordinate system that is located at the “elbow” joint between the two rotating arms and rotates with the second arm around the \(z\)-axis by \(\theta_2\) degrees. Represent your matrix using sympy
and the symbols provided in question a:
Construct a joint transformation matrix called \(J_3\), which represents a coordinate translation from the “elbow” joint all the way to the horizontal end of the robot arm above the wrist joint. Note: there is no rotation in this transformation. Represent your matrix using sympy
and the symbols provided in question a:
Construct a joint transformation matrix called \(J_4\), which represents a coordinate system that is located at the tip of the robot’s “hand” and rotates around the \(z\)-axis by \(\theta_4\). This one is a little different, the configuration is such that the hand touches the table when \(d_4=0\) so the translation component for the matrix in the z axis is \(d_4−V_1−V_2\).
Rewrite the joint transformation matrices from questions a - d as numpy matrices with discrete (instead of symbolic) values. Plug in your transformations in the code below and use this to simulate the robot:
Can we change the order of the transformation matrices? Why? You can try and see what happens.