硬件:掌控板+麦昆小车
软件:Jupyter
1、硬件准备:掌控板烧录(烧录文件在附件里)
在Mind+里,进行掌控板烧录
1.1选上传模式
1.2扩展选掌控板
1.3在Arduino C里面选microPython
1.4手动编辑输入shaolu.py文件内容,在71行代码:mywifi.connectWiFI("aicamp","aicamp123"),修改为自己的wifi账号和密码
1.5 烧录成功,掌控板会显示IP地址
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()
效果图:
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()
效果图:
姿态关键点图和手势关键点图
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算法挑战现场任务:月球八段锦巡线推物挑战赛【本地完成】
有兴趣的朋友,可以自己去官网体验!
easy猿2024.06.03
老师这个xedu库能分享下吗
tongtong203362024.06.14
https://www.openinnolab.org.cn/pjedu/home浦育平台有库
花生编程2024.04.21
赞赞赞
花生编程2024.04.21
厉害厉害
三春牛-创客2024.04.20
不错不错
三春牛-创客2024.04.20
厉害厉害
rzegkly2024.04.14
很好的案例,学习了
tongtong203362024.04.14
谢谢~
匿名
该评论已删除
easy猿2024.06.30
谢谢老师