URL参数的获取方法

1、正则法

function getQueryParam(key) {
    const reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', 'i');
    const result = window.location.search.substr(1).match(reg);
    if (result != null) {
        return decodeURI(result[2]);
    }
    return null;
}

说明:

  • 其中"(^|&)" + key + "=([^&]*)(&|$)"
    含义:取以key开头或者以&开头以&或者以$结尾的字符串
    (^|&):匹配字符串开头或者&字符,如果其后还有正则,那么必须出现在字符串开始或&字符之后
    ([^&]*):[^&]匹配除了&之外的任意字符, ([^&]*)匹配除了&之外的任意字符 0或多次
    (&|$):匹配以&或者以$结尾的字符串
    i:表示匹配时不区分大小写
  • window.location.search.substr(1).match(reg)的意思是找出?之后匹配reg的字符串
  • substr(start,end):截取字符串
  • match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回一个数组
  • 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
  • decodeURI(result[2])的意思是对所选的字符串进行解码。

2、URLSearchParams法(需浏览器支持)
       

getQueryParam(key) {
    const url = new URL(window.location.href);
	// 然后,使用URLSearchParams获取参数
	const param = url.searchParams.get(key); // 返回 'value'
	return param;
}

3、split拆分法

function getQueryParam(queryName) {
    var query = decodeURI(window.location.search.substring(1));
    var params = query.split("&");
    for (var i = 0; i < params.length; i++) {
        var param = params[i].split("=");
        if (param[0] == queryName) { return param[1]; }
    }
    return null;
}





 

<think>嗯,用户现在想了解如何在OpenMV中通过像素点坐标计算比例系数k,来实现舵机控制。我之前已经解释过比例系数k的理论计算和实验方法,但用户现在结合了具体的OpenMV平台,可能需要更具体的步骤。 首先,用户引用的内容提到他们使用OpenMV的姿态解算算法,并且有PID控制的相关内容。所以可能需要将之前的理论应用到OpenMV的环境中。用户可能已经知道如何获取像素坐标差,但需要具体的转换方法。 用户的问是如何在OpenMV中计算k,可能涉及到摄像头视野和舵机转动角度之间的关系。需要考虑到摄像头的分辨率,比如OpenMV常见的图像尺寸是QVGA(320x240),每个像素对应的物理角度是多少。 可能需要先确定舵机的转动范围,例如舵机在水平方向可以转动180度,对应摄像头视野的某个角度范围。假设水平视野是60度,那么每个像素对应的角度是60/320 ≈ 0.1875度/像素。这时候比例系数k可能就是这个值,或者根据实际调整。 但是用户提到他们直接调用OpenMV的姿态解算算法,可能不需要自己处理四元数或欧拉角,但需要将像素偏差转换为舵机的控制量。可能需要实验调试,比如先设定一个初始k值,然后观察舵机的响应,调整k直到移动稳定。 另外,引用中提到了PID控制,所以在实际应用中可能不只是比例控制,但用户现在只关注k的计算。可能需要分步骤:先确定每个像素对应的角度变化,再通过测试调整k值,避免超调或振荡。 还要考虑OpenMV的具体函数,比如如何获取目标坐标,计算偏移量,然后应用比例系数生成PWM信号。可能需要代码示例,比如读取坐标,计算delta_x,乘以k,然后输出到舵机。 用户可能需要具体的公式和代码片段,比如将偏移量乘以k得到角度,再转换为PWM值。同时,提醒用户进行校准,比如通过实际测量移动一定像素需要的舵机角度变化,来调整k值。 最后,注意用户提到的参考资料中有OpenMV追踪小球的视频,可能可以参考那里的方法,或者结合OpenMV的库函数来简化计算。可能需要强调实验调试的重要性,因为理论计算可能会有误差,实际系统可能有机械延迟等因素。</think>在OpenMV中通过像素点坐标计算比例系数$k$实现舵机控制,需要结合机器视觉坐标系舵机物理运动范围的映射关系。以下是具体实现方法: ### 一、坐标系基础参数设定 1. **图像坐标系** OpenMV默认图像分辨率为$320×240$像素,中心点为$(160,120)$。设目标坐标为$(x_{target},y_{target})$,检测到的物体坐标为$(x_{detect},y_{detect})$,则坐标偏差为: $$ \Delta x = x_{detect} - 160,\quad \Delta y = y_{detect} - 120 $$ 2. **舵机参数** 假设云台舵机角度范围$0^\circ-180^\circ$,对应PWM脉宽范围$500-2500\mu s$。根据OpenMV硬件特性,通常采用$100Hz$ PWM频率。 ### 二、比例系数$k$计算原理 1. **视场角映射** 以OV7725镜头为例,水平视场角$60^\circ$,垂直视场角$49.5^\circ$。每个像素对应角度为: $$ k_x = \frac{60}{320} \approx 0.1875^\circ/\text{pixel},\quad k_y = \frac{49.5}{240} \approx 0.206^\circ/\text{pixel} $$ 2. **动态校准公式** 实际应用中需考虑安装误差,推荐采用标定法: ```python # 标定代码片段 delta_pixel = 50 # 已知像素偏移量 measured_angle = 9.5 # 实际测量舵机转动角度 k_calibrated = measured_angle / delta_pixel # 得到校准后的比例系数 ``` ### 三、OpenMV代码实现 ```python import pyb, sensor, image, time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=2000) pan_servo = pyb.Servo(1) # 水平舵机接P7 tilt_servo = pyb.Servo(2) # 垂直舵机接P8 # 通过实验测得比例系数 Kp_x = 0.18 # 水平方向比例系数(度/像素) Kp_y = 0.20 # 垂直方向比例系数(度/像素) def map_angle(value, in_min, in_max, out_min, out_max): return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min while True: img = sensor.snapshot() # 假设已通过算法获取目标坐标(blob.x, blob.y) if blob: dx = blob.cx() - 160 dy = blob.cy() - 120 # 计算角度增量 delta_angle_x = Kp_x * dx delta_angle_y = Kp_y * dy # 转换为PWM信号 current_pan = pan_servo.angle() current_tilt = tilt_servo.angle() new_pan = current_pan + delta_angle_x new_tilt = current_tilt + delta_angle_y # 限制舵机运动范围 new_pan = max(0, min(180, new_pan)) new_tilt = max(0, min(180, new_tilt)) pan_servo.angle(int(new_pan)) tilt_servo.angle(int(new_tilt)) ``` ### 四、优化建议 1. **非线性补偿** 在边缘区域增加补偿系数: ```python if abs(dx) > 100: Kp_x *= 0.8 # 大偏差时减小增益防止振荡 ``` 2. **速度限制** 添加角度变化率限制,参考云台控制中的防抖算法[^3]: ```python MAX_DELTA = 5 # 最大单次角度变化 delta_angle_x = max(-MAX_DELTA, min(MAX_DELTA, delta_angle_x)) ``` 3. **在线调试工具** 使用OpenMV IDE的串口终端实时调整参数: ```python print("Kp_x=%.3f, dx=%d, d_angle=%.1f" % (Kp_x, dx, delta_angle_x)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值