我创建了让TurtleBot2跟随我的代码,依赖于检测我的脸,并选择了0.2 m/s的速度值。
我的问题是当我的脸突然消失时机器人的移动使turtlebot突然停止,我需要像这个图形enter link description here一样逐渐降低它的速度
我在ROS时代的经历并不好
我需要它从零开始计数,每次它弄丢我的脸。我的问题在我的代码中,一旦运行代码,无论是丢脸还是not.in这一行,时间都在不断增加
v = self.twist.linear.x = (-0.07 * t + 0.2)
我的完整代码:
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
from geometry_msgs.msg import Twist
import cv2, cv_bridge
face_cascade = cv2.CascadeClassifier('/home/redhwan/1/run-webcam/Face-Detect-Demo-by-Ali-master/haarcascade_frontalface_default.xml' )
class Face_detection:
def __init__(self):
self.bridge = cv_bridge.CvBridge()
self.starting_time = rospy.get_rostime().to_sec()
self.save_time = True
self.image_sub = rospy.Subscriber('/usb_cam/image_raw',Image, self.image_callback)
self.cmd_vel_pub = rospy.Publisher('/cmd_vel_mux/input/teleop',Twist, queue_size=1)
self.twist = Twist()
def image_callback(self, msg):
image = self.bridge.imgmsg_to_cv2(msg,desired_encoding='bgr8')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale( gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30),flags=cv2.cv2.CASCADE_SCALE_IMAGE)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
self.twist.linear.x = 0.2
self.cmd_vel_pub.publish(self.twist)
cv2.imshow('face ', image)
cv2.waitKey(3)
if(type(faces) == tuple):
if(self.save_time == False):
# self.save_time = False #Condition only the first time
self.starting_time = rospy.get_rostime().to_sec() #save the current time
now = rospy.get_rostime().to_sec()
# self.save_time == False
t = (now - self.starting_time)
print ('t',t)
if t <2.9:
v = self.twist.linear.x = (-0.07 * t + 0.2)
print v
self.cmd_vel_pub.publish(self.twist)
if t >= 2.9:
v = self.twist.linear.x = 0
print v
self.cmd_vel_pub.publish(self.twist)
rospy.init_node('face_detection')
follower = Face_detection()
rospy.spin()
请帮帮我
提前感谢
发布于 2019-03-12 03:41:33
如果你需要做的就是让turtlebot的动作更流畅。您可能会发现velocity smoother package将满足您的需求。您可以通过运行以下命令来安装它:sudo apt install ros-kinetic-yocs-velocity-smoother
该节点采用原始速度输入,并根据加速度参数对其进行过滤。因此,您可以将cmd_velocity_mux输出重新映射到raw_cmd_vel,并将平滑的输出smooth_cmd_vel重新映射到turlebot的输入。
https://stackoverflow.com/questions/55097239
复制相似问题