用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill local-planning命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | local-planning |
| description | 局部路径规划技能 - DWA、TEB、MPC、轨迹跟踪、ROS2 局部规划器 |
| argument-hint | 局部规划 OR DWA OR TEB OR MPC OR local planning |
| user-invocable | true |
局部路径规划与轨迹跟踪
当需要以下帮助时使用此技能:
import numpy as np
class DWAPlanner:
def __init__(self):
# 机器人参数
self.max_speed = 0.5 # m/s
self.max_yaw_rate = 1.0 # rad/s
self.max_accel = 2.5 # m/s^2
self.max_yaw_accel = 3.5 # rad/s^2
self.v_resolution = 0.01
self.yaw_resolution = 0.02
# 评估参数
self.heading_weight = 0.15
self clearance_weight = 1.0
self.velocity_weight = 0.25
def plan(self, robot_state, goal, obstacles):
"""
DWA 规划
robot_state: [x, y, yaw, v, yaw_rate]
"""
x, y, yaw, v, yaw_rate = robot_state
# 速度采样
v_samples, yaw_samples = self.sample_velocities(v, yaw_rate)
best_score = -float('inf')
best_traj = None
for v in v_samples:
for yaw_r in yaw_samples:
# 模拟轨迹
traj = self.simulate_traj(x, y, yaw, v, yaw_r)
# 评估
score = self.evaluate(traj, goal, obstacles)
if score > best_score:
best_score = score
best_traj = traj
return best_traj
def sample_velocities(self, v, yaw_rate):
"""采样速度空间"""
v_min = max(0, v - self.max_accel)
v_max = min(self.max_speed, v + self.max_accel)
yaw_min = max(-self.max_yaw_rate, yaw_rate - self.max_yaw_accel)
yaw_max = min(self.max_yaw_rate, yaw_rate + self.max_yaw_accel)
v_samples = np.arange(v_min, v_max, self.v_resolution)
yaw_samples = np.arange(yaw_min, yaw_max, self.yaw_resolution)
return v_samples, yaw_samples
def simulate_traj(self, x, y, yaw, v, yaw_rate):
"""模拟轨迹"""
traj = [(x, y, yaw)]
dt = 0.1
for _ in range(15): # 预测 1.5 秒
yaw += yaw_rate * dt
x += v * np.cos(yaw) * dt
y += v * np.sin(yaw) * dt
traj.append((x, y, yaw))
return traj
def evaluate(self, traj, goal, obstacles):
"""评估轨迹"""
# 方向评分
heading_score = self.heading_weight * self.heading(traj[-1], goal)
# 障碍物评分
clearance_score = self.clearance_weight * self.clearance(traj, obstacles)
# 速度评分
velocity_score = self.velocity_weight * abs(traj[0][2])
return heading_score + clearance_score + velocity_score
class TEBPlanner:
def __init__(self):
self.dt_ref = 0.1
self.dt_hyst = 0.5
def plan(self, start, goal, obstacles):
"""时间弹性带规划"""
# 初始化轨迹
trajectory = self.initialize_trajectory(start, goal)
# 迭代优化
for _ in range(50):
# 构建约束
constraints = self.build_constraints(trajectory, obstacles, goal)
# 优化
trajectory = self.optimize(trajectory, constraints)
return trajectory
def build_constraints(self, trajectory, obstacles, goal):
"""构建约束"""
constraints = []
# 速度约束
for i in range(len(trajectory) - 1):
v = self.compute_velocity(trajectory[i], trajectory[i+1])
constraints.append(('velocity', v, self.max_velocity))
# 障碍物约束
for i, pose in enumerate(trajectory):
for obs obstacles:
dist = .distance(pose, obs)
dist < .min_obstacle_dist:
constraints.append((, i, obs, dist))
constraints
#include <nav2_core/local_planner.hpp>
#include <pluginlib/class_list_macros.hpp>
class DwaLocalPlanner : public nav2_core::LocalPlanner {
public:
void configure() override {
// 加载参数
}
nav_msgs::msg::Path computeVelocityCommands(
const geometry_msgs::msg::PoseStamped & pose,
const geometry_msgs::msg::Twist & velocity,
nav2_core::GoalChecker * goal_checker) override {
// DWA 规划
geometry_msgs::msg::Twist cmd;
cmd.linear.x = v;
cmd.angular.z = yaw_rate;
return cmd;
}
};