机器人力传感器

机器人力传感器原理与分类

机器人力传感器是将力信号转换为电信号的装置,用于检测机器人执行器与环境之间的相互作用力。根据测量原理和维度的不同,力传感器可分为多种类型。

按测量原理分类

  1. 应变式力传感器:采用硅应变片或金属箔,通过材料形变导致电阻变化来测量力。应变片牢固粘贴在弹性体上,当外力作用时,弹性体与应变片一起变形,通过惠斯通电桥将电阻变化转换为电压信号。这种传感器稳定性好,信噪比高,是应用最广泛的类型。
  2. 光学式传感器:通过光栅反映形变,再将形变转化为力信号。光学传感器在动态特性方面具有明显优势。
  3. 压电式传感器:利用压电材料的压电效应,将机械力转换为电荷或电压变化。可分为电容式(通过极距变化导致电压变化)和压电式(通过形变改变电荷)。

按测量维度分类

  1. 一维力传感器:测量单一方向上的力,适用于力的方向和作用点固定的场景,如称重传感器、拉力传感器等。
  2. 三维力传感器:可同时测量三个正交方向的力分量(Fx、Fy、Fz),适用于力的方向随机变化但作用点保持不变的场景。
  3. 六维力传感器:能同时测量三个方向的力(Fx、Fy、Fz)和三个方向的力矩(Mx、My、Mz),适用于力的方向和作用点都在三维空间内随机变化的复杂场景。六维力传感器技术壁垒最高,需要解决维间干扰、标定和解耦算法等难题。

机器人力传感器的核心组件与关键技术

核心组件

  1. 弹性体:传感器的核心部件,负责将外力转化为形变。弹性体的设计和制造质量直接影响传感器性能,需要具备高弹性储能能力、优良的机械加工性能和抗压强度。
  2. 应变片:将机械形变转换为电信号的关键元件。主要分为箔式电阻片(通过光刻、腐蚀工艺制成)、丝绕式电阻片和短接式电阻片等。箔式电阻片精度最高,应用最广泛。
  3. 信号处理电路:包括放大滤波模块、数据采集模块和接口模块,负责将微弱的应变信号放大、滤波并转换为数字信号。

关键技术挑战

  1. 结构设计与应变片粘贴:弹性体结构设计(如十字梁式、圆柱式等)和应变片粘贴位置直接影响传感器精度。六维力传感器尺寸小,贴片位置有限,手工粘贴难以避免误差。
  2. 标定系统精度:六维力传感器需要建立力向量与输出电压之间的映射关系。标定过程复杂,需要考虑531441个样本点的六维联合加载,以模拟真实使用情况。
  3. 解耦和补偿算法:由于结构耦合、加工误差等原因,会产生维间耦合(静态和动态),需要通过最小二乘法、神经网络法等解耦算法来消除。

机器人力传感器的应用领域

机器人力传感器在工业自动化、医疗康复、人形机器人等领域有广泛应用:

  1. 工业机器人:
    • 力控打磨:在不规则表面打磨时实时感知力度,确保表面光滑
    • 精密装配:提高装配成功率和精度
    • 示教拖动:操作员可直接拖动机械臂进行示教,传感器记录力和方向
    • 去毛刺、抛光等精细加工作业
  2. 医疗机器人:
    • 手术机器人实现精细的力反馈控制
    • 康复设备监测患者运动力和恢复情况
  3. 人形机器人:
    • 特斯拉Optimus在关节使用扭矩传感器(12个),线性执行器使用单向力传感器(14个),手腕和脚腕使用六维力传感器(4个)
    • 用于脚部感知地面反作用力,手部感知抓取力
  4. 协作机器人:实现安全的人机交互,当检测到异常力时及时停止或调整
  5. 航空航天与汽车测试:六维力测量最早应用于飞行器空气动力学测试,后扩展到汽车测试等领域

C++代码实例讲解

以下通过两个实际代码示例展示如何在机器人系统中实现力传感与控制。

示例1:Franka Emika Panda机器人的力控制

Franka Emika Panda是一款先进的协作机器人,支持多种力控制模式,包括力控制模式、阻抗控制和混合控制。以下C++代码展示了如何沿Z轴运动时实时获取力数据:

#include <franka/robot.h>
#include <franka/model.h>
#include <franka/gripper.h>
#include <iostream>

int main() {
    try {
        // 连接机器人
        franka::Robot robot("192.168.0.1"); // 替换为机器人IP地址
        franka::Model model = robot.loadModel();

        // 设置阻抗参数
        robot.setJointImpedance({3000.0, 3000.0, 3000.0, 3000.0, 3000.0, 3000.0, 3000.0});
        robot.setCartesianImpedance({2000.0, 2000.0, 2000.0, 200.0, 200.0, 200.0});

        // 设置沿Z轴的目标位置
        double desired_z_position = 0.1;
        
        // 控制回调函数
        robot.control([&model, &desired_z_position](const franka::RobotState& state, franka::Duration period) -> franka::CartesianVelocities {
            franka::CartesianVelocities velocities;
            velocities.O_T_EE_d[2] = desired_z_position;

            // 实时获取力数据
            franka::Torques joint_torques = state.tau_J;
            std::array<double, 6> external_forces = state.K_F_ext_hat_K;
            
            // 打印外力数据
            std::cout << "External forces: ";
            for (const auto& force : external_forces) {
                std::cout << force << " ";
            }
            std::cout << std::endl;

            return velocities;
        });
    } catch (const franka::Exception& e) {
        std::cout << e.what() << std::endl;
    }
    return 0;
}

这段代码展示了如何:

  1. 连接Franka机器人并设置关节和笛卡尔阻抗
  2. 定义沿Z轴的运动指令
  3. 在控制回调函数中实时读取六维外力数据(Fx, Fy, Fz, Mx, My, Mz)
  4. 处理可能的异常情况

示例2:跳跃机器人的力传感与控制

以下代码模拟了一个跳跃机器人(Salto)使用力传感器在树枝间跳跃的控制系统:

#include <iostream>
#include <vector>
#include <cmath>
#include <chrono>
#include <thread>

// 定义常量
const int MAX_JUMP_DISTANCE = 200; // 最大跳跃距离(cm)
const int MIN_JUMP_DISTANCE = 50;  // 最小跳跃距离(cm)

// 模拟IMU数据结构
struct IMUData {
    float roll, pitch, yaw; // 姿态角
    float x, y, z;          // 加速度
};

// 模拟目标位置
struct TargetPosition {
    float x, y, z; // 三维坐标
};

// 夹爪状态枚举
enum ClawState { CLOSED, OPEN };

// 机器人状态结构
struct RobotState {
    float currentX, currentY, currentZ;
    ClawState clawState;
};

// 模拟获取IMU数据
IMUData getIMUData() {
    IMUData imuData = {0, 0, 0, 0, 0, 0};
    // 模拟IMU数据变化
    imuData.x = sin(std::chrono::system_clock::now().time_since_epoch().count() / 1e9) * 0.1;
    imuData.y = cos(std::chrono::system_clock::now().time_since_epoch().count() / 1e9) * 0.1;
    imuData.z = 0.9 + 0.1 * sin(std::chrono::system_clock::now().time_since_epoch().count() / 1e9);
    return imuData;
}

// 模拟目标检测
TargetPosition detectTarget() {
    return TargetPosition{100, 50, 80}; // 模拟目标位置
}

// 模拟夹爪控制
void controlClaw(ClawState state) {
    std::cout << "Claw state: " << (state == CLOSED ? "CLOSED" : "OPEN") << std::endl;
}

// 模拟跳跃控制
void jump(float distance, float height) {
    std::cout << "Jumping: distance=" << distance << "cm, height=" << height << "cm" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
}

// 平衡控制算法(PID)
void balanceControl(RobotState& robotState) {
    IMUData imuData = getIMUData();
    // 使用PID控制器调整平衡
    float rollCorrection = imuData.roll * 0.5 + imuData.x * 0.1;
    float pitchCorrection = imuData.pitch * 0.5 + imuData.y * 0.1;
    robotState.currentX += rollCorrection;
    robotState.currentY += pitchCorrection;
}

// 路径规划(A*算法简化版)
std::vector<TargetPosition> planPath(RobotState& robotState, TargetPosition target) {
    std::vector<TargetPosition> path;
    float distance = std::sqrt(std::pow(target.x - robotState.currentX, 2) + 
                              std::pow(target.y - robotState.currentY, 2));
    float height = target.z - robotState.currentZ;
    
    if (distance >= MIN_JUMP_DISTANCE && distance <= MAX_JUMP_DISTANCE) {
        path.push_back(target);
    }
    return path;
}

// 主控制循环
void controlLoop(RobotState& robotState) {
    while (true) {
        TargetPosition target = detectTarget();
        std::vector<TargetPosition> path = planPath(robotState, target);
        
        if (!path.empty()) {
            controlClaw(OPEN);
            jump(std::sqrt(std::pow(path[0].x - robotState.currentX, 2) + 
                          std::pow(path[0].y - robotState.currentY, 2)), 
                 path[0].z - robotState.currentZ);
            
            // 更新机器人位置
            robotState.currentX = path[0].x;
            robotState.currentY = path[0].y;
            robotState.currentZ = path[0].z;
            
            controlClaw(CLOSED);
            balanceControl(robotState);
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

int main() {
    RobotState robotState = {0, 0, 0, CLOSED};
    controlLoop(robotState);
    return 0;
}

这段代码展示了:

  1. 机器人状态管理(位置、夹爪状态)
  2. IMU数据获取与平衡控制(PID算法)
  3. 目标检测与路径规划(简化版A*算法)
  4. 跳跃动作执行与力控制
  5. 主控制循环集成所有功能

总结

机器人力传感器作为机器人感知与交互的核心部件,其技术发展直接影响机器人应用的深度和广度。应变式六维力传感器因其高精度和可靠性,在工业领域占据主导地位;而随着人形机器人、协作机器人等新兴领域的发展,对力传感器提出了更高要求——更小的体积、更高的灵敏度、更好的抗干扰能力和更低的成本。

未来发展趋势包括:

  1. 多模态传感器融合:力传感器与视觉、触觉等传感器数据融合,提升机器人环境感知能力
  2. 柔性电子皮肤技术:开发具备物理柔性与仿生特性的力/触觉传感器,模拟人类皮肤功能
  3. AI与边缘计算:在传感器端集成AI算法,实现实时数据处理和智能决策
  4. 标准化与模块化:推动力传感器接口和通信协议的标准化,降低集成难度

随着材料科学、微电子技术和人工智能算法的进步,机器人力传感器将朝着更高性能、更低成本和更广泛应用的方向发展,为机器人智能化提供坚实基础。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐