# 附录1 三维空间刚体运动
## 旋转矩阵
$$\quad$$在机器人运动的过程当中,我们通常会设定一个惯性坐标系(或者叫世界坐标系),姑且认为这个坐标系是固定不动的。例如:$$X_W,Y_W,Z_W$$是固定不动的世界坐标系,$$X_C,Y_C,Z_C$$是机器人坐标系。存在一个向量$$P$$,在世界坐标系下的坐标是$$P_W$$,在移动机器人坐标系下的坐标是$$P_C$$,通常情况下,我们通过传感器已知移动机器人坐标系统下的坐标$$P_C$$,来求$$P$$在世界坐标系下的坐标$$P_W$$
![](https://img.kancloud.cn/05/7c/057cd6e0194725d2aba0eed37a82339f_1110x482.png)
$$\quad$$为了求$$P_W$$,我们必须知道机器人坐标系$$X_C,Y_C,Z_C$$相对与世界坐标$$X_W,Y_W,Z_W$$做了哪些变换。我们定义世界坐标系经过变换矩阵$$T$$之后得到机器人坐标系(这可以通过计算里程和IMU的数据进行测量出来)(这也就说明了为什么在机器人刚刚启动的时候odom和base\_link坐标系必须是重合的,不然没有办法计算旋转矩阵),另外一般情况下,移动机器人运动是一个刚体运动,也就是说机器人的形状和大小不会因为坐标系不同而改变,这种变换叫做欧式变换。一个欧式变换可以由旋转和平移两个部分组成。首先我们考虑旋转问题,假设在世界坐标系下的单位正交基$$(e_x,e_y,e_z)$$,在移动机器人坐标系下的单位正交基$$(e^"_x,e^"_y,e^"_z)$$,那么,根据向量$$P$$的模可知:
$$ \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad [e_x,e_y,e_z] \cdot P^T_W=[e^"_x,e^"_y,e^"_z] \cdot P^T_C $$
$$\quad$$因此,$$P^T_C=[e_x,e_y,e_z]^T \cdot [e^"_x,e^"_y,e^"_z] \cdot P^T_W$$,我们将$$[e_x,e_y,e_z]^T \cdot [e^"_x,e^"_y,e^"_z]$$记做旋转矩阵**R**,因此上面的表达式可以简化为$$P^T_C=R\cdot P^T_W$$。接下来是平移部分,假设平移部分是$$P^T_{C^"}$$经过平移向量t后得到$$P^T_{C}$$,那么可以得到$$P^T_C=P^T_{C^"}+t=R\cdot P^T_w+t$$。所以通过旋转矩阵**R**和平移 向量**t**,我们可以描述从世界坐标系到移动机器人坐标系的坐标变换。但是这种表达方式存在一个问题,对于连续的位置变换,例如机器人坐标系是随着时间在不断变换的,上面这种表达方式并不是一个线性的表达方式,假设我们经历了两次变换$$R_1,t_1$$和$$R_2,t_2$$且满足:从a到b的变换$$b=R_1a+t_1$$,从b到c的变换$$c=R_2b+t_2$$.那么从a到c的变换是$$c=R_2(R_1a+t_1)+t_2$$.并不是我们希望的的形式$$c=Ra+t$$(然后我们采用齐次坐标的方式进行表达,详细的部分参考李群李代数).
- 前言
- 第一章 ROS简介
- 机器人时代的到来
- ROS发展历程
- 什么是ROS
- 安装ROS
- 安装ROS-Academy-for-Beginners教学包
- 二进制与源码包
- 安装RoboWare Studio
- 单元测试一
- 第二章 ROS文件系统
- Catkin编译系统
- Catkin工作空间
- Package软件包
- CMakeLists.txt
- package.xml
- Metapacakge软件元包
- 其他常见文件类型
- 单元测试二
- 第三章 ROS通信架构(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常见msg类型
- 单元测试三
- 第四章 ROS通信架构(二)
- Service
- Srv
- Parameter server
- Action
- 常见srv类型
- 常见action类型
- 单元测试四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 单元测试五
- 第六章 roscpp
- Client Library与roscpp
- 节点初始、关闭与NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 时钟
- 日志与异常
- 第七章 rospy
- Rospy与主要接口
- Topic in rospy
- Service in rospy
- Param与Time
- 第八章 TF与URDF
- 认识TF
- TF消息
- tf in c++
- tf in python
- 统一机器人描述格式
- 附录:TF数学基础
- 三维空间刚体运动---旋转矩阵
- 三维空间刚体运动---欧拉角
- 三维空间刚体运动---四元数
- 第九章 SLAM
- 地图
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附录:Navigation工具包说明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery