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

2024-03-14 12:20

本文主要是介绍对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。

这篇关于对Unitree宇树Z1机械臂进行SDK修改和调用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808416

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意