差速机器人走行模型

差速机器人走行模型讲解

 

两轮差速机器人是轮式机器人中比较常见的,这种结构的机器人只能实现一种走行方式:机器人中心绕轴线上任意一点的旋转。有人会拿直线运动来质疑,先别慌,直线也是一种旋转运动,只不过旋转半径很大

轴线,两个轮子所在圆心所在的直线

机器人中心,两个轮子圆心连线的中心点

旋转运动模型,如下图,机器人中心绕o绕轴线右侧一点O以半径R做旋转运动,此时左右轮速比为

V1/V2 = r1/r2       (1)

r1 = R + L/2, r2 = R - L/2    (2)

由(1)(2)得,

V1/V2 = (R + L/2)/(R - L/2)     (3)

式(3)中,L为轮间距,为常量,当旋转半径R趋向于无穷大时,式(3)比值趋向于1,也就是直线运动

 

可以规定圆心O在机器人中心o右侧时,R为正,反之为负,这样式(3)对于其他情况仍然适用。

 

关于轮子的方向,规定轮子逆时针旋转时速度为正,结合(3)可以通过程序实现任意的运动(可实现的)

 

举个栗子,让机器人顺时针旋转,旋转中心在靠近右轮1/4L处。

 

根据(3)V1/V2 = 3:1,左轮逆时针故为正,右轮子也是逆时针也为正,所以只要保持速度都为正,比例为3:1,即可按照给定弧线运动。

 

问题来了,比例和正负确定了,大小给定呢?我们来说说角速度和线速度的关系

V = ω*r (4)

 

线速度V是角速度ω的r(半径)倍。对于上述栗子中,想让机器人一秒钟转一周也就是2π,那么线速度V1 = 2π*r1, V2 = 2π*r2,就这!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
强化学习机器人走迷宫是一个经典的强化学习问题。在这个问题中,机器人需要在一个迷宫中找到出口。机器人可以采取不同的动作,例如向上、向下、向左或向右移动。机器人的目标是找到迷宫的出口,并且在此过程中最小化花费的步数。 为了实现这个问题,我们可以使用 Python 中的强化学习库,例如 OpenAI Gym 或者 PyTorch。我们需要定义一个 Robot 类,这个类将会实现机器人的移动和学习函数。在学习函数中,我们需要实现强化学习算法,例如 Q-learning 或者 Deep Q-Networks(DQN)算法。 在实现机器人走迷宫的过程中,我们需要使用迷宫类 Maze 来随机生成一个迷宫。我们可以使用基础搜索算法或者 DQN 算法来训练机器人。在基础搜索算法中,我们可以使用广度优先搜索(BFS)或深度优先搜索(DFS)算法来搜索迷宫。在 DQN 算法中,我们需要使用神经网络来估计每个动作的 Q 值,并且使用经验回放和目标网络来训练神经网络。 以下是一个基于 PyTorch 和 DQN 算法的机器人走迷宫的示例代码: ```python import os import random import numpy as np import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from collections import deque from maze import Maze class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 self.epsilon = 1.0 self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.learning_rate = 0.001 self.model = self._build_model() def _build_model(self): model = nn.Sequential( nn.Linear(self.state_size, 64), nn.ReLU(), nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, self.action_size) ) optimizer = optim.Adam(model.parameters(), lr=self.learning_rate) model.compile(loss='mse', optimizer=optimizer) return model def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def act(self, state): if np.random.rand() <= self.epsilon: return random.randrange(self.action_size) else: return np.argmax(self.model.predict(state)) def replay(self, batch_size): minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0])) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay class Robot: def __init__(self, maze_size): self.maze = Maze(maze_size=maze_size) self.state_size = 2 self.action_size = 4 self.agent = DQNAgent(self.state_size, self.action_size) def run(self, episodes): for e in range(episodes): state = self.maze.reset() state = np.reshape(state, [1, self.state_size]) done = False i = 0 while not done: action = self.agent.act(state) next_state, reward, done = self.maze.step(action) next_state = np.reshape(next_state, [1, self.state_size]) self.agent.remember(state, action, reward, next_state, done) state = next_state i += 1 print("episode: {}/{}, steps: {}" .format(e, episodes, i)) if len(self.agent.memory) > 32: self.agent.replay(32) robot = Robot(maze_size=10) robot.run(episodes=1000) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值