案例设计
运动分析
数据获取
小乌龟当前的坐标和角度
可以通过订阅/turtle1/pose获得相关的信息
控制操作
通过设置小乌龟的线速度和角速度可以让小乌龟动起来
可以通过发布数据到/turtle1/cmd_vel控制小乌龟移动
示例代码
发布者与订阅者
# 订阅位置
self.sub = self.node.create_subscription(Pose,'/turtle1/pose',self.pose_callback,10)
# 小乌龟控制发布者
self.control_pub = self.node.create_publisher(Twist,'/turtle1/cmd_vel',10)
获取小乌龟实时位置信息的回调
def pose_callback(self,pose):
self.curX = pose.x
self.curY = pose.y
self.curTheta = pose.theta
# 设置当前位置
self.xL.setText(str(self.curX))
self.yL.setText(str(self.curY))
self.thetaL.setText(str(self.curTheta))
直线运动计算
通过最简单的示例,先解决指线运动。
距离 = 速度 * 时间
速度 = 距离 / 时间
我们已知的是当前小乌龟的坐标turtle(x, y) ,和目标点dist(x, y),我们要去得到是小乌龟的速度。
首先我们需要计算出两点间的距离:
def distance(self,curX,curY,targetX,targetY):
return math.sqrt(pow(targetX-curX,2)+pow(targetY-curY,2))
其次我们需要确定的是时间time,我们可以给定一个预期的值。
我们可以将计算的结果进行运行测试。
测试发现,小乌龟默认运行的时间是1s。没有提供给我们设置时间接口。
解决时间不可控的问题
方式一:
rate = self.node.create_rate(1)
for i in range(5):
data = Twist()
data.linear.x = linearVel
data.angular.z = 0
publisher.publish(twist)
方式二:
runDistance = 0
while runDistance<distance:
data = Twist()
data.linear.x = linearVel
data.angular.z = 0
publisher.publish(twist)
runDistance += linearVel / hz
方式三:
while calcDistance(srcX, srcY, distX, distY) > 0.1:
// 获取srcX,srcY
srcX = pose->x;
srcY = pose->y;
//设置速度
data = Twist()
data.linear.x = linearVel
data.angular.z = 0
publisher.publish(twist)
rate.sleep();
}
思考:是否存在完美的事物
- 速度是否是绝对平均
- 距离差值是否是绝对为0
- 时间是否绝对为预期