pico_k210物体检测

1.k210和pico通信

1.1 实验前提

本教程使用的是pico,k210要运行K210-AI(stm32_pico_arduino)里面的程序才能开始实验

pico *1

k210视角模块 1(要有sd卡(里面有带AI的模型)、摄像头)

usb转ttl模块1

1.2 实验接线

接线如图所示:

 

1.3主要代码解析

u1 = UART(1, baudrate=115200, tx=Pin(8), rx=Pin(9), bits=8, parity=None, stop=0)  # 设置波特率和串口号
​
k210_data_class = 0     #例程编号
k210_data_x = 0         #横坐标
k210_data_y = 0         #纵坐标
k210_data_w = 0         #宽度
k210_data_h = 0         #长度
k210_data_id = 0        #标签
k210_data_msg = ""      #信息
​
​
while True:
    while u1.any() >0:
        rxx=u1.read()
        #u1.write(rxx)
        recv_k210_data(rxx) #处理收到的k210信息
    
    if k210_data_class != 0:
        #是物体检测的例程
        if k210_data_class == 9:
            sstr = "x="+str(k210_data_x)  +" y="+str(k210_data_y)  +" w="+str(k210_data_w)  +" h="+str(k210_data_h) +"\r\n"
            u1.write(sstr)
            u1.write(k210_data_msg+'\r\n')
        k210_data_class = 0
​

 

由程序可得

  • k210_data_class :例程编号
  • k210_data_x :是识别出来框左上角的横坐标(范围:0-240)
  • k210_data_y :是识别出来框左上角的纵坐标(范围:0-320)
  • k210_data_w :是识别出来框的宽度(范围:0-240)
  • k210_data_h :是识别出来框的长度(范围:0-320)
  • k210_data_id :是识别出来的标签
  • k210_data_msg :是识别出来的信息

这个处理主要是接到了k210的信息,调用recv_k210_data()进行处理,并把处理完的信息赋值给k210_data_XXX的成员。 注意 如果想二次开发,在不改动k210程序和处理数据的函数前提下,直接调用k210_data_XXX的变量就好(xxx:指的是x\y\w\h\id\msg)

1.4实验现象

  1. 连接好线后,k210视角模块可以脱机运行 k210脱机运行方法
  2. 串口助手设置成如图的界面

    image-2023060700004

  3. 把pico的python固件下进pico,运行本教程提供的物体检测的程序,如何运行pico的python程序,请看pico相关的环境搭建教程,本教程不在阐述
  4. 然后k210跑相关的例程,串口助手就会打印出k210传输给pico的重要信息,下图的现象是物体检测的结果

    image-2023060700005

    本例程只输出x\y\w\h\msg的这5个成员数据 msg:信息是内容为(0.飞机、1.自行车、2.鸟、3.船、4.瓶子、5.公交车、6.小汽车、7.猫、8.椅子、9.奶牛、10.餐桌、11.狗、12.马、13.摩托车、14.人、15.盆栽、16.绵羊、17.沙发、18.火车、19.显示器)
Unity Pico G2手柄可以通过代码来获取手柄当前所在的位置和旋转角度,并将其用于操作物体。一般的做法是将手柄的位置和旋转信息与物体的位置和旋转信息进行关联,实现手柄对物体的操作。具体实现方式可以参考Pico SDK提供的示例代码和文档。 例如,下面的代码可以实现手柄对物体的移动和旋转操作: ```csharp public class ObjectController : MonoBehaviour { // 手柄对象 public GameObject controller; // 物体距离手柄的距离 public float distance = 0.1f; // 物体跟随手柄移动的速度 public float moveSpeed = 5f; // 物体跟随手柄旋转的速度 public float rotateSpeed = 5f; // 物体的刚体组件 private Rigidbody rb; // 手柄的Transform组件 private Transform controllerTransform; // 手柄上次的位置和旋转 private Vector3 lastPosition; private Quaternion lastRotation; // 物体距离手柄的初始位置和旋转 private Vector3 initialPosition; private Quaternion initialRotation; void Start() { // 获取物体的刚体组件 rb = GetComponent<Rigidbody>(); // 获取手柄的Transform组件 controllerTransform = controller.transform; // 记录物体的初始位置和旋转 initialPosition = transform.position; initialRotation = transform.rotation; } void Update() { // 计算手柄的位移和旋转 Vector3 deltaPosition = controllerTransform.position - lastPosition; Quaternion deltaRotation = controllerTransform.rotation * Quaternion.Inverse(lastRotation); // 更新物体的位置和旋转 transform.position = controllerTransform.position - deltaPosition.normalized * distance; transform.rotation = deltaRotation * transform.rotation; // 记录手柄的位置和旋转 lastPosition = controllerTransform.position; lastRotation = controllerTransform.rotation; } void FixedUpdate() { // 计算物体跟随手柄移动的速度 Vector3 velocity = (transform.position - rb.position) * moveSpeed; // 计算物体跟随手柄旋转的速度 Quaternion rotation = Quaternion.FromToRotation(transform.forward, controllerTransform.forward); Vector3 angularVelocity = rotation.eulerAngles * rotateSpeed; // 应用力和扭矩 rb.AddForce(velocity, ForceMode.VelocityChange); rb.AddTorque(angularVelocity, ForceMode.VelocityChange); } // 重置物体的位置和旋转 public void Reset() { transform.position = initialPosition; transform.rotation = initialRotation; } } ``` 在这个例子中,物体的移动和旋转都是由手柄的移动和旋转来驱动的,通过计算手柄的位移和旋转,可以更新物体的位置和旋转。在FixedUpdate()函数中,将物体跟随手柄的速度转换为力和扭矩应用到物体上,实现物体随着手柄的移动和旋转而移动和旋转的效果。通过调整moveSpeed和rotateSpeed参数,可以控制物体跟随手柄移动和旋转的速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值