openmv 自学笔记(APRILTAG标记追踪)

由图可知 id 为5 旋转角度 为11.0

左边旋转 角度增加 正式时候调度接近0

右边旋转 角度减少 由360度 向右减少

Tx 在左边的时候 为负数 右边为正值

Ty 在上边的时候为正数 左边为负值

Tz 从远处 到近处 由负数到向正数变化

Rx :前倾斜 增加 后倾斜 减少

Rz :左侧转 增加 右侧转 减少

Ry :正右转 增加 正后转 减少

通过这个可以实现 3D 定位

例如: 小球的定位 跟物体的追踪 可以利用每个二维码独特的id 然后贴在物体上 不但可以辨识物体 也可以用来定位 可以确定一些舞台的具体位置 从而实线物体定位。

串口通信 用于与单片机之间的通信。

解答:

比如你测得的tx=0.00068,实际apriltag距离摄像头x方向80mm,那比例k就是80mm/tx

可是,那是不是x,y,z三个方向有三个k值呢 ?

d= 根号(x平方 + y平方 + z平方) K=实际距离/d

实现串口通信

# AprilTags Example
#
# This example shows the power of the OpenMV Cam to detect April Tags
# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.
import json
import sensor, image, time, math
from pyb import UART
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(30)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()
uart = UART(3, 19200)
# 注意!与find_qrcodes不同,find_apriltags 不需要软件矫正畸变就可以工作。

# 注意,输出的姿态的单位是弧度,可以转换成角度,但是位置的单位是和你的大小有关,需要等比例换算

# f_x 是x的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/3.984*656,这个值是用毫米为单位的焦距除以x方向的感光元件的长度,乘以x方向的感光元件的像素(OV7725)
# f_y 是y的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/2.952*488,这个值是用毫米为单位的焦距除以y方向的感光元件的长度,乘以y方向的感光元件的像素(OV7725)

# c_x 是图像的x中心位置
# c_y 是图像的y中心位置

f_x = (2.8 / 3.984) * 160 # 默认值
f_y = (2.8 / 2.952) * 120 # 默认值
c_x = 160 * 0.5 # 默认值(image.w * 0.5)
c_y = 120 * 0.5 # 默认值(image.h * 0.5)

def degrees(radians):
    return (180 * radians) / math.pi

while(True):
    clock.tick()
    img = sensor.snapshot()
    for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # 默认为TAG36H11
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
        print_args = (tag.x_translation(), tag.y_translation(), tag.z_translation(), \
            degrees(tag.x_rotation()), degrees(tag.y_rotation()), degrees(tag.z_rotation()))
        # 位置的单位是未知的,旋转的单位是角度
        #print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args)
        #uart.write(tag.x_translation())
        data_out = json.dumps(tag.x_translation())
        #time.sleep_ms(1000)
        print(data_out)
        uart.write(data_out)
        
        #print("Tx: %f",tag.x_translation())
   # print(clock.fps())
data_out = json.dumps(tag.x_translation())
#time.sleep_ms(1000)
print(data_out)
uart.write(data_out)

这段话需要将数据从函数提取出来,然后再进行发送,不然会报错

json.dumps()

json.dumps将一个Python数据结构转换为JSON

import json
data = {
    'name' : 'myname',
    'age' : 100,
}
json_str = json.dumps(data)

json库的一些用法

 

结果运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K11mvp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值