Applying angular velocity to a rotation matrix

I have a very simple question. In our project we store an object's orientation as a 3x3 matrix which holds the orthonormal base of that object's local space. For instance if the object is aligned with the axis of the world, then its orientation matrix is :

````1 0 0
0 1 0
0 0 1
````

Now we store the angular velocity as a vector that contains values in rad/s around each of the world's axis. For example if the object should rotate around the world's y axis at 20 rad/s, then the angular velocity is

````0 20 0
````

My question is then, say we want to apply this velocity over 1 second to the orientation matrix, how would we do this?

-

2 Answers

The rate of change of the rotation matrix $\boldsymbol R$ is

$$\dot{\boldsymbol{R}} = \vec{\omega} \times \boldsymbol{R}$$

where $\vec\omega\times = \begin{pmatrix} 0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{pmatrix}$ is the cross product operator in 3x3 form.

So if the position of a point A rotating on a frame is given by $\vec{r}_A = \vec{r} + \boldsymbol{R} \,\vec{p}$ where $\vec{p}$ is the position in local coordinates and $\vec{r}$ the location of the frame, the kinematics are

$$\dot{\vec{r}}_A = \dot{\vec{r}} + \dot{\boldsymbol R}\,\vec{p} \\ \vec{v}_A = \vec{v} + \vec{\omega} \times (\boldsymbol{R}\,\vec{p})$$

$$\dot{\vec{v}}_A = \dot{\vec{v}} +\dot{\vec{\omega}} \times (\boldsymbol{R}\,\vec{p}) + \vec \omega \times (\dot{\boldsymbol{R}}\,\vec{p}) \\ \vec{a}_A = \vec{a} + \vec{\alpha}\times(\boldsymbol{R}\,\vec{p}) + \vec\omega\times\vec\omega\times(\boldsymbol{R}\,\vec{p})$$

-

From Goldstein, chapter 4 eqn 4-92', for a finite rotation the change $\boldsymbol{\Delta r}$ caused by rotating a vector $\boldsymbol{r}$ through an angle $\Phi$ about a direction defined by a unit vector $\boldsymbol{n}$ ($\Phi$ positive for a counter-clockwise rotation), to a final position $\boldsymbol{r'}$ is given by:

$$\boldsymbol{\Delta r} = \boldsymbol{r'-r} = [\boldsymbol{n} (\boldsymbol{n \cdot r} ) - \boldsymbol{r} ] [ 1 - \cos \Phi ] + (\boldsymbol{n \times r}) \sin \Phi$$

Relating this equation to your situation, with an angular momentum vector $\boldsymbol{\omega}$ applied for a time $t$:

$$\boldsymbol{n} = \frac{\boldsymbol{\omega}}{|\boldsymbol{\omega}|} , \Phi = |\boldsymbol{\omega}| \, t$$

Since your angular velocity vector $\boldsymbol{\omega}$ is given with respect to the fixed world coordinate system $\boldsymbol{x_1, x_2, x_3}$, it's straightforward to compute components in that basis:

$$\Delta r'_i = \left[ n_i \sum_{j=1}^3\left(n_j r_j \right) - r_i \right][1-\cos \Phi] + \sum_{j,k=1}^3 \left( \epsilon_{ijk} n_j r_k \right) \sin \Phi$$

In particular, these formulas apply to the basis vectors of your object's local space, so you can use them to evolve your storage matrix.

For the specific example you mention, $\boldsymbol{n = x_2}$ and $\Phi =20$ rad/s $* 1$s $= 20$ rad. Plugging in the 3 object basis vectors $\boldsymbol{x'_1, x'_2, x'_3}$ (which in this case are just equal to the world basis vectors $\boldsymbol{x_1, x_2, x_3}$ respectively) for $\boldsymbol{r}$, you can see that:

• The $\boldsymbol{x'_2}$ body axis is unchanged (as expected for a vector parallel to the angular velocity)
• $\boldsymbol{x'_1}$ and $\boldsymbol{x'_3}$ rotate around a unit circle (again as expected).
-
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 25, "mathjax_display_tex": 6, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0}, "config": {"markdown_headings": false, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "github"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "english_confidence": 0.889476478099823, "perplexity_flag": "head"}