我想问一下,机器人跟随代码里的一个问题


#1
while not ctrl_c:
            try:
                (trans,rot) = listener.lookupTransform(follower_model_frame, model_to_be_followed_frame, rospy.Time(0))
            except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
                continue
            angular = 4 * math.atan2(trans[1], trans[0])
            linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)
            cmd = geometry_msgs.msg.Twist()
            if 2*linear>1:            
            	cmd.linear.x = linear*0.2
            	cmd.angular.z = -angular*0.1
            else:
            	cmd.linear.x =0
            	cmd.angular.z =0
            turtle_vel.publish(cmd)
            rate.sleep()

上面是机器人跟随的部分代码,我想问的是:

angular = 4 * math.atan2(trans[1], trans[0])
linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)

计算角速度和线速度时,为什么要分别 乘以4 和 0.5 ?


#2

我认为这个4和0.5是控制参数,不知道你有没有学过控制哈,或者PID有没有了解过?

angular = 4 * math.atan2(trans[1], trans[0])  # 这里可以简化为angular=4*theta,theta是两机器人前进方向之间的夹角,可以理解为角度差
linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)  # 这里写成linear=0.5*z,z是他们之间的距离差

两个差值其实就是误差,给他一个系数,可以理解为PID中的P(比例),通过这个比例控制器来调整机器人的角速度和线速度,减小误差。

以上,个人理解,欢迎讨论。


#3

确实,我发现去掉参数之后,机器人在转向的时候会有震荡


#4

确切的说,你不是「去掉」了参数,而是把参数改为了1。:smiley: