对Unitree宇树Z1机械臂进行SDK修改和调用示例

参考Unitree官方文档 键盘控制 · unitree-docs

修改机械臂IP进行连接

ping机械臂的默认IP(192.168.123.110) 

网络不可达,此时需要修改机械臂IP使其与PC在同一局域网内,PC端才可与机械臂正常通信

在这里修改为192.168.123.xxx网段

调用ifconfig查看机械臂修改后的IP,在这里是33端口

调用官方提供的SDK(z1_controller和z1_sdk)

在第一个Terminal中调用编译z1_controller,在该文件夹下创建build文件夹,执行./z1_ctrl。

因为此时还没有启动机械臂SDK与机械臂控制器通信,所以会出现[warning]

在第二个Terminal中打开z1_sdk文件夹,创建build文件并编译,执行示例代码/highcmd_basic

此时机械臂启动,并执行highcmd_basic.cpp文件的内容

调用官方库进行自主编写直线运动Linear代码(C++)

根据Cartesian坐标系,调整机械爪的姿态和位置 (roll pitch yaw x y z)

需要先确定好机械臂的运动范围,若超出则会出现以下ERROR

[ERROR] MoveL posture:   (roll pitch yaw x y z) has no inverse kinematics.

直线运动Linear在官方库中对应"unitree_arm_sdk/control/unitreeArm.h"内被封装完毕的MoveL(posture, gripper_pos, cartesian_speed)函数。posture为位姿数组,gripper_pos为夹具位置初始化,cartesian_speed笛卡尔坐标系下各个轴的运行速度。

在这里实现机械臂画一个”口“字的.cpp文件,该文件放在z1_sdk的example下。

//#include <ncurses.h>//Linux

#include "unitree_arm_sdk/control/unitreeArm.h"

using namespace UNITREE_ARM;

class Z1ARM : public unitreeArm{

public:

    Z1ARM():unitreeArm(true){};

    ~Z1ARM(){};

    void armCtrlByFSM(); // 通过有限状态机(FSM)控制机械臂

    void printState(); // 打印机械臂的状态。

    double gripper_pos = 0.0; // 夹具的位置。

    double joint_speed = 2.0; // 关节的速度。

    double cartesian_speed = 0.5; // 笛卡尔坐标系下的速度。

};

 //Finite State Machine

void Z1ARM::armCtrlByFSM() {

    Vec6 posture[2]; // 姿势数组。

    gripper_pos = 0.0; // 夹具位置初始化。

    std::cout << "[TO STATE]" << std::endl;

    labelRun("forward");//初始位置(0,0,0,0.45,0,0.2)

    //直线运动Linear

    //输入末端位姿(roll pitch yaw x y z)

    //向左

    std::cout << "[MOVEL]" << std::endl;

    posture[0] << 0,0,0,0.45,-0.15,0.2;

    cartesian_speed = 0.5;

    MoveL(posture[0], gripper_pos, cartesian_speed);

    printState();

    

    //向上

    posture[0] << 0,0,0,0.45,-0.15,0.4;

    cartesian_speed = 0.5;

    MoveL(posture[0], gripper_pos, cartesian_speed);

    printState();

    //向右

    posture[0] << 0,0,0,0.45,0.15,0.4;

    cartesian_speed = 0.5;

    MoveL(posture[0], gripper_pos, cartesian_speed);

    printState();

    //向下

    posture[0] << 0,0,0,0.45,0.15,0.2;

    cartesian_speed = 0.5;

    MoveL(posture[0], gripper_pos, cartesian_speed);

    printState();

}

void Z1ARM::printState(){

    std::cout<<"------ joint State ------"<<std::endl;

    std::cout<<"qState: "<<lowstate->getQ().transpose()<<std::endl;

    std::cout<<"qdState: "<<lowstate->getQd().transpose()<<std::endl;

    std::cout<<"tauState: "<<lowstate->getTau().transpose()<<std::endl;

    std::cout<<"------ Endeffector Cartesian Posture ------"<<std::endl;

    std::cout<<"roll pitch yaw x y z"<<std::endl;

    std::cout<<lowstate->endPosture.transpose()<<std::endl;

}

int main() {

    // initscr(); // 初始化 ncurses

    // keypad(stdscr, TRUE); // 启用功能键

    // noecho(); // 不回显按键

    // curs_set(0); // 隐藏光标

    std::cout << std::fixed << std::setprecision(3);

   

    // 创建机械臂对象并启动控制线程

    Z1ARM arm;

    arm.sendRecvThread->start();

    //所有电机返回初始位置

    arm.backToStart();

    arm.armCtrlByFSM();//运行

    // 机械臂回到初始位置,设置为被动模式,关闭控制线程

    arm.backToStart();

    arm.setFsm(ArmFSMState::PASSIVE);

    arm.sendRecvThread->shutdown();

    //endwin(); // 结束 ncurses

    return 0;

}

这里还需要将文件放在z1_sdk的CMakeLists.txt内,重复上述调用SDK操作,即可成功运行。

注:直线运动Linear对位姿的调整,每次只能修改x、y和z中的一个,否则会ERROR。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要绘制六自由度机械臂的轨迹曲线,需要先确定机械臂的运动学模型和控制算法。这里提供一个简单的示例,使用MATLAB软件绘制直线轨迹。 1. 定义机械臂运动学模型 假设机械臂末端执行器的位置由三个坐标(x,y,z)表示,机械臂的关节角度分别为θ1,θ2,θ3,θ4,θ5,θ6,那么机械臂的正运动学模型可以表示为: ``` T06 = T01 * T12 * T23 * T34 * T45 * T56 ``` 其中,T01,T12,T23,T34,T45,T56分别表示机械臂各个连杆的变换矩阵,可以根据机械结构和几何关系计算得出。 2. 实现控制算法 在这个示例中,我们将采用简单的直线轨迹规划算法。假设机械臂的起始点为(x0,y0,z0),终点为(x1,y1,z1),那么我们可以将轨迹规划为多个线段,每个线段的起点和终点分别为: ``` (xi-1, yi-1, zi-1) -> (xi, yi, zi) ``` 对于每个线段,我们可以计算出机械臂末端执行器的位姿,然后通过逆运动学算法计算出机械臂的关节角度。 3. 绘制轨迹曲线 在MATLAB中,可以使用plot3函数绘制三维曲线。我们可以将机械臂末端执行器的位置作为数据点,然后将所有数据点连接起来,形成轨迹曲线。示例代码如下: ``` % 机械臂的起始点和终点 start_point = [x0; y0; z0]; end_point = [x1; y1; z1]; % 轨迹规划 trajectory = [start_point, point1, point2, ..., end_point]; % 计算机械臂关节角度 theta1 = ...; theta2 = ...; theta3 = ...; theta4 = ...; theta5 = ...; theta6 = ...; % 绘制轨迹曲线 plot3(trajectory(1,:), trajectory(2,:), trajectory(3,:)); ``` 注意,这里的逆运动学算法和轨迹规划算法需要根据具体的机械臂结构和运动要求进行设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值