欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 亚博microros小车-原生ubuntu支持系列:25 二维码控制运动

亚博microros小车-原生ubuntu支持系列:25 二维码控制运动

2025/2/11 4:58:58 来源:https://blog.csdn.net/bohu83/article/details/145517830  浏览:    关键词:亚博microros小车-原生ubuntu支持系列:25 二维码控制运动

二维码识别

安装依赖

pip3 install pyzbarsudo apt install libzbar-dev

在用小车识别之前,先用电脑的摄像头测试下基本的识别

import cv2
import rclpy
from rclpy.node import Node
import pyzbar.pyzbar as pyzbar
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def __init__(self, name):super().__init__(name)self.cap = cv2.VideoCapture(0)  # 打开默认摄像头def run(self):while True:success, img = self.cap.read()  # 读取一帧视频if not success:print("Failed to read frame")breakfor bar_code in pyzbar.decode(img):# 解码二维码数据print(bar_code.data.decode('utf8'))  # 打印二维码数据print(bar_code.type)  # 打印二维码类型print(bar_code.rect)  # 打印二维码四周边界(矩形框)print(bar_code.polygon)  # 打印二维码多边形边框print(bar_code.quality)  # 打印二维码质量print(bar_code.orientation)  # 打印二维码方向# 绘制二维码边界points = np.array(bar_code.polygon, np.int32)points = points.reshape((-1, 1, 2))cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)# 在图像上显示二维码数据cv2.putText(img=img,text=bar_code.data.decode('utf8'),org=(bar_code.rect.left, bar_code.rect.top),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.8,color=(0, 0, 255),thickness=2)# 显示图像cv2.imshow('code', img)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):self.cap.release()  # 释放摄像头资源cv2.destroyAllWindows()  # 关闭所有OpenCV窗口break
def main():rclpy.init()node = OpenCVNode('opencvNode')node.run() rclpy.spin(node)rclpy.shutdown()

效果:

我随便找了个包装袋的条码

二维码:

玩法简介

本课程主要利用机器人的摄像头,获取摄像头的画面,识别二维码信息,根据二维码信息控制机器人运动。

#小车代理
sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:humble udp4 --port 8090 -v4
#摄像头代理(先启动代理再打开小车开关)
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:humble udp4 --port 9999 -v4

启动

ros2 run yahboom_esp32ai_car qrTracker 

开启识别二维码并执行指令。目前例程中能识别的二维码为QRCode,信息为"forward"表示前进,"back"表示后退,"left"表示左平移,"right"表示右平移,"stop"表示停止。"turnleft"表示左旋转,"turnright"表示右旋转,"stop"表示停止。

只是测试,这种不如小车键盘控制方便,因为小车运动后摄像头丢失控制图片。

src/yahboom_esp32ai_car/yahboom_esp32ai_car/目录下新建文件qrTracker.py,代码如下

import rclpy
from rclpy.node import Nodefrom std_msgs.msg import Int32, Bool,UInt16
from geometry_msgs.msg import Twist
import cv2
import time
import numpy as np
import pyzbar.pyzbar as pyzbar
from PIL import Imagefrom cv_bridge import CvBridge
from sensor_msgs.msg import Image, CompressedImagefrom rclpy.time import Time
import datetimeclass QR_Tracker(Node):def __init__(self,name):super().__init__(name)self.pub_cmdVel = self.create_publisher(Twist,"/cmd_vel",1)self.pub_Buzzer = self.create_publisher(UInt16,"/beep",1)self.pub_Servo1 = self.create_publisher(Int32,"servo_s1" , 10)self.pub_Servo2 = self.create_publisher(Int32,"servo_s2" , 10)self.PWMServo_X = 0self.PWMServo_Y = 0self.s1_init_angle = Int32()self.s1_init_angle.data = self.PWMServo_Xself.s2_init_angle = Int32()self.s2_init_angle.data = self.PWMServo_Yfor i in range(10): #确保舵机初始化角度正常self.pub_Servo2.publish(self.s2_init_angle)self.pub_Servo1.publish(self.s1_init_angle)time.sleep(0.1) #100msdef detect_qrcode(self,image):#self.pub_Servo2.publish(self.s2_init_angle)#self.pub_Servo1.publish(self.s1_init_angle)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    # 转为灰度图像 barcodes = pyzbar.decode(gray)#识别条码for barcode in barcodes:    # 提取二维码的数据和边界框的位置(x, y, w, h) = barcode.rectbarcodeData = barcode.data.decode("utf-8")barcodeType = barcode.typereturn barcodeData, (x, y, w, h)return None, (0, 0, 0, 0)def pub_vel(self, x, y, z):twist = Twist()twist.linear.x = xtwist.linear.y = ytwist.angular.z = zself.pub_cmdVel.publish(twist)#根据info的字符串命令控制机器人运动。def robot_action(self,data):if data == "forward":self.pub_vel(0.3,0.0,0.0)elif data == "back":self.pub_vel(-0.3,0.0,0.0)elif data == "left":self.pub_vel(0.0,0.0,1.0)elif data == "right":self.pub_vel(0.0,0.0,-1.0)elif data == "turnright":self.pub_vel(0.3,0.0,-0.5)elif data == "turnleft":self.pub_vel(0.3,0.0,0.5)elif data == "stop":self.pub_vel(0.0,0.0,0.0)class MY_Picture(Node):def __init__(self, name):super().__init__(name)self.bridge = CvBridge()self.sub_img = self.create_subscription(CompressedImage, '/espRos/esp32camera', self.handleTopic, 1) #获取esp32传来的图像self.QRdetect = QR_Tracker("QR_Tracker")self.last_stamp = Noneself.new_seconds = 0self.fps_seconds = 1def handleTopic(self, msg):self.last_stamp = msg.header.stamp  if self.last_stamp:total_secs = Time(nanoseconds=self.last_stamp.nanosec, seconds=self.last_stamp.sec).nanosecondsdelta = datetime.timedelta(seconds=total_secs * 1e-9)seconds = delta.total_seconds()*100if self.new_seconds != 0:self.fps_seconds = seconds - self.new_secondsself.new_seconds = seconds#保留这次的值start = time.time()frame = self.bridge.compressed_imgmsg_to_cv2(msg)frame = cv2.resize(frame, (640, 480))action = cv2.waitKey(10) & 0xFF#图像处理逻辑,识别到二维码就画框,展示文本,发布动作,没有识别到二维码就停止payload, (x, y, w, h) = self.QRdetect.detect_qrcode(frame.copy())if payload != None:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 225, 255), 2)cv2.putText(frame, payload, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 225, 255), 2)self.QRdetect.robot_action(payload)else:self.QRdetect.pub_vel(0.0,0.0,0.0)end = time.time()fps = 1 / ((end - start)+self.fps_seconds)text = "FPS : " + str(int(fps))cv2.putText(frame, text, (10,20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,255), 2)cv2.imshow('frame', frame)#rclpy.spin(self.QRdetect)def main():rclpy.init()esp_img = MY_Picture("My_Picture")print("start it")try:rclpy.spin(esp_img)except KeyboardInterrupt:passfinally:esp_img.destroy_node()rclpy.shutdown()

以上。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com