如何用URDF文件構建機械手模型并與MoveIt集成

機械手URDF文件的編寫

我們用urdf文件來描述我們的機械手的外觀以及物理性能。這里為了簡便,就只用了基本的圓柱、立方體了。追求美觀的朋友,還可以用dae文件來描述機械手的外形。

import re
def remove_comments(text):pattern = r'<!--(.*?)-->'return re.sub(pattern, '', text, flags=re.DOTALL)

文件six_arm.urdf

<?xml version="1.0"?>
<robot name="six_arm"><!-- Base link --><link name="base_link"><visual><geometry><box size="0.1 0.1 0.1"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="blue"><color rgba="0 0 1.0 1"/></material></visual><collision><geometry><box size="0.1 0.1 0.1"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="10"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Link 1 --><link name="link1"><visual><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="green"><color rgba="0 0.8 0 1"/></material></visual><collision><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 1: rotation around X-axis --><joint name="joint1" type="continuous"><parent link="base_link"/><child link="link1"/><axis xyz="0 0 1"/><origin xyz="0 0 0.1" rpy="0 0 0"/></joint><!-- Link 2 --><link name="link2"><visual><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="red"><color rgba="0.8 0 0 1"/></material></visual><collision><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 2: rotation around Y-axis --><joint name="joint2" type="continuous"><parent link="link1"/><child link="link2"/><axis xyz="1 0 0"/><origin xyz="0 0 0.1"/></joint><!-- Link 3 --><link name="link3"><visual><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="yellow"><color rgba="0.8 0.8 0 1"/></material></visual><collision><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 3: rotation around x-axis --><joint name="joint3" type="continuous"><parent link="link2"/><child link="link3"/><axis xyz="1 0 0"/><origin xyz="0 0 0.1"/></joint><!-- Link 4 --><link name="link4"><visual><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="green"><color rgba="0 0.8 0 1"/></material></visual><collision><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 4: rotation around X-axis --><joint name="joint4" type="continuous"><parent link="link3"/><child link="link4"/><axis xyz="0 1 0"/><origin xyz="0 0 0.1"/></joint><!-- Link 5 --><link name="link5"><visual><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="purple"><color rgba="0.8 0 0.8 1"/></material></visual><collision><geometry><cylinder length="0.1" radius="0.03"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 5: rotation around Y-axis --><joint name="joint5" type="continuous"><parent link="link4"/><child link="link5"/><axis xyz="1 0 0"/><origin xyz="0 0 0.1"/></joint><!-- Link 6 --><link name="link6"><visual><geometry><box size="0.1 0.1 0.2"/></geometry><origin rpy="0 0 0" xyz="0 0 0.1"/><material name="pink"><color rgba="0.8 0.4 0.8 1"/></material></visual><collision><geometry><box size="0.1 0.1 0.2"/></geometry><origin rpy="0 0 0" xyz="0 0 0.1"/></collision><inertial><mass value="0.2"/><inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/></inertial></link><!-- Joint 6: rotation around Z-axis --><joint name="joint6" type="continuous"><parent link="link5"/><child link="link6"/><axis xyz="0 0 1"/><origin xyz="0 0 0.1"/></joint><!-- Used for fixing robot to Gazebo 'base_link' 將機械手的基座固定在世界坐標上--><link name="world"/><joint name="fixed" type="fixed"><parent link="world"/><child link="base_link"/></joint><gazebo reference="base_link"><material>Gazebo/Black</material><gravity>true</gravity><selfCollide>false</selfCollide></gazebo><gazebo reference="link1"><material>Gazebo/Gray</material><selfCollide>false</selfCollide></gazebo><gazebo reference="link2"><material>Gazebo/Red</material><selfCollide>false</selfCollide></gazebo><gazebo reference="link3"><material>Gazebo/Blue</material></gazebo><gazebo reference="link4"><material>Gazebo/Green</material></gazebo><gazebo reference="link5"><material>Gazebo/Yellow</material></gazebo><gazebo reference="link6"><material>Gazebo/Orange</material></gazebo><!-- 在運行demo.launch.py時,需要注釋這個ros2_control節點,因為它使用了xxx.ros2_control.xacro來生成了ros2_control節點--><ros2_control name="GazeboSystem" type="system"><hardware><plugin>gazebo_ros2_control/GazeboSystem</plugin></hardware><joint name="joint1"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint><joint name="joint2"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint><joint name="joint3"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint><joint name="joint4"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint><joint name="joint5"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint><joint name="joint6"><command_interface name="position"><param name="min">-1</param><param name="max">1</param></command_interface><state_interface name="position"><param name="initial_value">0.0</param></state_interface><state_interface name="velocity"/></joint></ros2_control><gazebo><plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control"><parameters>$(find mybot)/config/ros2_controllers.yaml</parameters><robot_param_node>robot_state_publisher</robot_param_node></plugin></gazebo></robot>

機械手的外型

可以在vscode中打開這個文件然后用插件就可以看到這個機械手的外形。

有同學不知道如何在vscode中查看urdf模型,這里介紹一下: 先安裝vscode的ROS拓展,

然后可以在urdf文件中右鍵–》command palette–》ROS:Preview URDF

機械手link的inertial的設置

真正設置的話,有公式,自己可以參考一下。
urdf里面的link必須要有旋轉慣量矩陣‘intertial’的,否則在gazebo里面導入模型urdf時,會報下面的錯。
[gazebo-1] [Err] [Model.cc:123] Error Code 23 Msg: FrameAttachedToGraph error, Non-LINK vertex with name [model] is disconnected; it should have 1 outgoing edge in MODEL attached_to graph.

ros2_control插件

該插件是在gazbo導入該模型文件時,創建與Ros2交互的接口。

上面這個是之前的,我現在更新成這樣了主要是parameter節點不一樣。用了$(find mybot)就方便一點。但是相應地launch文件中就要用xacro了。

上面的ros2_controllers.yaml文件是在下一步創建出來的,先不用管。
同時,ros2_control這個節點下的內容也是要和ros2_controllers.yaml對應的,也可以先不管。
這個節點在開始階段先注釋掉,否則會與通過moveit_setup_assistant創建的一個 fake_system 的 ros2_control沖突。

機械手與MoveIt的關聯

通過前面的操作,我們擁有了一個描述機械手的文件 six_arm.urdf,接下來我們利用該文件創建一個可以利用MoveIt進行路徑規劃的“工程”。

建立一個文件夾myRobot,然后再在此文件夾中建立一個src文件夾

然后進入src文件夾路徑,創建包

ros2 pkg create mybot_description --build-type ament_python

在 src/mybot_description文件夾下,創建urdf文件夾,然后把six_arm.urdf放進去,如下圖所示。

返回myRobot目錄,然后編譯一下

colcon build

from setuptools import setupfrom glob import glob #這里
import os #這里package_name = 'mybot_description'setup(name=package_name,version='0.0.0',packages=[package_name],data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),(os.path.join('share', package_name, 'urdf'), glob('urdf/**')), #這里],install_requires=['setuptools'],zip_safe=True,maintainer='yong',maintainer_email='yong@todo.todo',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': [],},
)

最后啟動一下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905293.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905293.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905293.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《構建社交應用的安全結界:雙框架對接審核API的底層邏輯與實踐》

用戶生成內容如潮水般涌來。從日常的生活分享&#xff0c;到激烈的觀點碰撞&#xff0c;這些內容賦予社交應用活力&#xff0c;也帶來管理難題。虛假信息、暴力言論、侵權內容等不良信息&#xff0c;如同潛藏的暗礁&#xff0c;威脅著社交平臺的健康生態。內容審核機制&#xf…

39:分類器流程

第一步 創建支持向量機分類器 create_class_svm (7, rbf, KernelParam, Nu, |ClassNames|, one-versus-one, principal_components, 5, SVMHandle) 第二步 添加樣本到分類器里 for ClassNumber : 0 to |ClassNames| - 1 by 1 *列出目錄下的所有文件 list_files (ReadPath…

LangChain對話鏈:打造智能多輪對話機器人

LangChain對話鏈:打造智能多輪對話機器人 目錄 LangChain對話鏈:打造智能多輪對話機器人ConversationChain 是什么核心功能與特點基本用法示例內存機制自定義提示詞應用場景與其他鏈的結合`SequentialChain` 是什么![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/0…

el-select 結合 el-tree:樹形下拉數據

一、單選 <template><div class"selectTree-wapper"><el-selectv-model"selectValue"placeholder"請選擇"popper-class"custom-el-select-class"ref"selectRef"clearableclear"clearHandle">&…

BFS算法篇——從晨曦到星辰,BFS算法在多源最短路徑問題中的詩意航行(下)

文章目錄 引言一、01矩陣1.1 題目鏈接&#xff1a;https://leetcode.cn/problems/01-matrix/description/1.2 題目分析&#xff1a;1.3 思路講解&#xff1a;1.4 代碼實現&#xff1a; 二、飛地的數量2.1 題目鏈接&#xff1a;https://leetcode.cn/problems/number-of-enclaves…

Leetcode (力扣)做題記錄 hot100(49,136,169,20)

力扣第49題&#xff1a;字母異位詞分組 49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 遍歷數組&#xff0c;將每一個字符串變成char數組 然后排序&#xff0c;如果map里面有則將他的值返回來&#xff08;key是排序好的字符串&#xff09; class Solution {pu…

【自學30天掌握AI開發】第1天 - 人工智能與大語言模型基礎

自學30天掌握AI開發 - 第1天 &#x1f4c6; 日期和主題 日期&#xff1a;第1天 主題&#xff1a;人工智能與大語言模型基礎 &#x1f3af; 學習目標 了解人工智能的發展歷史和基本概念掌握大語言模型的基本原理和工作機制區分不同類型的AI模型及其特點理解AI在當前社會中的…

WebRTC 源碼原生端Demo入門-1

1、概述 我的代碼是比較新的&#xff0c;基于webrtc源碼倉庫的main分支的&#xff0c;在windows下把源碼倉庫下載好了后&#xff0c;用visual stdio 2022打開進行編譯調試src/examples/peerconnection_client測試項目,主要是跑通這個demo來入手和調試&#xff0c;純看代碼很難…

【LeetCode】刪除排序數組中的重復項 II

題目 鏈接 思路 雙指針 我好聰明啊&#xff0c;自己想出了這個雙指針的辦法&#xff0c;哈哈哈哈哈哈哈&#xff0c;太高興了 代碼 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…

通義千問席卷日本!開源界“卷王”阿里通義千問成為日本AI發展新基石

據日本經濟新聞&#xff08;NIKKEI&#xff09;報道&#xff0c;通義千問已成為日本AI開發的新基礎&#xff0c;其影響力正逐步擴大&#xff0c;深刻改變著日本AI產業的格局。 同時&#xff0c;日本經濟新聞將通義千問Qwen2.5-Max列為全球AI模型綜合評測第六名&#xff0c;不僅…

第J7周:對于ResNeXt-50算法的思考

目錄 思考 一、代碼功能分析 1. 構建 shortcut 分支&#xff08;殘差連接的旁路&#xff09; 2. 主路徑的第一層卷積&#xff08;11&#xff09; 4. 主路徑的第三層卷積&#xff08;11&#xff09; 5. 殘差連接 激活函數 二、問題分析總結&#xff1a;殘差結構中通道數不一致的…

如何解決Jmeter中的亂碼問題?

在 JMeter 中遇到亂碼問題通常是由于字符編碼不一致導致的&#xff0c;常見于 HTTP 請求響應、參數化文件讀取、報告生成等場景。以下是系統化的解決方案&#xff1a; 1. HTTP 請求響應亂碼 原因&#xff1a; 服務器返回的字符編碼&#xff08;如UTF-8、GBK&#xff09;與 J…

# YOLOv2:目標檢測的升級之作

YOLOv2&#xff1a;目標檢測的升級之作 在目標檢測領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和創新的檢測方式受到了廣泛關注。今天&#xff0c;我們就來深入探討一下 YOLOv2&#xff0c;看看它是如何在繼承 YOLOv1 的基礎上進行…

小白入!WiFi 技術大解析

WiFi&#xff0c;全稱Wireless Fidelity&#xff0c;是一種無線局域網技術&#xff0c;允許電子設備通過無線電波連接到互聯網。以下是對WiFi的一些介紹&#xff1a; 一、基本概述 定義&#xff1a;WiFi是一種基于IEEE 802.11標準系列的無線局域網技術&#xff0c;使設備能夠…

【prometheus+Grafana篇】基于Prometheus+Grafana實現windows操作系統的監控與可視化

&#x1f4ab;《博主主頁》&#xff1a; &#x1f50e; CSDN主頁 &#x1f50e; IF Club社區主頁 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了…

推薦一個感覺非常好的文章,是知識圖譜的

為了省瀏覽的事兒&#xff0c;以后打算寫文章都短一些&#xff0c;這樣不用被強制登錄、關注了 正文 鏈接是 https://blog.csdn.net/Appleyk/article/details/80422055 放個截圖 推薦理由 兩個&#xff0c;第一內容確實硬核。第二算是緣分吧&#xff0c;我之前公司好像&am…

《企業級前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自動化實踐》

文章目錄 前言前端項目CICD時序圖一、環境準備1、服務器相關2、Jenkins憑據3、注意事項 二、設計思想1. 模塊化設計2.多環境支持3. 制品管理4. 安全部署機制5. 回滾機制 三、CI階段1、構建節點選擇2、代碼拉取3、代碼編譯4、打包并上傳至minio 四、CD階段五、回滾階段六、構建通…

Go語言超時控制方案全解析:基于goroutine的優雅實現

一、引言 在構建高可靠的后端服務時&#xff0c;超時控制就像是守護系統穩定性的"安全閥"&#xff0c;它確保當某些操作無法在預期時間內完成時&#xff0c;系統能夠及時止損并釋放資源。想象一下&#xff0c;如果沒有超時控制&#xff0c;一個簡單的數據庫查詢卡住…

WTK6900C-48L:離線語音芯片重構玩具DNA,從“按鍵操控”到“聲控陪伴”的交互躍遷

一&#xff1a;開發背景 隨著消費升級和AI技術進步&#xff0c;傳統玩具的機械式互動已難以滿足市場需求。語音控制芯片的引入使玩具實現了從被動玩耍到智能交互的跨越式發展。通過集成高性價比的語音識別芯片&#xff0c;現代智能玩具不僅能精準響應兒童指令&#xff0c;還能實…

WebSocket的原理及QT示例

一.WebSocket 介紹 1.概述 WebSocket 是一種在單個 TCP 連接上進行全雙工通訊的協議&#xff0c;它在 2011 年被 IETF 定為標準 RFC 6455&#xff0c;并由 RFC7936 補充規范。與傳統的 HTTP 協議不同&#xff0c;WebSocket 允許服務器和客戶端之間進行實時、雙向的數據傳輸&a…