\(q_{k} = q_{k-1} + \dot{q}*\delta t\)
采用该方法时相当于在键盘控制时按下2键后通过键盘直接控制机械臂。
③ armCtrlInCartsian()
与上例类似,在笛卡尔空间下,原本需要用户控制空间速度旋量 \(V =[\omega \quad v]'\) ,即unitreeArm.twist
从而控制机械臂运转,该方法在此基础上进行了封装,用户直接控制希望机械臂末端运行的方向即可。 函数内直接会进行如下命令计算: 其中T是由R,p组成的齐次变换矩阵,[ω]为ω的反对称矩阵
\(posture_k = posture_{k-1}+posture_{\Delta}\)
\([\omega] = \log{(R_{k-1}^T R_k)}\)
\(v=p_\Delta\)
采用该方法时相当于在键盘控制时按下3键后通过键盘直接控制机械臂。
如果用户希望自行开发,通过规划轨迹运行机械臂,可以查看该示例。
当sendRecvThread->start()执行后,该线程会以500HZ的频率执行arm.sendRecv()函数。
关节下控制时,该函数会发送unitreeArm下的q, qd, gripperQ, gripperW给z1_controller, 笛卡尔下控制时,该函数会发送unitreeArm下的twist给z1_controller,用户只需不断更改这些参数即可控制机械臂。也可自己编写线程进行调用unitreeArm.sendRecv()进行通信。
如果用户希望直接从底层控制电机的 \(q, \dot{q}, \tau_f, k_p, k_d\) 参数,可以查看该示例。
该文件展示了如何对电机进行直接发送p, d参数。用户可以通过编写自己的机械臂程序对电机直接进行控制,实现自主开发。电机最终输出的力矩如下
\[\tau = k_p * 25.6 * (q_d - q) + k_d * 0.0128 * (\dot{q_d} - \dot{q}) + \tau_f\]25.6与0.0128为与电机通信协议中的缩放倍数。
CtrlComponents下的sendRecvThread是调用unitreeArm的函数进行指令操作,如运行至forward视为一条指令,而运行lowcmd时建议采用自己定义的线程,执行run函数,run函数开始通过计算确定当前需要发给电机的命令,最后调用sendRecv发送udp报文。
该程序提供了控制多个机械臂的示例。详见SDK运行
这里面包含机械臂sdk的python版本接口。
接口设计在arm_python_interface.cpp文件中,其中已经包含的函数及变量可直接在python中使用,用户也可自行更改,详情查看pybind11 documentation
调用方式:
编译完成后z1_sdk/lib中会生成一个名为unitree_arm_interface的库
在第一个终端运行./z1_ctrl
在z1_sdk/examples_py目录下打开第二个终端执行python3 example_highcmd.py