1,理论模型
在使用ROS导航时,move_base发布的时 /cmd_vel 话题,但是为了驱动小车,可能我们的车的底盘并不支持ros系统,因此需要通过串口通信交换数据,因此我们必须自己订阅 /cmd_vel 的话题,然后将线速度和角速度转化成小车车轮的的线速度或者转速度进行控制。
两轮小车的模型,是可以认为是一个刚体的,因为小车每一个部分之间在运动过程中不会出现位移,因此,每一个部分之间的线速度是相同的,而角速度需要转化。
如下图所示,
代码分析:
self.left_vel = self.dx - self.dr * self.wheel_dist / 2
self.right_vel = self.dx + self.dr * self.wheel_dist / 2
原理公式:
l
e
f
t
V
e
l
=
V
x
−
V
θ
∗
w
h
e
e
l
D
i
s
t
/
2
leftVel = V_x-V_\theta*wheelDist/2
leftVel=Vx−Vθ∗wheelDist/2
r
i
g
h
t
V
e
l
=
V
x
+
V
θ
∗
w
h
e
e
l
D
i
s
t
/
2
rightVel = V_x+V_\theta*wheelDist/2
rightVel=Vx+Vθ∗wheelDist/2
其中,wheelDist就是图中的wheel_dist是指两个车轮之间的间距。
2,代码片段
关于订阅 /cmd_vel 的话题就不写了,了解到这的都应该是掌握了ROS的基本原理的。
def calculate_pub(self):
self.left_vel = self.dx - self.dr * self.wheel_dist / 2
self.right_vel = self.dx + self.dr * self.wheel_dist / 2
rospy.loginfo("the left_vel = %f, right_vel = %f" % (self.left_vel, self.right_vel))
return self.left_vel, self.right_vel
注意这里得到的是左右轮的线速度,需要依据车轮半径进行换算
r
p
m
:
v
=
2
∗
π
∗
R
∗
n
(
单
位
r
/
m
i
n
)
rpm: v=2*\pi*R*n (单位r/min)
rpm:v=2∗π∗R∗n(单位r/min)
其中 n 为车轮转速; R 为车轮半径;rpm是转速每分钟。
v = 2 ∗ π ∗ R ∗ n / 60 ( 单 位 r / s ) v=2*\pi*R*n /60 (单位r/s) v=2∗π∗R∗n/60(单位r/s)