一键导入
ros2-control
ROS2 控制技能。PID 控制、轨迹跟踪、电机驱动、ros2_control 框架、生命周期节点。当用户提到控制器、PID、MPC、LQR、轨迹跟踪、ros2_control、电机、伺服时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
ROS2 控制技能。PID 控制、轨迹跟踪、电机驱动、ros2_control 框架、生命周期节点。当用户提到控制器、PID、MPC、LQR、轨迹跟踪、ros2_control、电机、伺服时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
ROS2 上层应用集成域。Launch 编排、参数配置、RViz 可视化、Python 节点、Gazebo/Ignition 仿真。当用户提到 launch 文件、launch.py、参数 YAML、RViz、URDF 显示、Python 节点、rclpy、Gazebo、Ignition 仿真、机器人状态发布时使用。
CCG Skills - Quality gates, documentation generator, and multi-agent orchestration. Auto-installed by CCG workflow system.
开发语言能力索引。Python、Go、Rust、TypeScript、Java、C++、Shell。当用户提到编程、开发、代码、语言时路由到此。
DevOps 能力索引。Git、测试、DevSecOps、数据库。当用户提到 DevOps、CI/CD、Git、测试时路由到此。
协同编排知识域。多Agent协同、任务分解、并行执行、冲突解决。当魔尊需要多Agent协作、任务编排、并行处理时使用。
ROS2 硬件集成技能。串口、CAN 总线、I2C/SPI、传感器驱动、udev 规则、权限配置。当用户提到串口、CAN、Modbus、ttyUSB、ttyACM、udev、设备权限、硬件抽象时使用。
| name | ros2-control |
| description | ROS2 控制技能。PID 控制、轨迹跟踪、电机驱动、ros2_control 框架、生命周期节点。当用户提到控制器、PID、MPC、LQR、轨迹跟踪、ros2_control、电机、伺服时使用。 |
| user-invocable | false |
| category | domain |
机器人执行层开发,实现各种控制算法和电机驱动。
[Controller Manager]
├── [Hardware Interface] → 物理硬件 (CAN/Modbus/Serial)
└── [Controllers] → diff_drive_controller / joint_trajectory_controller
# config/controllers.yaml
controller_manager:
ros__parameters:
update_rate: 100 # Hz
diff_drive_controller:
type: diff_drive_controller/DiffDriveController
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
diff_drive_controller:
ros__parameters:
left_wheel_names: ["left_wheel_joint"]
right_wheel_names: ["right_wheel_joint"]
wheel_separation: 0.3
wheel_radius: 0.05
publish_rate: 50.0
odom_frame_id: odom
base_frame_id: base_link
enable_odom_tf: true
cmd_vel_timeout: 0.5
class PIDController {
public:
PIDController(double kp, double ki, double kd, double dt)
: kp_(kp), ki_(ki), kd_(kd), dt_(dt)
double compute(double setpoint, double measurement) {
double error = setpoint - measurement;
integral_ += error * dt_;
integral_ = std::clamp(integral_, -i_max_, i_max_); // 抗饱和
double derivative = (error - prev_error_) / dt_;
prev_error_ = error;
return kp_ * error + ki_ * integral_ + kd_ * derivative;
}
private:
double kp_, ki_, kd_, dt_;
double integral_ = 0.0;
double prev_error_ = 0.0;
double i_max_ = 1.0;
};
class VelocityController : public rclcpp::Node {
public:
VelocityController() : Node("velocity_controller") {
// 参数声明
this->declare_parameter("kp", 1.0);
this->declare_parameter("ki", 0.1);
this->declare_parameter("kd", 0.01);
pid_ = std::make_unique<PIDController>(
this->get_parameter("kp").as_double(),
this->get_parameter("ki").as_double(),
this->get_parameter("kd").as_double(),
0.01);
// 100Hz 控制循环
timer_ = this->create_wall_timer(
std::chrono::milliseconds(10),
std::bind(&VelocityController::control_loop, this));
}
private:
void control_loop() {
double output = pid_->compute(target_velocity_, current_velocity_);
publish_motor_cmd(output);
}
};
geometry_msgs::msg::Twist computePurePursuit(
const geometry_msgs::msg::Pose& current,
const std::vector<geometry_msgs::msg::Point>& path,
double lookahead_distance) {
// 1. 找到前瞻点
auto target = findLookaheadPoint(current, path, lookahead_distance);
// 2. 计算转向角
double dx = target.x - current.position.x;
double dy = target.y - current.position.y;
double yaw = quaternionToYaw(current.orientation);
double target_angle = std::atan2(dy, dx) - yaw;
double curvature = 2.0 * std::sin(target_angle) / lookahead_distance;
// 3. 输出速度指令
geometry_msgs::msg::Twist cmd;
cmd.linear.x = max_speed_;
cmd.angular.z = curvature * cmd.linear.x;
return cmd;
}
#include <linux/can.h>
#include <sys/socket.h>
int can_socket_ = socket(PF_CAN, SOCK_RAW, CAN_RAW);
struct sockaddr_can addr = {};
addr.can_family = AF_CAN;
strcpy(ifr.ifr_name, "can0");
ioctl(can_socket_, SIOCGIFINDEX, &ifr);
addr.can_ifindex = ifr.ifr_ifindex;
bind(can_socket_, (struct sockaddr*)&addr, sizeof(addr));
struct can_frame frame;
frame.can_id = 0x100;
frame.can_dlc = 8;
// fill frame.data[]
write(can_socket_, &frame, sizeof(frame));
modbus_t* ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
modbus_set_slave(ctx, 1);
modbus_connect(ctx);
uint16_t regs[2];
modbus_write_registers(ctx, 0x100, 2, regs);
modbus_read_registers(ctx, 0x200, 2, regs);
| 数据类型 | Reliability | Durability | History | Depth |
|---|---|---|---|---|
| /cmd_vel | Reliable | Volatile | Keep Last | 10 |
| /odom | Reliable | Volatile | Keep Last | 10 |
| 关节状态 | Reliable | Volatile | Keep Last | 10 |
| 紧急停止 | Reliable | Transient Local | Keep Last | 1 |