本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 
7.4 机器人运动学介绍
机器人学是一个非常庞大的学科,凡是和机器人设计应用相关的都可以划分到机器人学中,主要有运动学和动力学、系统结构、感知传感技术、运动规划技术、决策技术等。
为了方便后面的机器人建模和仿真,本节我们对机器人的运动学进行简单的介绍和学习。
1.机器人运动学
机器人运动学研究机器人的位姿关系,主要包含正向运动学和逆向运动学两类。
正向运动学即给定机器人各关节变量,计算机器人末端的位置姿态;比如上节课我们已知机器人关节和关节之间的关系,求关节1和关节3之间的关系
逆向运动学即已知机器人末端的位置姿态,反求机器人的关节变量;比如当我们已知机器人关节1和关节3之间的关系,求关节关节1和关节2,关节2和关节3之间关系。
2.机械臂运动学介绍

正运动学:已知每个关节的角度,求末端的位姿
逆运动学:已知末端姿态,求每一个关节的角度
3.两轮差速底盘运动学介绍
两轮差速模型指机器人底盘由两个驱动轮和若干支撑轮构成的底盘模型,像turtlebot和开源机器人fishbot都是两轮差速模型。

两轮差速模型通过两个驱动轮可以通过不同转速和转向,使得机器人的达到某个特定的角速度和线速度。

两轮的平衡车大家都见过吧,靠着两个轮子即可实现前后移动(线速度),左转右转(角速度)。
3.1 正逆解
了解了两轮差速模型,那正逆解又是怎么回事?
正运动学:已知两个轮子的速度,求整车的角速度(弧度/秒)和线速度(米/秒)
#mermaid-svg-aQiMuOYy2TvOSrPB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .error-icon{fill:#552222;}#mermaid-svg-aQiMuOYy2TvOSrPB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aQiMuOYy2TvOSrPB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-aQiMuOYy2TvOSrPB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aQiMuOYy2TvOSrPB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aQiMuOYy2TvOSrPB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aQiMuOYy2TvOSrPB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aQiMuOYy2TvOSrPB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aQiMuOYy2TvOSrPB .marker.cross{stroke:#333333;}#mermaid-svg-aQiMuOYy2TvOSrPB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aQiMuOYy2TvOSrPB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .cluster-label text{fill:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .cluster-label span{color:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .label text,#mermaid-svg-aQiMuOYy2TvOSrPB span{fill:#333;color:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .node rect,#mermaid-svg-aQiMuOYy2TvOSrPB .node circle,#mermaid-svg-aQiMuOYy2TvOSrPB .node ellipse,#mermaid-svg-aQiMuOYy2TvOSrPB .node polygon,#mermaid-svg-aQiMuOYy2TvOSrPB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aQiMuOYy2TvOSrPB .node .label{text-align:center;}#mermaid-svg-aQiMuOYy2TvOSrPB .node.clickable{cursor:pointer;}#mermaid-svg-aQiMuOYy2TvOSrPB .arrowheadPath{fill:#333333;}#mermaid-svg-aQiMuOYy2TvOSrPB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aQiMuOYy2TvOSrPB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aQiMuOYy2TvOSrPB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-aQiMuOYy2TvOSrPB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-aQiMuOYy2TvOSrPB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aQiMuOYy2TvOSrPB .cluster text{fill:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB .cluster span{color:#333;}#mermaid-svg-aQiMuOYy2TvOSrPB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aQiMuOYy2TvOSrPB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
左轮当前速度
正运动学
机器人当前角速度
右轮当前速度
机器人当前线速度
逆运动学:已知目标角速度和线速度,求两个轮子的转速
#mermaid-svg-GGgcwpKz3Lxq8u1h {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .error-icon{fill:#552222;}#mermaid-svg-GGgcwpKz3Lxq8u1h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GGgcwpKz3Lxq8u1h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .marker.cross{stroke:#333333;}#mermaid-svg-GGgcwpKz3Lxq8u1h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .cluster-label text{fill:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .cluster-label span{color:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .label text,#mermaid-svg-GGgcwpKz3Lxq8u1h span{fill:#333;color:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .node rect,#mermaid-svg-GGgcwpKz3Lxq8u1h .node circle,#mermaid-svg-GGgcwpKz3Lxq8u1h .node ellipse,#mermaid-svg-GGgcwpKz3Lxq8u1h .node polygon,#mermaid-svg-GGgcwpKz3Lxq8u1h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .node .label{text-align:center;}#mermaid-svg-GGgcwpKz3Lxq8u1h .node.clickable{cursor:pointer;}#mermaid-svg-GGgcwpKz3Lxq8u1h .arrowheadPath{fill:#333333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GGgcwpKz3Lxq8u1h .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GGgcwpKz3Lxq8u1h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GGgcwpKz3Lxq8u1h .cluster text{fill:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h .cluster span{color:#333;}#mermaid-svg-GGgcwpKz3Lxq8u1h div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GGgcwpKz3Lxq8u1h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
机器人目标线速度
运动学逆解
机器人目标角速度
左轮目标速度
右轮目标速度
3.2轮式里程计
#mermaid-svg-qvT1Z22Ho7cOYokq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .error-icon{fill:#552222;}#mermaid-svg-qvT1Z22Ho7cOYokq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qvT1Z22Ho7cOYokq .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-qvT1Z22Ho7cOYokq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qvT1Z22Ho7cOYokq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qvT1Z22Ho7cOYokq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qvT1Z22Ho7cOYokq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qvT1Z22Ho7cOYokq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qvT1Z22Ho7cOYokq .marker.cross{stroke:#333333;}#mermaid-svg-qvT1Z22Ho7cOYokq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qvT1Z22Ho7cOYokq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .cluster-label text{fill:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .cluster-label span{color:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .label text,#mermaid-svg-qvT1Z22Ho7cOYokq span{fill:#333;color:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .node rect,#mermaid-svg-qvT1Z22Ho7cOYokq .node circle,#mermaid-svg-qvT1Z22Ho7cOYokq .node ellipse,#mermaid-svg-qvT1Z22Ho7cOYokq .node polygon,#mermaid-svg-qvT1Z22Ho7cOYokq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qvT1Z22Ho7cOYokq .node .label{text-align:center;}#mermaid-svg-qvT1Z22Ho7cOYokq .node.clickable{cursor:pointer;}#mermaid-svg-qvT1Z22Ho7cOYokq .arrowheadPath{fill:#333333;}#mermaid-svg-qvT1Z22Ho7cOYokq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qvT1Z22Ho7cOYokq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qvT1Z22Ho7cOYokq .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-qvT1Z22Ho7cOYokq .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-qvT1Z22Ho7cOYokq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qvT1Z22Ho7cOYokq .cluster text{fill:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq .cluster span{color:#333;}#mermaid-svg-qvT1Z22Ho7cOYokq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qvT1Z22Ho7cOYokq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
左右轮当前速度/位置
里程计推算
里程计-odom
当我们知道了两个轮子之间的相对位置,同时知道了每一时刻机器人的角速度和线速度,那我们如何获取机器人的当前角度和位置呢?
3.2.1 角度
影响机器人当前角度的因素只有一个,就是角速度。
某一时刻机器人转动的角度 = 这一时刻机器人的角速度*这一时刻时长
假如我们认定初始时刻机器人的角度为0,通过对机器人转动角度角度进行累加,即可获得机器人的当前角度。
上述过程其实就是对角速度进行积分得到角度。
3.2.2 位置
通过对角速度积分,我们得到了角度。
机器人某一时刻自身方向上的前进速度可以分解为里程计坐标系中x轴和y轴方向上的速度。

从图中可以看出:
v
y
=
v
∗
c
o
s
(
θ
)
v
y
=
v
∗
s
i
n
(
θ
)
v_y = v*cos(\theta) \\ v_y = v*sin(\theta)
vy=v∗cos(θ)vy=v∗sin(θ) 得到了x和y方向上的速度,乘上该速度对应的某一时刻经过的时间,即可得到这一时刻在x轴和y轴方向上的位移,对位移进行累加即可得到里程计中的x和y。
技术交流&&问题求助:
作者介绍:
我是小鱼,机器人领域资深玩家,现深圳某独脚兽机器人算法工程师一枚 初中学习编程,高中开始接触机器人,大学期间打机器人相关比赛实现月入2W+(比赛奖金) 目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小鱼,一起交流技术,学习机器人