一键导入
ros2-hardware
ROS2 硬件集成技能。串口、CAN 总线、I2C/SPI、传感器驱动、udev 规则、权限配置。当用户提到串口、CAN、Modbus、ttyUSB、ttyACM、udev、设备权限、硬件抽象时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
ROS2 硬件集成技能。串口、CAN 总线、I2C/SPI、传感器驱动、udev 规则、权限配置。当用户提到串口、CAN、Modbus、ttyUSB、ttyACM、udev、设备权限、硬件抽象时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | ros2-hardware |
| description | ROS2 硬件集成技能。串口、CAN 总线、I2C/SPI、传感器驱动、udev 规则、权限配置。当用户提到串口、CAN、Modbus、ttyUSB、ttyACM、udev、设备权限、硬件抽象时使用。 |
| user-invocable | false |
| category | domain |
物理机器人硬件接入,涉及驱动开发、协议解析、设备权限。
serial_driver (transport_drivers)#include <io_context/io_context.hpp>
#include <serial_driver/serial_driver.hpp>
using drivers::common::IoContext;
using drivers::serial_driver::SerialDriver;
using drivers::serial_driver::SerialPortConfig;
IoContext ctx(2);
SerialPortConfig config(115200, // baud_rate
drivers::serial_driver::FlowControl::NONE,
drivers::serial_driver::Parity::NONE,
drivers::serial_driver::StopBits::ONE);
auto driver = std::make_unique<SerialDriver>(ctx);
driver->init_port("/dev/ttyUSB0", config);
driver->port()->open();
driver->port()->async_receive([](const std::vector<uint8_t>& buffer, size_t bytes_transferred) {
// 处理接收数据
});
std::vector<uint8_t> data{0xAA, 0x55};
driver->port()->async_send(data);
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1.0)
ser.write(b'\xAA\x55')
data = ser.read(8)
ser.close()
# 启用 CAN0
sudo ip link set can0 up type can bitrate 1000000
# 检查状态
ip -details link show can0
# 抓包调试
candump can0
cansend can0 100#1122334455667788
ros2_socketcanros2 launch ros2_socketcan socket_can_bridge.launch.xml \
interface:=can0
发布的话题:
/from_can_bus (can_msgs/Frame): 接收的 CAN 帧/to_can_bus (can_msgs/Frame): 发送的 CAN 帧#include <linux/can.h>
#include <linux/can/raw.h>
#include <sys/ioctl.h>
#include <net/if.h>
int sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
struct ifreq ifr;
strcpy(ifr.ifr_name, "can0");
ioctl(sock, SIOCGIFINDEX, &ifr);
struct sockaddr_can addr = {};
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
struct can_frame frame;
read(sock, &frame, sizeof(frame)); // 阻塞接收
避免 /dev/ttyUSB0 编号变化导致驱动失效。
sudo nano /etc/udev/rules.d/99-my-robot.rules
# RPLidar A2
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", \
MODE="0666", SYMLINK+="rplidar"
# 电机驱动
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
ATTRS{serial}=="A12345", MODE="0666", SYMLINK+="motor_driver"
sudo udevadm control --reload-rules
sudo udevadm trigger
ls -l /dev/rplidar # 验证 symlink
# 查看 USB 设备 vendor/product ID
lsusb
# 查看串口完整属性
udevadm info -a -n /dev/ttyUSB0
sudo usermod -aG dialout $USER
# 重新登录生效
sudo usermod -aG can $USER
# 或在 udev 规则中设置 GROUP="can"
sudo apt install i2c-tools
i2cdetect -y 1 # 扫描总线 1
i2cget -y 1 0x68 0x75 # 读寄存器
i2cset -y 1 0x68 0x6B 0x00 # 写寄存器
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
int fd = open("/dev/i2c-1", O_RDWR);
ioctl(fd, I2C_SLAVE, 0x68); // IMU 地址
uint8_t reg = 0x3B;
write(fd, ®, 1);
uint8_t buf[14];
read(fd, buf, 14);
class HardwareInterface {
public:
virtual ~HardwareInterface() = default;
virtual bool connect() = 0;
virtual bool disconnect() = 0;
virtual bool read(uint8_t* data, size_t len) = 0;
virtual bool write(const uint8_t* data, size_t len) = 0;
};
class SerialHardware : public HardwareInterface { /* ... */ };
class CanHardware : public HardwareInterface { /* ... */ };
class HardwareDriver : public rclcpp::Node {
private:
void publish_diagnostic() {
diagnostic_msgs::msg::DiagnosticStatus status;
status.name = "Motor Driver";
if (!hw_->is_connected()) {
status.level = DiagnosticStatus::ERROR;
status.message = "Hardware disconnected";
} else {
status.level = DiagnosticStatus::OK;
}
diag_pub_->publish(status);
}
// 自动重连
void reconnect_loop() {
if (!hw_->is_connected()) {
RCLCPP_WARN(this->get_logger(), "Reconnecting...");
hw_->connect();
}
}
};
# 串口
sudo apt install minicom screen
screen /dev/ttyUSB0 115200
# CAN
sudo apt install can-utils
candump -tz can0
cangen can0 -v # 生成测试帧
# 系统设备
dmesg | tail # 查看插拔日志
udevadm monitor # 实时监控 udev 事件
/diagnosticsROS2 上层应用集成域。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 控制技能。PID 控制、轨迹跟踪、电机驱动、ros2_control 框架、生命周期节点。当用户提到控制器、PID、MPC、LQR、轨迹跟踪、ros2_control、电机、伺服时使用。