力控机械臂在生活中和工业生产中非常的重要,本周首先整理下力控机器人的动态建模方法及相关Matlab实现!

力控制系统在机器人中的另一个基本应用是装配任务。在这样的过程中,力的控制是特别重要的,因为组装组件之间过高的相互作用力会导致很大的扭曲,并阻止正确的过程运行。

力控关节机械臂的用途有很多:

一个力控制机器人可以通过编程来模仿人类手臂的运动,应用搜索模式来找到组装零件的正确位置。力控制可用于改进机器人加工应用,如磨削,抛光,去毛刺和消灰。

今天的工业机器人几乎总是使用位置控制方案编程。通常情况下,机器人工具在空间中遵循预定的轨迹,该轨迹在运行前已经预先编程或“教”好了。有时,机器人从视觉系统获得参考位置,这使它能够根据变化的环境调整运动。然而,在某些应用中,精确控制末端执行器施加的力比控制机器人的定位更为重要。

在作用力很重要的应用中,需要对机器人进行不同的控制。而不是伺服每个关节到它的目标位置,输出扭矩被控制,以匹配所需的力由末端执行器施加在外部物体上。要做到这一点,就需要一种测量外力的方法。

机器人手臂上装有测量点,用于确定与环境的相互作用;A:末端执行器中的力传感器;b:底座力传感器;c:测量驱动器上的电流——在转换成扭矩后,它允许确定机器人与环境的相互作用。

大多数具有力控制包的现代机器人都是通过放置在工作尖端或底座上的传感器来测量力,而很少在关节处测量力。

也就是说,目前在关节力控机械臂方面做出的现代机器人还是少数的!!

机器人加工力控制策略:

通常情况下,外力是使用六轴力/扭矩传感器测量的,该传感器测量施加在末端执行器上的任何力,大多数市面上的力/扭矩传感器都是由应变计制成的。

——————————————————————————

机器人动力学包含计算和显示欧拉拉格朗日动力学所需的所有函数,下面以一些例子来进行机器人动力学建模!

Matlab常用的程序如下:

其中,动力学函数具体如下:

function qddot = forwardDynamics(obj, varargin)
        %forwardDynamics Compute resultant joint acceleration given joint torques and states
        %   QDDOT = forwardDynamics(ROBOT) computes the resultant joint
        %   accelerations due to gravity when ROBOT is at its home
        %   configuration, with zero joint velocities and no external
        %   forces.
        %
        %   QDDOT = forwardDynamics(ROBOT, Q) computes the resultant
        %   joint accelerations due to gravity when ROBOT is at joint
        %   configuration Q, with zero joint velocities and no external
        %   forces.
        %
        %   QDDOT = forwardDynamics(ROBOT, Q, QDOT) computes the joint
        %   accelerations resulted from gravity and joint velocities
        %   QDOT when ROBOT is at Joint configuration Q. (Set Q = [] if
        %   the joint configuration is home configuration.)
        %
        %   QDDOT = forwardDynamics(ROBOT, Q, QDOT, TAU) computes the
        %   joint accelerations due to gravity, joint velocities QDOT
        %   and joint torques TAU when ROBOT is at joint configuration Q.
        %   (Set QDOT = [] to indicate zero joint velocities.)
        %
        %   QDDOT = forwardDynamics(ROBOT, Q, QDOT, TAU, FEXT) computes
        %   the joint accelerations due to gravity, joint velocities
        %   QDOT, torques applied to the joints TAU, and external forces
        %   applied to each body FEXT, when ROBOT is at configuration Q.
        %   (Set TAU = [] to indicate zero joint torques.)
        %
        %   If ROBOT's DataFormat property is set to 'column', the
        %   input variables must be formatted as
        %   - Joint configuration, Q - pNum-by-1 vector
        %   - Joint velocities, QDOT - vNum-by-1 vector
        %   - Joint torques, TAU - vNum-by-1 vector
        %   - External forces, FEXT - 6-by-NB matrix
        %
        %   where:
        %   - pNum is the position number of ROBOT
        %   - vNum is the velocity number of ROBOT (degrees of freedom)
        %   - NB is the number of bodies in ROBOT
        %   - Each column of FEXT represents a wrench
        %     -- top 3 elements: moment
        %     -- bottom 3 elements: linear force
        %
        %   If the DataFormat property of ROBOT is set to 'row', then
        %   all the vectors/matrices above need to be transposed.
        %
        %   The returned joint accelerations QDDOT is either a vNum-by-1
        %   or an 1-by-vNum vector, depending on the DataFormat property.
        %
        %   Examples:
        %       % Load example robot
        %       load exampleRobots.mat
        %
        %       % Set lbr robot dynamics input data format to 'row'
        %       lbr.DataFormat = 'row';
        %
        %       % Set the gravity
        %       lbr.Gravity = [0 0 -9.81];
        %
        %       % Get the home configuration for lbr
        %       q = lbr.homeConfiguration
        %
        %       % The end-effector (body 'tool0') experiences a wrench.
        %       % Use the 2 lines below to generate the corresponding
        %       % external force matrix, fext. Note that if the external
        %       % wrench is specified in the body 'tool0' frame, the
        %       % joint configuration, q, must be specified as the fourth
        %       % input argument for externalForce method.
        %       wrench = [0 0 0.5 0 0 0.3];
        %       fext = externalForce(lbr, 'tool0', wrench, q)
        %
        %       % Compute the resultant joint acceleration due to gravity
        %       % with the external force applied to the end-effector when
        %       % lbr is at its home configuration.
        %       qddot = forwardDynamics(lbr, q, [], [], fext);
        %
        %   See also inverseDynamics, externalForce

            narginchk(1,5);
            [q, qdot, tau, fext] = validateDynamicsFunctionInputs(obj.TreeInternal, false, varargin{:});
            qddot = robotics.manip.internal.RigidBodyTreeDynamics.forwardDynamicsCRB(obj.TreeInternal, q, qdot, tau, fext);
            qddot = resultPostProcess(obj.TreeInternal, qddot);
        end

我们可以通过上述的动力学函数进行正向动力学求解!!!

那么,逆向动力学的使用语法如下:

则,inverseDynamicsd  的具体函数如下:

function tau = inverseDynamics(obj, varargin)
        %inverseDynamics Compute required joint torques for desired motion.
        %   TAU = inverseDynamics(ROBOT) computes joint torques TAU
        %   required for ROBOT to statically hold its home
        %   configuration with no external forces applied.
        %
        %   TAU = inverseDynamics(ROBOT, Q) computes the required joint
        %   torques for ROBOT to statically hold the given
        %   configuration Q with no external forces applied.
        %
        %   TAU = inverseDynamics(ROBOT, Q, QDOT) computes the joint
        %   torques required for ROBOT given the joint configuration Q
        %   and joint velocities QDOT while assuming zero joint accelerations
        %   and no external forces. (Set Q = [] if the desired joint
        %   configuration is home configuration.)
        %
        %   TAU = inverseDynamics(ROBOT, Q, QDOT, QDDOT) computes the
        %   joint torques required for ROBOT given the joint
        %   configuration Q, joint velocities QDOT and joint accelerations
        %   QDDOT while assuming no external forces are applied. (Set
        %   QDOT = [] to indicate zero joint velocities.)
        %
        %   TAU = inverseDynamics(ROBOT, Q, QDOT, QDDOT, FEXT) computes
        %   the joint torques required for ROBOT given the joint
        %   configuration Q, joint velocities QDOT, joint accelerations
        %   QDDOT and the external forces FEXT. (Set QDDOT = [] to
        %   indicate zero joint accelerations.)
        %
        %   If ROBOT's DataFormat property is set to 'column', the
        %   input variables must be formatted as
        %   - Joint configuration, Q - pNum-by-1 vector
        %   - Joint velocities, QDOT - vNum-by-1 vector
        %   - Joint accelerations, QDDOT - vNum-by-1 vector
        %   - External forces, FEXT - 6-by-NB matrix
        %
        %   where:
        %   - pNum is the position number of ROBOT
        %   - vNum is the velocity number of ROBOT (degrees of freedom)
        %   - NB is the number of bodies in ROBOT
        %   - Each column of FEXT represents a wrench
        %     -- top 3 elements: moment
        %     -- bottom 3 elements: linear force
        %
        %   If the DataFormat property of ROBOT is set to 'row', then
        %   all the vectors/matrices above need to be transposed.
        %
        %   The returned joint torques TAU is either a vNum-by-1 or an
        %   1-by-vNum vector, depending on the DataFormat property.
        %
        %   Examples:
        %       % Load example robot
        %       load exampleRobots.mat
        %
        %       % Set lbr robot dynamics input data format to 'column'
        %       lbr.DataFormat = 'column';
        %
        %       % Generate a random configuration for lbr
        %       q = lbr.randomConfiguration
        %
        %       % Compute the required joint torques for lbr to
        %       % statically hold that configuration
        %       tau = inverseDynamics(lbr, q);
        %
        %   See also forwardDynamics, externalForce

            narginchk(1,5);
            [q, qdot, qddot, fext] = validateDynamicsFunctionInputs(obj.TreeInternal, true, varargin{:});
            tau = robotics.manip.internal.RigidBodyTreeDynamics.inverseDynamics(obj.TreeInternal, q, qdot, qddot, fext);
            tau = resultPostProcess(obj.TreeInternal, tau);
        end

通过利用正向动力学和逆向动力学就可以实现所需的动态计算!!!

参考文献:

Ohishi K, Miyazaki M, Fujita M, Ogino Y. Hybrid Control of Robot Manipulator without Force Sensor. IFAC Proc. 1993;26:991-996.

Bruhm H, Czinki A, Lotz M. High Performance Force Control – A New Approach and Suggested Benchmark Tests. IFAC-Papers OnLine. 2015;48:165-170.

Pandiyan V, Caesarendra W, Tjahjowidodo T, et al. In-Process Tool Condition Monitoring in Compliant Abrasive Belt Grinding Process Using Support Vector Machine and Genetic Algorithm. J Manuf Proc. 2018;31:199-213.

Force Control in Robotics: A Review of Applications