从零开始搭建一个moveit2简单机械臂模型

news2024/11/28 5:49:12

文章目录

  • 前言
  • 一、设计一个简单机械臂
  • 二、构造
    • 创建文件关系
      • CMakeLists.txt 修改增加如下:
      • package.xml 修改增加如下:
      • urdf.rviz 全文如下:
      • demo.launch.py 全文如下:
    • launch rviz
    • 构造link
    • 构造joint
  • 总结


前言

在网上搜了许多文章,过了一遍moveit2 humble的说明文档,没找到如何搭建一个新的机械臂模型,在moveit 中有提供setup_assistant_tutorial1通过这个助手来实现编辑机器人相关参数,但是从空文件开始搭建一个机械臂相关参数的架构并没有相关教程,所有想直接从零开始写一个机械手相关的参数的体系,也有助于理解其中的参数。

本文主要写如何搭建一个urdf2文件,并且配置好其中的底座、轴关节、轴末端工具安装位置。
关于srdf3后续补充,这里有两个引用是官方的文件说明值得一看。


一、设计一个简单机械臂

博主在这里按照yaskawa GP50型号机械臂传动结构定义如下模型,底座用box代表,轴用cylinder代表。
具体尺寸如下所示:

L(m)W/R(m)H(m)
底座0.50.50.4
S轴0.10.4
L轴0.10.4
U轴0.10.4
R轴0.10.2
B轴0.10.2
T轴0.10.2

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

二、构造

创建文件关系

按照文件名及关系创建如下文件夹,之所以创建这一套是为了方便通过launch rviz验证所构造的机械臂模型是否正确。

.
└── 6axis_moveit_config	# 项目文件夹
    ├── config	# 保存配置文件
    │   └── urdf.rviz
    ├── launch # 保存launch文件
    │   └── demo.launch.py
    ├── urdf # 保存urdf文件
    │   └── 6_axis.urdf
    ├── CMakeLists.txt
    └── package.xml

CMakeLists.txt 修改增加如下:

project(moveit_resources_6axis_moveit_config)
...
install(DIRECTORY config launch urdf DESTINATION share/${PROJECT_NAME})

package.xml 修改增加如下:

	...
  <exec_depend>joint_state_publisher</exec_depend>
  <exec_depend>joint_state_publisher_gui</exec_depend>
  <exec_depend>robot_state_publisher</exec_depend>
  <exec_depend>rviz2</exec_depend>
  <exec_depend>xacro</exec_depend>
	...

urdf.rviz 全文如下:

Panels:
  - Class: rviz_common/Displays
    Name: Displays
  - Class: rviz_common/Views
    Name: Views
Visualization Manager:
  Class: ""
  Displays:
    - Class: rviz_default_plugins/Grid
      Name: Grid
      Value: true
    - Alpha: 0.8
      Class: rviz_default_plugins/RobotModel
      Description Source: Topic
      Description Topic:
        Value: /robot_description
      Enabled: true
      Name: RobotModel
      Value: true
    - Class: rviz_default_plugins/TF
      Name: TF
      Value: true
  Global Options:
    Fixed Frame: base_link
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz_default_plugins/MoveCamera
  Value: true
  Views:
    Current:
      Class: rviz_default_plugins/Orbit
      Distance: 1.7
      Name: Current View
      Pitch: 0.33
      Value: Orbit (rviz)
      Yaw: 5.5
Window Geometry:
  Height: 800
  Width: 1200
  

demo.launch.py 全文如下:

import os
from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, ExecuteProcess
from launch.substitutions import LaunchConfiguration
from launch.conditions import IfCondition
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
from moveit_configs_utils import MoveItConfigsBuilder

def generate_launch_description():
    # Get the launch directory
    bringup_dir = get_package_share_directory('moveit_resources_6axis_moveit_config')
    launch_dir = os.path.join(bringup_dir, 'launch')

    # Launch configuration variables specific to simulation
    rviz_config_file = LaunchConfiguration('rviz_config_file')
    use_robot_state_pub = LaunchConfiguration('use_robot_state_pub')
    use_joint_state_pub = LaunchConfiguration('use_joint_state_pub')
    use_rviz = LaunchConfiguration('use_rviz')
    urdf_file= LaunchConfiguration('urdf_file')

    declare_rviz_config_file_cmd = DeclareLaunchArgument(
        'rviz_config_file',
        default_value=os.path.join(bringup_dir, 'config', 'urdf.rviz'),
        description='Full path to the RVIZ config file to use')  
    declare_use_robot_state_pub_cmd = DeclareLaunchArgument(
        'use_robot_state_pub',
        default_value='True',
        description='Whether to start the robot state publisher')
    declare_use_joint_state_pub_cmd = DeclareLaunchArgument(
        'use_joint_state_pub',
        default_value='True',
        description='Whether to start the joint state publisher')
    declare_use_rviz_cmd = DeclareLaunchArgument(
        'use_rviz',
        default_value='True',
        description='Whether to start RVIZ')

    declare_urdf_cmd = DeclareLaunchArgument(
        'urdf_file',
        default_value=os.path.join(bringup_dir, 'urdf', '6_axis.urdf'),
        description='Whether to start RVIZ')

    start_robot_state_publisher_cmd = Node(
        condition=IfCondition(use_robot_state_pub),
        package='robot_state_publisher',
        executable='robot_state_publisher',
        name='robot_state_publisher',
        output='screen',
        arguments=[urdf_file])

    start_joint_state_publisher_cmd = Node(
        condition=IfCondition(use_joint_state_pub),
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        name='joint_state_publisher_gui',
        output='screen',
        arguments=[urdf_file])
    
    rviz_cmd = Node(
        condition=IfCondition(use_rviz),
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        arguments=['-d', rviz_config_file],
        output='screen')

    return LaunchDescription(
        [
            declare_rviz_config_file_cmd,
            declare_use_robot_state_pub_cmd,
            declare_use_joint_state_pub_cmd,
            declare_use_rviz_cmd,
            declare_urdf_cmd,
            start_robot_state_publisher_cmd,
            start_joint_state_publisher_cmd,
            rviz_cmd
        ]
    )

launch rviz

在上边已经定义好了文件结构,那我们就在此基础上开始编译程序,并调用ros2 launch启动程序。

# 编译包
colcon build --packages-up-to moveit_resources_6axis_moveit_config --cmake-args -DCMAKE_BUILD_TYPE=Release

# output:
/usr/lib/python3/dist-packages/colcon_core/argument_parser/type_collector.py:9: UserWarning: 'colcon_core.argument_parser.type_collector.TypeCollectorDecorator' has been deprecated
  class TypeCollectorDecorator(ArgumentParserDecorator):
/usr/lib/python3/dist-packages/colcon_core/argument_parser/type_collector.py:62: UserWarning: 'colcon_core.argument_parser.type_collector.SuppressTypeConversions' has been deprecated, use 'colcon_core.argument_parser.action_collector.SuppressTypeConversions' instead
  class SuppressTypeConversions:
Starting >>> moveit_resources_6axis_moveit_config
Finished <<< moveit_resources_6axis_moveit_config [0.57s]                  

Summary: 1 package finished [0.64s]

# 安装包
. install/setup.bash

# 启动包
ros2 launch moveit_resources_6axis_moveit_config demo.launch.py

弹出界面如下所示:
在这里插入图片描述

构造link

  <link name="base_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <box size="0.5 0.5 0.4"/>
      </geometry>
      <material name="">
        <color rgba="0.4 0.4 0.4 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <box size="0.5 0.5 0.4"/>
      </geometry>
    </collision>
  </link>
  <link name="link_1">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="link_2">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="link_3">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.2"/>
      <geometry>
        <cylinder length="0.4" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="link_4">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="link_5">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="link_6">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.1"/>
      <geometry>
        <cylinder length="0.2" radius="0.1"/>
      </geometry>
    </collision>
  </link>
  <link name="tool0">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="0.05 0.05 0.05"/>
      </geometry>
      <material name="">
        <color rgba="0.96 0.76 0.13 1.0"/>
      </material>
    </visual>
  </link>
  <link name="base"/>

base_link 我们的意图是将坐标系放置在box的下底面如图所示:
在这里插入图片描述
link_1 我们的意图是将坐标系放在圆柱的下底面如图所示:
在这里插入图片描述
其余各轴均是按照该原则,最终结果如下所示:
在这里插入图片描述
接下来使用joint设置各轴之间的相对位置。

构造joint

其中:

  • origin 控制该轴相对parent link的相对位置、

<origin rpy="0 0 0" xyz="0 0 0.4"/>与parent link相比向z正方向移动0.4m
rpy可以查欧拉角的意义。欧拉角_百度百科

  • axis 控制该轴运动方向,旋转时符合右手定则

<axis xyz="0 0 1"/>约束为绕z轴正方向旋转
<axis xyz="0 1 0"/>约束为绕y轴正方向旋转
<axis xyz="-1 0 0"/>约束为绕x轴负方向旋转

  <joint name="joint_1" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.4"/>
    <parent link="base_link"/>
    <child link="link_1"/>
    <axis xyz="0 0 1"/>
    <limit effort="0" lower="-3.14" upper="3.14" velocity="3.67"/>
  </joint>
  <joint name="joint_2" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.4"/>
    <parent link="link_1"/>
    <child link="link_2"/>
    <axis xyz="0 1 0"/>
    <limit effort="0" lower="-1.57" upper="2.36" velocity="3.32"/>
  </joint>
  <joint name="joint_3" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.4"/>
    <parent link="link_2"/>
    <child link="link_3"/>
    <axis xyz="0 -1 0"/>
    <limit effort="0" lower="-1.4" upper="3.6" velocity="3.67"/>
  </joint>
  <joint name="joint_4" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.4"/>
    <parent link="link_3"/>
    <child link="link_4"/>
    <axis xyz="0 0 1"/>
    <limit effort="0" lower="-6.28" upper="6.28" velocity="6.98"/>
  </joint>
  <joint name="joint_5" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.2"/>
    <parent link="link_4"/>
    <child link="link_5"/>
    <axis xyz="0 -1 0"/>
    <limit effort="0" lower="-2.18" upper="2.18" velocity="6.98"/>
  </joint>
  <joint name="joint_6" type="revolute">
    <origin rpy="0 0 0" xyz="0 0 0.2"/>
    <parent link="link_5"/>
    <child link="link_6"/>
    <axis xyz="0 0 1"/>
    <limit effort="0" lower="-6.28" upper="6.28" velocity="10.47"/>
  </joint>
  <joint name="joint_6-tool0" type="fixed">
    <origin rpy="0 0 0" xyz="0 0 0.2"/>
    <parent link="link_6"/>
    <child link="tool0"/>
  </joint>
  <joint name="base_link-base" type="fixed">
    <origin rpy="0 0 0" xyz="0 0 0.4"/>
    <parent link="base_link"/>
    <child link="base"/>
  </joint>

最终得到如下机械臂模型,如下图所示:

请添加图片描述

这里再贴一个yaskawa gp50的模型动图吧,调了好一会才行。

请添加图片描述


总结

以上就是博主构建一个机械臂urdf 并如何验证是否符合设计方案的仿真流程。


  1. moveit 2 offcial ---- setup_assistant_tutorial ↩︎

  2. moveit 2 offcial wiki ---- URDF Overview ↩︎

  3. moveit 2 offcial wiki ---- SRDF Overview ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏互动,用Python点燃【儿童节】的欢乐!

当孩子们踏入人生的旅途时&#xff0c;他们需要的并不仅仅是学习知识&#xff0c;更需要的是在快乐的氛围中成长。六一儿童节即将来临&#xff0c;让我们用Python代码为孩子们送去一份特别的礼物吧&#xff01; 在本篇文章中&#xff0c;我会带领大家一起探索如何利用Python代…

php中文字符串提取方法,preg_replace 和preg_match_all区别

在php中&#xff0c;可以利用以下两种函数来只提取字符串的中文字符 preg_replace()函数 preg_match_all()函数 方法1&#xff1a;使用preg_match_all()函数 preg_match_all()函数配合正则表达式“/[\x{4e00}-\x{9fff}]/u”可以过滤字符串&#xff0c;只获取中文字符。 会…

chatgpt赋能python:Python中[:3]的用法介绍

Python中[:3]的用法介绍 Python是一种高级编程语言&#xff0c;经常被用于数据科学、机器学习、人工智能和Web应用程序开发。在Python中&#xff0c;有许多有用的编程技巧和语法&#xff0c;其中之一就是[:3]。 什么是[:3]&#xff1f; 在Python中&#xff0c;[:3]是一种称为…

研发工程师玩转Kubernetes——使用Ingress进行路由

依据微服务理念&#xff0c;我们希望每个独立的功能由一个服务支持。比如有两个接口&#xff1a;http://www.xxx.com/plus和http://www.xxx.com/minus&#xff0c;前者由一个叫plus-service的服务支持&#xff0c;后者由一个叫minus-service的服务支持。这样就需要一个路由层&a…

华为OD机试真题B卷 Java 实现【查找两个字符串a,b中的最长公共子串】,附详细解题思路

一、题目描述 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开! 数据范围:字符串长度1≤length≤300 。 二、输入描述 输入两个字符串…

牛客网刷题学习SQL(五)

SQL25 查找山东大学或者性别为男生的信息 分析&#xff1a; 查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据&#xff0c;结果不去重。 山东大学 --》 where university“山东大学” 男性—》where gender “male” 结果不去重 所以上面不能使用or&…

改进的yolo目标检测(yolo创新与改进)

目标检测是计算机视觉领域中的一个重要问题,它需要从图像或视频中检测出物体的位置和类别。近年来,深度学习技术在目标检测领域取得了显著的进展,其中一个重要的方法是基于YOLO(You Only Look Once)算法的目标检测。 YOLO算法的优点是速度快,但是在检测小物体和密集物体…

SAP-MM-发票-采购附加成本处理简介

一&#xff0e;采购附加成本处理&#xff1a; 原材料的采购成本包括采购成本&#xff08;采购单价*采购数量&#xff09;和相关采购附加成本&#xff08;运输费、保险费、报关费、仓储费、滞期费、租船费、码头费及代理费等费用&#xff09;&#xff0c;对于采购附加成本主要有…

覆盖标准(白盒、黑盒和灰盒)

覆盖标准(白盒、黑盒和灰盒) 覆盖标准Coverage Criteria 覆盖标准采用软件的抽象表示并将其划分为可测试的功能。 每个功能构成了测试需求的基础——需要由软件的测试套件进行测试的东西。 当测试套件的一个测试用例满足测试要求时&#xff0c;我们说测试要求被覆盖。测试套件…

四、机器人整体结构的稳定性

结构的稳定性是指结构在外界载荷作用下&#xff0c;能否维持自己的形状和位置。如果结构在外界载荷作用下能够维持自己的形状和位置&#xff0c;则称为稳定&#xff1b;如果结构在外界载荷作用下无法维持自己的形状和位置&#xff0c;则称为不稳定。 结构的稳定性是一个相对概念…

管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)

根据所学的知识, 写一个管理系统, 顺便总结一些知识点 准备: 前端用vue-cli的框架, 后端用jdbc连接数据库, 项目部署tomcat服务器来完成交互 ●前端的vue-cli框架搭建可以看 点击跳转 的第二小结 ●后端的tomcat在idea里的相关的配置与集成,可以看 点击跳跃 文章目录 一、 前段…

机智云物联网低功耗转接板GE211+机智云APP遥控灯

要实现硬件的智能化&#xff0c;除了硬件本身外&#xff0c;还需要实现&#xff1a;智能云平台、手机 APP、联网模块&#xff0c;每 一个领域都需要专业的团队来支撑。机智云提供完整的解决方案&#xff0c;让厂商或开发者只需要专 注于自身产品硬件。以最小的成本和风险实现硬…

【网络】路由器和无线路由器就这么配置

目录 &#x1f352;常见的接入互联网方式 &#x1f353;WAN配置 &#x1f353;LAN口配置 &#x1f353;WLAN配置 &#x1f353;WLAN安全 &#x1f352;路由设备管理 &#x1f353;路由器内部组件 &#x1f353;Cisco路由器的启动过程 &#x1f353;基础命令 &#x1f34e;show …

数据库中的DDL、DQL、DML、DCL 和 TCL 命令

数据库中的DDL、DQL、DML、DCL 和 TCL 命令 SQLDDL&#xff08;Data Definition Language&#xff09;数据库定义语言DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言TCL&#xff08;Transaction Control Language&#xff09;事务控制语言DQL (Data Query…

UEFI开发环境搭建(Windows)

重拾UEFI学习。 第一步是搭建开发环境&#xff0c;记录如下&#xff1a; 1. 安装开发工具 Visual Studio 2017 python/ASL/NASM 安装到如下目录&#xff1a; c:\Python310 c:\ASL c:\NASM 更新系统变量Path: 新建系统变量PYTHON_HOME 下载EDK2 创建工作目录&#xff…

一个技巧,让ChatGPT学会复杂编程,编程水平逼近人类程序员!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 随着 AIGC 技术迈出了一大步&#xff0c;ChatGPT 等聊天机器人被频繁地使用在生活和工作中的各个场景。想象一下&#xff0c;当你写代码陷入没有头绪的境地或者无法解决 Bug 时&#xff0c;这种基于大型语言模型&#xff08;LL…

ROS:发布者Publisher的编程实现(C++)

目录 一、话题模型二、创建功能包三、创建Publisher代码四、编译代码五、运行 一、话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09; Subscriber&#xff0c…

STM32H723ZGT6 LAN8720A LWIP

Stm32CubeMX 版本&#xff1a;6.8.1 硬件库版本&#xff1a;STM32Cube FW_H7 V1.11.0 usart.c#include <stdio.h> #if 1//标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _…

设计模式(二):创建型之工厂方法和抽象工厂模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二)&#xff1a;创建型之工厂模式 目录 一、设计模式分类二、概述三、简单工厂模式1、结构2、实现3、扩展&#xff1a;静态工厂 四、工厂方法模式1、结构2、 实现3、优缺点 五、抽象工厂模式1、结构2、实…

牛客网2018吉比特校招技术开发类试题分析

最近做了两套笔试题&#xff0c;复习一下错题&#xff0c;有很多地方需要查缺补漏&#xff0c;再谈一下感受总结一下。 2018届吉比特校招技术类笔试B卷 吉比特2018届提前批校园招聘-开发类试卷 一、基础题 1.已知 a 6789x 6789、b 6789x 6790、c 6789x 6791&#xff0c…