23、树莓派Pico机器人定位与建模:IMU与蒙特卡罗方法的应用

树莓派Pico机器人定位与建模:IMU与蒙特卡罗方法的应用

1. IMU与机器人航向控制

IMU(惯性测量单元)可用于控制机器人的航向。首先要学会连接和校准该设备,之后将传感器数据与PID控制器结合,利用其数据使机器人朝向北方。还可以在此基础上,让机器人从当前航向转动指定的角度。

为了加深对相关主题的理解并优化机器人代码,可进行以下练习:
- 将上述行为与之前提到的UART菜单系统结合,这样就能在机器人运行时调整PID参数。
- 利用已知的转弯和直线行驶行为,编写一个更优的路径规划程序。
- 对欧拉航向读数进行实验,校准后观察将机器人靠近笔记本电脑或厨房电器等物体时读数的变化,这能体现此类传感器的弱点。
- 高级实验可提取四元数(而非欧拉数据)并将其写入UART。

2. 蒙特卡罗定位法概述

目前机器人配备了多个有趣的传感器,但尚未将它们结合起来确定机器人的位置。蒙特卡罗模拟方法利用多个传感器和机器人所处环境的模型,来估算其在该环境中的位置和航向。

需要完成以下工作:
- 为机器人制作一个测试场地。
- 用代码对该场地进行建模。
- 通过蓝牙将数据发送到计算机进行查看。
- 运用统计方法让机器人开始猜测自身位置。
- 丰富编码器数据并移动猜测位置,再结合距离传感器数据优化猜测结果,该方法能有效处理有噪声的传感器数据并应对微小误差,最终形成一个蒙特卡罗猜测与验证的循环。

3. 技术要求

进行相关操作需要以下条件:
- 具备检测方向功能的机器人及相应代码。
- 带有蓝牙低功耗(BLE)功能的PC或笔记本电脑。
- 安装了Python 3.7以及matplotlib、bleak和NumPy库的环境。
- 10 x 10 - mm的A1泡沫板。
- 胶带(如布基胶带或电工胶带)。
- 卷尺。
- 金属直尺、三角板和铅笔。
- 锋利的美工刀。
- 1.5平方米的地面空间。

代码可在指定链接获取。

4. 创建机器人训练场地

为了估算机器人在空间中的位置,需要为其构建一个已知的工作空间,即训练场地或竞技场。该场地的设计参考了英国机器人竞赛Pi Wars的场地构建规则,此算法可用于机器人的自主竞赛。

4.1 场地设计

场地大致为方形,便于制作和建模。为了使蒙特卡罗模拟有效,一侧设有切口以避免旋转对称性。场地大小为1500mm较为合适,既让机器人能自由移动,又不过于庞大。场地墙壁高度应保证机器人的距离传感器能检测到,合理高度约为200mm,本章统一使用毫米为单位。

需要注意的是,对于速度较快的机器人,可能需要更大的场地;场地地面表面也很重要,若机器人轮子打滑,会影响计算精度。

4.2 场地制作

使用泡沫板制作场地,因其轻便且易于切割,A1板很容易获取,可从中切割出所需面板。

制作步骤如下:
- 用卷尺、大直尺和三角板用铅笔标记切割位置,确保切割表面高度舒适,避免长时间重复切割导致背部酸痛。
- 沿着直的金属边缘,用锋利的刀多次切割。第一次切割时,仅划破顶部塑料层,然后持续切割直至穿透。注意保持切割位置一致,后续切割可轻靠先前的切割痕迹。
- 建议先切割墙壁高度的条带,再标记插槽和墙壁长度。
- 这些板材通常夹有可丢弃的泡沫垫,可作为切割表面,防止损坏桌面或地板。
- 若出现撕裂情况,可能是压力过大或刀片变钝,需更换锋利的新刀片。
- 切割插槽时要小心,墙壁高度无需非常精确,误差在几毫米内即可。
- 切割好部件后,组装场地的角落,然后在内部连接处(非插槽处)制作胶带铰链。首次拆卸时,沿这些铰链折叠部件,再在外部贴上胶带,使用布基胶带或电工胶带应足够坚固。

5. 空间建模

蒙特卡罗系统的目标是对空间和机器人位置进行建模或模拟。需要了解如何用代码表示这个空间,以及如何利用计算机可视化机器人的猜测位置。基于蒙特卡罗的行为代码会频繁将传感器读数与空间模型进行对比,因此应在机器人上表示该空间以优化此过程。

5.1 用数字表示场地和机器人位置

对于此类模型,场地边界很重要。可通过获取场地角落的二维X和Y坐标来表示。场地左下角坐标为(0, 0),航向0指向右侧,正的θ角逆时针旋转。

机器人在场地内有一个姿态,由X和Y坐标(毫米)以及航向θ(度)表示。在模拟开始时,机器人可能处于场地内的任意位置并朝向任意方向。

在这个系统中,有许多姿态估计值,它们类似于粒子,蒙特卡罗模拟也被称为粒子滤波器,因为姿态会根据传感器数据进行操作和过滤。

5.2 将表示转换为代码

将场地用代码表示并在计算机上渲染,然后将场地表示数据转移到机器人上,让计算机从机器人获取数据。

创建 arena.py 文件并添加以下代码:

width = 1500
height = 1500
cutout_width = 500
cutout_height = 500
boundary_lines = [
    [(0,0), (0, height)],
    [(0, height), (width, height)],
    [(width, height), (width, cutout_height)],
    [(width, cutout_height), (width - cutout_width, cutout_height)],
    [(width - cutout_width, cutout_height), (width - cutout_width, 0)],
    [(width - cutout_width, 0), (0, 0)],
]

boundary_lines 变量表示一系列线段,每个线段是一个包含起点和终点坐标的数组。同时存储了场地的宽度和高度值,若场地尺寸不同,需更新这些值。

使用Python的matplotlib库显示场地,先在计算机上安装Python 3.7(或更高版本),在终端中使用 python3 -m pip install matplotlib numpy 命令安装所需库,对于Linux系统,可能需要在包管理器中安装额外的 python3 - tk 包。

创建 display_arena.py 文件绘制场地:

from matplotlib import pyplot as plt
import arena
for line in arena.boundary_lines:
    plt.plot([line[0][0], line[1][0]], [line[0][1], line[1][1]], color="black")
plt.show()

运行 python3 display_arena.py 即可绘制出场地。

5.3 从机器人提供场地数据

机器人应作为场地数据的真实来源,将 arena.py 文件移动到计算机上的 robot 文件夹中,并将 robot.py pid_controller.py pio_encoder.py 复制到该文件夹,之后将该文件夹内容复制到树莓派Pico中。

robot/code.py 中添加以下代码:

import asyncio
import json
import arena
import robot
def send_json(data):
    robot.uart.write((json.dumps(data)+"\n").encode())
def read_json():
    data = robot.uart.readline()
    decoded = data.decode()
    return json.loads(decoded)
async def command_handler():
    print("Starting handler")
    while True:
        if robot.uart.in_waiting:
            request = read_json()
            print("Received: ", request)
            if request["command"] == "arena":
                send_json({
                    "arena": arena.boundary_lines,
                })
        await asyncio.sleep(0.1)
asyncio.run(command_handler())

机器人可通过Bluefruit应用程序在UART模式下接收 {"command": "arena"} 命令,并以列表形式返回边界线数据。理想情况下,希望计算机使用matplotlib显示这些数据,这需要先将计算机与机器人连接。

6. Bleak库的使用

Bleak是一个Python库,可让计算机上的Python与蓝牙低功耗设备进行连接和交互。在终端中使用 python3 -m pip install bleak 进行安装,其文档可在指定链接查看。

还需要了解Adafruit Bluefruit系统的相关信息,蓝牙低功耗有设备ID和服务ID。

创建 find_devices.py 文件检查是否能找到机器人的蓝牙UART:

import asyncio
import bleak
async def run():
    ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
    ble_name = "Adafruit Bluefruit LE"
    devices = await bleak.BleakScanner.discover(service_uuids=[ble_uuid])
    print(f"Found {len(devices)} devices")
    print([device.name for device in devices])
    matching_devices = [device for device in devices if device.name==ble_name]
    if len(matching_devices) == 0:
        raise RuntimeError("Could not find robot")
    ble_device_info = matching_devices[0]
    print(f"Found robot {ble_device_info.name}...")
asyncio.run(run())

运行 python3 find_devices.py ,若机器人关闭,会显示找不到机器人的错误;机器人开启时应显示找到机器人的信息。有时Bleak可能难以找到机器人,需重新运行该示例。

7. 创建蓝牙低功耗包装库

创建 robot_ble_connection.py 库,代码如下:

import asyncio
import bleak
class BleConnection:
    ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
    rx_gatt = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
    tx_gatt = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
    ble_name = "Adafruit Bluefruit LE"
    def __init__(self, receive_handler):
        self.ble_client = None
        self.receive_handler = receive_handler
    def _uart_handler(self, _, data: bytes):
        self.receive_handler(data)
    async def connect(self):
        print("Scanning for devices...")
        devices = await bleak.BleakScanner.discover(
            service_uuids=[self.ble_uuid]
        )
        matching_devices = [device for device in devices if device.name==self.ble_name]
        if len(matching_devices) == 0:
            raise RuntimeError("Could not find robot")
        ble_device_info = matching_devices[0]
        print(f"Found robot {ble_device_info.name}...")
        self.ble_client = bleak.BleakClient(ble_device_info.address)
        await self.ble_client.connect()
        print("Connected to {}".format(ble_device_info.name))
        self.notify_task = asyncio.create_task(
            self.ble_client.start_notify(self.rx_gatt, self._uart_handler)
        )

创建 BleConnection 类处理连接,初始化时接收一个数据接收处理函数, connect 方法用于扫描设备、连接机器人并创建一个后台任务,当有数据到达时通知处理函数。

以下是一个简单的流程图展示整个过程:

graph LR
    A[IMU与航向控制] --> B[蒙特卡罗定位法]
    B --> C[创建训练场地]
    C --> D[空间建模]
    D --> E[代码实现]
    E --> F[数据传输与连接]
    F --> G[蓝牙库使用]
    G --> H[包装库创建]

通过以上步骤,我们可以利用IMU和蒙特卡罗定位法,结合多个传感器和空间模型,实现机器人位置的有效估算和控制。在实际操作中,要严格按照技术要求准备相关设备和环境,仔细进行场地制作和代码编写,确保整个系统的正常运行。

树莓派Pico机器人定位与建模:IMU与蒙特卡罗方法的应用

8. 利用传感器跟踪相对姿态

在为机器人搭建好训练场地并完成空间建模后,接下来需要利用各种传感器来跟踪机器人的相对姿态,从而为后续的蒙特卡罗定位提供数据支持。机器人上配备了多种传感器,如编码器和距离传感器,这些传感器的数据可以帮助我们了解机器人的运动状态和与周围环境的相对位置。

  • 编码器数据的利用 :编码器可以记录机器人轮子的转动情况,通过对编码器数据的分析,我们能够得知机器人的行驶距离和转动角度。在机器人运动过程中,不断更新编码器的数据,就可以大致估算出机器人从初始位置移动的距离和方向。
  • 距离传感器数据的利用 :距离传感器可以测量机器人与周围障碍物的距离。在训练场地中,机器人可以通过距离传感器获取到与场地边界或其他物体的距离信息。将这些距离信息与空间模型相结合,能够进一步细化机器人的位置估计。

例如,当机器人在场地中移动时,距离传感器检测到与某一侧墙壁的距离发生变化,结合编码器记录的移动距离和方向,就可以更准确地判断机器人在场地中的位置。

9. 蒙特卡罗定位

蒙特卡罗定位是一种基于概率的定位方法,它通过大量的随机样本来估计机器人的位置和姿态。在这个过程中,我们将利用之前获取的编码器数据和距离传感器数据,结合空间模型,不断更新样本的权重,最终得到机器人位置的最优估计。

9.1 初始化样本

在开始蒙特卡罗定位时,我们需要在场地中随机生成大量的样本点,每个样本点代表机器人可能的位置和姿态。这些样本点的分布应该覆盖整个场地,以确保能够包含机器人的真实位置。

9.2 更新样本权重

随着机器人的运动,不断获取编码器数据和距离传感器数据。根据这些数据,计算每个样本点与实际传感器数据的匹配程度,为每个样本点分配一个权重。匹配程度越高的样本点,权重越大;匹配程度越低的样本点,权重越小。

例如,如果距离传感器检测到机器人与某一侧墙壁的距离为 500mm,而某个样本点对应的位置与该墙壁的距离也是 500mm,那么这个样本点的权重就会相对较高。

9.3 重采样

根据样本点的权重,进行重采样操作。权重较大的样本点有更大的概率被选中,而权重较小的样本点可能会被淘汰。通过重采样,使得样本点更加集中在机器人可能存在的区域,提高定位的准确性。

9.4 循环迭代

重复上述更新样本权重和重采样的过程,直到样本点收敛到一个较小的区域,此时该区域的中心位置就可以作为机器人的估计位置。

以下是蒙特卡罗定位的流程图:

graph LR
    A[初始化样本] --> B[获取传感器数据]
    B --> C[更新样本权重]
    C --> D[重采样]
    D --> E{是否收敛}
    E -- 否 --> B
    E -- 是 --> F[输出估计位置]
10. 实验与优化

在完成上述步骤后,我们可以进行实际的实验,验证蒙特卡罗定位的效果。在实验过程中,可能会遇到一些问题,如定位不准确、收敛速度慢等,需要对系统进行优化。

  • 调整样本数量 :样本数量的多少会影响定位的准确性和计算效率。如果样本数量过少,可能无法准确覆盖机器人的真实位置;如果样本数量过多,会增加计算负担。可以通过实验,找到一个合适的样本数量。
  • 优化传感器数据处理 :对编码器数据和距离传感器数据进行滤波处理,去除噪声干扰,提高数据的准确性。例如,可以使用卡尔曼滤波器对编码器数据进行处理,减少测量误差。
  • 改进空间模型 :如果发现定位结果与实际情况存在较大偏差,可能需要对空间模型进行调整。检查场地的尺寸是否准确,模型中的边界信息是否与实际场地一致。
11. 总结

通过利用 IMU 控制机器人的航向,结合蒙特卡罗定位法和多个传感器的数据,我们可以实现机器人在已知空间中的位置估算。整个过程包括创建训练场地、空间建模、传感器数据利用、蒙特卡罗定位以及实验优化等步骤。

在实际应用中,需要注意以下几点:
- 严格按照技术要求准备相关设备和环境,确保各个组件的正常运行。
- 在场地制作和代码编写过程中,要仔细检查,避免出现错误。
- 对传感器数据进行合理处理,提高数据的准确性和可靠性。
- 根据实际实验结果,不断优化系统,提高定位的精度和稳定性。

以下是整个机器人定位过程的步骤总结表格:
|步骤|描述|
|----|----|
|创建训练场地|使用泡沫板制作一个大小合适、具有特定形状的场地,确保机器人能自由移动且传感器能正常工作|
|空间建模|用代码表示场地的边界和尺寸,将其存储在机器人中,并通过计算机进行可视化|
|传感器数据利用|利用编码器和距离传感器获取机器人的运动状态和与周围环境的相对位置|
|蒙特卡罗定位|通过随机样本、更新权重和重采样等步骤,估计机器人的位置和姿态|
|实验优化|根据实验结果,调整样本数量、优化传感器数据处理和改进空间模型|

通过以上方法,我们可以让机器人在复杂环境中更准确地定位自己,为实现机器人的自主导航和任务执行提供有力支持。

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理编程实现方法,重点聚焦于直流最优潮流模型的构建求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现学习。此外,文档还列举了大量电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模求解的理解。
本程序为针对江苏省中医院挂号系统设计的自动化预约工具,采用Python语言编写。项目压缩包内包含核心配置文件主执行文件。 配置文件conf.ini中,用户需根据自身情况调整身份验证参数:可填写用户名密码,或直接使用有效的身份令牌(若提供令牌则无需填写前两项)。其余配置项通常无需更改。 主文件main.py包含两项核心功能: 1. 预约测试模块:用于验证程序运行状态及预约流程的完整性。执行后将逐步引导用户选择院区、科室类别、具体科室、医师、就诊日期、时段及具体时间,最后确认就诊卡信息。成功预约后将返回包含预约编号及提示信息的结构化结果。 2. 监控预约模块:可持续监测指定医师在设定日期范围内的可预约时段。一旦检测到空闲号源,将自动完成预约操作。该模块默认以10秒为间隔循环检测,成功预约后仍会持续运行直至手动终止。用户需注意在预约成功后及时完成费用支付以确认挂号。 程序运行时会显示相关技术支持信息,包括采用的验证码识别组件及训练数据来源。操作界面采用分步交互方式,通过输入序号完成各环节选择。所有网络请求均经过结构化处理,返回结果包含明确的状态码执行耗时。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值