回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

关键点检测控制麦昆小车 中等

头像 tongtong20336 2024.04.08 476 6

硬件:掌控板+麦昆小车

软件:Jupyter

 

1、硬件准备:掌控板烧录(烧录文件在附件里)

在Mind+里,进行掌控板烧录
 1.1选上传模式

image.png

1.2扩展选掌控板

image.png

1.3在Arduino C里面选microPython

image.png

 

1.4手动编辑输入shaolu.py文件内容,在71行代码:mywifi.connectWiFI("aicamp","aicamp123"),修改为自己的wifi账号和密码

image.png

1.5 烧录成功,掌控板会显示IP地址

image.jpeg

2、无线控制小车

2.1实现小车直行和原地旋转

代码
from xedugpio import * # 导入库
import time

host = "192.168.31.40" # TCP服务端的IP地址(根据自己掌控板烧录的地址进行修改)
car = CarComm(host) # 实例化小车对象
time.sleep(1) # 等待小车连接
start_time = time.time() # 设置开始时间

while True: # 使用循环语句控制小车
time_flow = time.time()-start_time # 程序运行的时间
#直行2秒
if time_flow < 2:
speedL = 50 # 设置左轮速度
speedR = 50 # 设置右轮速度
#左转0.5秒
elif time_flow < 5:
speedL = -50 # 设置左轮速度
speedR = 50 # 设置右轮速度
else:
#停止
speedL = 0 # 设置左轮速度
speedR = 0 # 设置右轮速度
car.speed(speedL,speedR) # 将速度控制命令发送到小车
if time_flow > 5: # 退出循环
break
time.sleep(0.5)

2.2无线控制小车舵机

代码
Python
# 导入库
from xedugpio import *
import time

host = "192.168.2.65"           # TCP服务端的IP地址(根据自己掌控板烧录的地址进行修改)
car = CarComm(host)               # 实例化小车对象
time.sleep(1)                     # 等待连接

start_time = time.time()
while True:
    time_flow = time.time()-start_time  # 程序运行的时间
    if time_flow > 4:
        car.servo(90)
    elif time_flow > 3:
        car.servo(0)
    elif time_flow > 2:
        car.servo(90)
    elif time_flow > 1:
        car.servo(0)
    if time_flow > 5:                   # 退出循环
        break

3、测试调用摄像头实时检测

3.1实现调用电脑摄像头,对视频中的每一帧图像进行姿态检测。关闭摄像头先选中视频框,按“Q”,再按回车“Enter”,即可终止代码运行。调用摄像头代码实现:

代码
# 导入库
import time
import cv2

cap = cv2.VideoCapture(0) # 调用摄像头
while cap.isOpened():
   ret, frame = cap.read()
   if not ret:
       break
   cv2.imshow('video', frame)
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break

# 释放摄像头,按“Q”,再按回车“Enter”,即可终止代码运行 
cap.release()
cv2.destroyAllWindows()

3.2实时全身关键点推理代码实现:(以下用的是det_body目标检测模型,poss_body17——poss模型,检测的是全身关键点,并打印输出10右腕的y轴坐标)

 

代码
# 导入库
from xedu.hub import Workflow as wf
import cv2

cap = cv2.VideoCapture(0)     # 调用摄像头

det  = wf(task='det_body')    # 实例化目标检测模型
body = wf(task='pose_body17') # 实例化pose模型

while cap.isOpened():
   ret, frame = cap.read()
   if not ret:
       break
   bboxs = det.inference(data=frame) # 目标检测推理
   if len(bboxs):
       keypoints, new_img = body.inference(data=frame, img_type='cv2', bbox=bboxs[0]) # 进行推理,同时返回结果和带标注的图片
       if len(keypoints):
           print("10右腕的y轴坐标为:y=" + str(keypoints[10][1]))
   cv2.imshow('video', new_img)
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break    
cap.release()
cv2.destroyAllWindows()

效果图:

微信图片_20240408124712.jpg

3.3实时手部关键点推理代码实现:(以下用的是det_hand目标检测模型,pose_hand21——poss模型,检测的是手部关键点)

代码
from xedu.hub import Workflow as wf
import cv2
cap = cv2.VideoCapture(0) # 调用摄像头

det  = wf(task='det_hand')  # 实例化目标检测模型
hand = wf(task='pose_hand21') # 实例化pose模型

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    bboxs = det.inference(data=frame)# 进行推理
    img = frame
    for i in bboxs:
        keypoints,img =hand.inference(data=img,img_type='cv2',bbox=i) # 进行推理
    for [x1,y1,x2,y2] in bboxs: # 画检测框
        cv2.rectangle(img, (int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),2)
    cv2.imshow('video', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):# 按q键再按回车即可退出
        break    
cap.release()
cv2.destroyAllWindows()

效果图:

微信图片_20240408124719.jpg

姿态关键点图和手势关键点图

 

                    image.png                   微信图片_20240408125824.jpg           

4.姿态控制小车:

4.1姿态控制舵机代码实现

代码
from xedugpio import *
from xedu.hub import Workflow as wf
import time
import cv2

host = "192.168.2.45"          # TCP服务端的IP地址      
car = CarComm(host)            # 设置要连接的服务器端的IP和端口,并连接
time.sleep(1)                  # 等待连接
cap = cv2.VideoCapture(0)      # 调用摄像头
det = wf(task='det_body')      # 实例化det模型
body = wf(task='pose_body17')  # 实例化pose模型

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    bboxs = det.inference(data=frame) # 目标检测推理
    if len(bboxs):
        keypoints, new_img = body.inference(data=frame,img_type='cv2',bbox=bboxs[0]) # 进行推理,同时返回结果和带标注的图片
        dis = abs(keypoints[8][0]-keypoints[7][0]) # 计算两只手的距离
        if dis<100:   #当距离小于100时铲子向前旋转90度
            car.servo(90)
        elif dis>300: #当距离大于300时铲子回到原位
            car.servo(0)
    cv2.imshow('video', new_img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break    

# 释放摄像头   
cap.release()
cv2.destroyAllWindows()

4.2姿态控制小车行走代码实现

通过计算两只手之间的横坐标距离,控制小车前进,后退,停止

代码
from xedu.hub import Workflow as wf
import time
import cv2
from xedugpio import *
host = "192.168.2.65"           # TCP服务端的IP地址      
car = CarComm(host)              # 设置要连接的服务器端的IP和端口,并连接
time.sleep(1)                    # 等待小车连接
cap = cv2.VideoCapture(0)

det  = wf(task='det_body')       # 实例化目标检测模型
body = wf(task='pose_body17')    # 实例化关键点检测模型

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    bboxs = det.inference(data=frame) # 目标检测推理
    if len(bboxs):
        keypoints, new_img = body.inference(data=frame, img_type='cv2', bbox=bboxs[0]) # 进行推理,同时返回结果和带标注的图片
        dis = abs(keypoints[10][0]-keypoints[9][0]) # 计算两只手之间的横坐标距离
    if dis<100:
                speedL = speedR = -30 #后退
    elif dis<200:
                speedL = speedR = 30  #前进
    elif dis>400:
                speedL = speedR = 0  #停止

    car.speed(speedL, speedR)  # 发送小车速度指令
    cv2.imshow('video', new_img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break    
cap.release()
cv2.destroyAllWindows()

后记:暂时只做到了检测人体关键点后,分开控制舵机和小车的前进、后退和停车。小车的左右转弯程序还未完善,未完待续……

 

项目中程序框架源于浦育平台——AI算法挑战现场任务:月球八段锦巡线推物挑战赛【本地完成】

 

有兴趣的朋友,可以自己去官网体验!

image.png

评论

user-avatar
  • 花生编程

    花生编程2024.04.21

    赞赞赞

    0
    • 花生编程

      花生编程2024.04.21

      厉害厉害

      0
      • 三春牛-创客

        三春牛-创客2024.04.20

        不错不错

        0
        • 三春牛-创客

          三春牛-创客2024.04.20

          厉害厉害

          0
          • rzegkly

            rzegkly2024.04.14

            很好的案例,学习了

            1
            • tongtong20336

              tongtong203362024.04.14

              谢谢~