上一节我们把Moveit2配置好,这次我们要实现rviz2和gazebo的联动,我把上一节的工作空间放到百度网盘链接里面了,方便大家跟着操作。
通过网盘分享的文件:luck_ws
链接: https://pan.baidu.com/s/1NQjHV8oLYmmbcInKctqYEw?pwd=luck 提取码: luck

一,修改 ~/.bashrc 文件(可选)

1.1备份当前的.bashrc文件

cp ~/.bashrc ~/.bashrc_backup

1.2编辑文件

打开文件

nano ~/.bashrc

在您的 ~/.bashrc文件末尾添加以下内容(注意​​:如果您的ROS2版本不是humble,请将humble替换为您的实际版本(如foxy、galactic等)):

# 添加到 ~/.bashrc 的简化版本
source /opt/ros/humble/setup.bash 2>/dev/null
source ~/luck_ws/install/setup.bash 2>/dev/null

按 Ctrl+O保存文件,按 Enter确认文件名,按 Ctrl+X退出nano

1.3使更改立即生效

source ~/.bashrc

这样做的好处是:以后colcon build后,打开一个新终端(因为每打开一个新终端,会自动source ~/.bashrc),就可以直接ros2 run了
在这里插入图片描述

二,配置功能包

配置功能包前,我们要了解整体运行逻辑,或者说moveit2,rviz2,gazebo都起到了什么作用,如下图:
在这里插入图片描述

2.1配置Gazebo功能包结构

cd ~/luck_ws/src
ros2 pkg create luck_gazebo --build-type ament_python --dependencies gazebo_ros gazebo_ros2_control controller_manager

​​创建config目录和yaml文件​​:如果 config文件夹尚不存在,需要先创建它,然后在该目录下创建 controllers.yaml文件。

cd luck_gazebo
mkdir -p config
touch config/controllers.yaml

此文件为 ros2_control/controller_manager 以及控制器实例的配置文件。
它定义 controller_manager 的参数,以及要加载的控制器实例及其参数。

将下面信息写入文件,并保存


controller_manager:
  ros__parameters:
    update_rate: 100  # Hz
    
    # 自动启动的控制器
    joint_state_broadcaster:
      type: joint_state_broadcaster/JointStateBroadcaster
    
    test_group_controller:
      type: joint_trajectory_controller/JointTrajectoryController

joint_state_broadcaster:
  ros__parameters:
    {}

test_group_controller:
  ros__parameters:
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6
    command_interfaces:
      - position
    state_interfaces:
      - position
      - velocity
    state_publish_rate: 50.0
    action_monitor_rate: 20.0
    allow_partial_joints_goal: false
    # PID增益配置(防止机械臂下落)
    gains:
      joint_1: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}
      joint_2: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}
      joint_3: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}
      joint_4: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}
      joint_5: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}
      joint_6: {p: 1000.0, d: 50.0, i: 0.1, i_clamp: 1.0}

导航到你的功能包目录并创建 launch文件夹

cd ~/luck_ws/src/luck_gazebo
mkdir -p launch

在 launch目录下创建 gazebo_moveit.launch.py文件。

touch launch/gazebo_moveit.launch.py

这个文件是一个综合启动(launch)脚本,用来在 ROS 2 中同时启动 Gazebo、MoveIt、Move Group、控制器(controller_manager)和 RViz,以便做仿真、运动规划与可视化联调。
把下面内容写进去,并保存

#!/usr/bin/env python3
"""
完整的Gazebo + MoveIt + RViz联合调试Launch文件
"""
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess, TimerAction, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from ament_index_python.packages import get_package_share_directory
from moveit_configs_utils import MoveItConfigsBuilder
import xacro


def generate_launch_description():
    # 包路径
    pkg_luck_robot = get_package_share_directory('luck_robot')
    pkg_luck_gazebo = get_package_share_directory('luck_gazebo')
    pkg_luck_description = get_package_share_directory('luck_description')
    
    # 控制器配置
    controller_config = os.path.join(pkg_luck_gazebo, 'config', 'controllers.yaml')
    
    # MoveIt配置
    moveit_config = MoveItConfigsBuilder("luck_description", package_name="luck_robot").to_moveit_configs()
    
    # 处理xacro生成URDF - 使用命令行参数方式
    initial_positions_file = os.path.join(pkg_luck_robot, 'config', 'initial_positions.yaml')
    
    # 直接调用xacro命令处理文件
    import subprocess
    xacro_file = os.path.join(pkg_luck_robot, 'config', 'luck_description.urdf.xacro')
    result = subprocess.run(
        ['xacro', xacro_file, 
         f'initial_positions_file:={initial_positions_file}',
         'use_sim:=true'],
        capture_output=True,
        text=True,
        check=True
    )
    robot_description_content = result.stdout
    
    # 动态注入controller配置到Gazebo插件
    robot_description_content = robot_description_content.replace(
        '<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">\n        </plugin>',
        f'<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">\n            <parameters>{controller_config}</parameters>\n        </plugin>'
    )
    
    # 替换mesh路径为绝对路径
    robot_description_content = robot_description_content.replace(
        'package://luck_description',
        f'file://{pkg_luck_description}'
    )
    
    # Robot State Publisher
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        name='robot_state_publisher',
        output='screen',
        parameters=[{
            'robot_description': robot_description_content,
            'use_sim_time': True
        }]
    )
    
    # 启动Gazebo
    gazebo = ExecuteProcess(
        cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'],
        output='screen'
    )
    
    # Spawn机器人
    spawn_entity = Node(
        package='gazebo_ros',
        executable='spawn_entity.py',
        arguments=[
            '-topic', 'robot_description',
            '-entity', 'luck_robot',
            '-x', '0',
            '-y', '0',
            '-z', '0.1'
        ],
        output='screen'
    )
    
    # 加载并激活joint_state_broadcaster
    joint_state_broadcaster_spawner = Node(
        package="controller_manager",
        executable="spawner",
        arguments=["joint_state_broadcaster"],
        output='screen'
    )
    
    # 加载并激活test_group_controller
    test_group_controller_spawner = Node(
        package="controller_manager",
        executable="spawner",
        arguments=["test_group_controller"],
        output='screen'
    )
    
    # MoveGroup节点 - 增加trajectory execution参数
    trajectory_execution_params = {
        'moveit_manage_controllers': True,
        'trajectory_execution.allowed_execution_duration_scaling': 2.0,
        'trajectory_execution.allowed_goal_duration_margin': 5.0,
        'trajectory_execution.allowed_start_tolerance': 0.5,  # 增大到0.5弧度
        'trajectory_execution.execution_duration_monitoring': False,
    }
    
    move_group_params = [
        moveit_config.to_dict(),
        trajectory_execution_params,
        {'use_sim_time': True}
    ]
    
    move_group_node = Node(
        package='moveit_ros_move_group',
        executable='move_group',
        output='screen',
        parameters=move_group_params,
    )
    
    # RViz配置
    rviz_config_file = PathJoinSubstitution(
        [FindPackageShare("luck_robot"), "config", "moveit.rviz"]
    )
    
    # RViz节点
    rviz_node = Node(
        package="rviz2",
        executable="rviz2",
        name="rviz2",
        output="log",
        arguments=["-d", rviz_config_file],
        parameters=[
            moveit_config.robot_description_semantic,
            moveit_config.robot_description_kinematics,
            moveit_config.planning_pipelines,
            moveit_config.joint_limits,
            {"use_sim_time": True},
        ],
    )
    
    return LaunchDescription([
        # 1. 启动Gazebo和robot_state_publisher
        robot_state_publisher,
        gazebo,
        
        # 2. 8秒后spawn机器人
        TimerAction(
            period=8.0,
            actions=[spawn_entity]
        ),
        
        # 3. 10秒后加载控制器(关键:防止机械臂下落)
        TimerAction(
            period=10.0,
            actions=[joint_state_broadcaster_spawner]
        ),
        
        # 4. 11秒后激活轨迹控制器
        TimerAction(
            period=11.0,
            actions=[test_group_controller_spawner]
        ),
        
        # 5. 12秒后启动MoveGroup(给控制器充分时间稳定)
        TimerAction(
            period=12.0,
            actions=[move_group_node]
        ),
        
        # 6. 17秒后启动RViz
        TimerAction(
            period=17.0,
            actions=[rviz_node]
        ),
    ])


打开 ~/luck_ws/src/luck_gazebo/setup.py文件。

nano ~/luck_ws/src/luck_gazebo/setup.py

您需要修改 setup()函数中的 data_files参数,确保它包含了安装 launch和 config目录的指令。
​​修改后的 setup.py文件示例:​

import os
from glob import glob
from setuptools import find_packages, setup

package_name = 'luck_gazebo'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        # 安装 launch 目录下的所有 .launch.py 文件 [1,4](@ref)
        (os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
        # 安装 config 目录下的所有 .yaml 文件 [1,4](@ref)
        (os.path.join('share', package_name, 'config'), glob('config/*.yaml')), # 请确保路径与您的目录名一致,通常是'config'
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='wkl',
    maintainer_email='wkl@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    extras_require={
        'test': [
            'pytest',
        ],
    },
    entry_points={
        'console_scripts': [
        ],
    },
)

2.2修改luck_robot功能包文件

2.2.1修改src/luck_robot/config/luck_description.ros2_control.xacro文件

├─ 添加use_sim参数到macro定义
├─ 条件加载GazeboSystem/GenericSystem
├─ 修复xacro.load_yaml调用方式

该文件定义了一个 xacro 宏 luck_description_ros2_control,用于在 URDF 中插入 ros2_control 配置块。

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
   <xacro:macro name="luck_description_ros2_control" params="name initial_positions_file use_sim:=true">
       <xacro:property name="initial_positions" value="${xacro.load_yaml(initial_positions_file)['initial_positions']}"/>

       <ros2_control name="${name}" type="system">
           <hardware>
               <xacro:if value="${use_sim}">
                   <!-- For Gazebo simulation -->
                   <plugin>gazebo_ros2_control/GazeboSystem</plugin>
               </xacro:if>
               <xacro:unless value="${use_sim}">
                   <!-- For real hardware or mock testing -->
                   <plugin>mock_components/GenericSystem</plugin>
               </xacro:unless>
           </hardware>
           <joint name="joint_1">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_1']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>
           <joint name="joint_2">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_2']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>
           <joint name="joint_3">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_3']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>
           <joint name="joint_4">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_4']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>
           <joint name="joint_5">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_5']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>
           <joint name="joint_6">
               <command_interface name="position"/>
               <state_interface name="position">
                 <param name="initial_value">${initial_positions['joint_6']}</param>
               </state_interface>
               <state_interface name="velocity"/>
           </joint>

       </ros2_control>
   </xacro:macro>
</robot>

2.2.2修改src/luck_robot/config/luck_description.urdf.xacro文件

├─ 添加use_sim参数定义
├─ 传递use_sim到ros2_control宏
├─ 配置Gazebo插件

这个文件的作用是把静态 URDF(模型)和 ros2_control(接口与硬件抽象)组合成最终的 robot_description(用于仿真或真实硬件)。

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="luck_description">
    <xacro:arg name="initial_positions_file" default="initial_positions.yaml" />
    <xacro:arg name="use_sim" default="true" />

    <!-- Import luck_description urdf file -->
    <xacro:include filename="$(find luck_description)/urdf/luck_description.urdf" />

    <!-- Import control_xacro -->
    <xacro:include filename="luck_description.ros2_control.xacro" />

    <!-- Use GazeboSystem for Gazebo simulation -->
    <xacro:luck_description_ros2_control name="GazeboSystem" initial_positions_file="$(arg initial_positions_file)" use_sim="$(arg use_sim)"/>

    <!-- Gazebo ROS2 Control Plugin -->
    <gazebo>
        <plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
        </plugin>
    </gazebo>

</robot>

2.2.3修改src/luck_robot/config/moveit_controllers.yaml 文件

├─ 添加action_ns: follow_joint_trajectory
├─ 统一控制器名称为test_group_controller
├─ 设置default: true

这个文件用于 MoveIt 与控制器管理的对接。它告诉 MoveIt 使用哪个 controller manager、有哪些 controller,以及哪个 controller 为默认且控制哪些关节(joints)。其中 action_ns、type、default 等字段影响 MoveIt 如何与控制器交互

# MoveIt uses this configuration for controller management

moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager

moveit_simple_controller_manager:
  controller_names:
    - test_group_controller

  test_group_controller:
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    default: true
    joints:
      - joint_1
      - joint_2
      - joint_3
      - joint_4
      - joint_5
      - joint_6

2.3修改luck_description功能包文件

2.3.1修改src/luck_description/urdf/luck_description.urdf文件

├─ 添加ros2_control配置块(6个关节接口)
├─ 添加gazebo_ros2_control插件
├─ 添加world link和fixed joint

原文件修改如下:

<?xml version="1.0"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com) 
    Commit Version: 1.6.0-4-g7f85cfe  Build Version: 1.6.7995.38578
    For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
<robot
 name="luck_description">
 <link
   name="base_link">
   <inertial>
     <origin
       xyz="-0.000490995537740322 -0.00045371041194521 0.0329835749869842"
       rpy="0 0 0" />
     <mass
       value="1.05139812423898" />
     <inertia
       ixx="0.00245458460727657"
       ixy="1.54345385186782E-05"
       ixz="-1.44214262882351E-05"
       iyy="0.00245373317242063"
       iyz="-1.35072537232266E-05"
       izz="0.00388761493070379" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/base_link.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/base_link.STL" />
     </geometry>
   </collision>
 </link>
 <link
   name="link_1">
   <inertial>
     <origin
       xyz="0.00384770679080166 -0.00145805597558288 -0.00591692258684598"
       rpy="0 0 0" />
     <mass
       value="4.35228845100693" />
     <inertia
       ixx="0.0104669899799764"
       ixy="0.000107134955332273"
       ixz="-0.000118971835147097"
       iyy="0.010709018942762"
       iyz="4.50660537183714E-05"
       izz="0.0081692966879217" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_1.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_1.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_1"
   type="revolute">
   <origin
     xyz="0 0 0.152"
     rpy="0 0 0" />
   <parent
     link="base_link" />
   <child
     link="link_1" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
 <link
   name="link_2">
   <inertial>
     <origin
       xyz="0.00969732150239182 0.212271262937771 -0.00530063353815988"
       rpy="0 0 0" />
     <mass
       value="9.71714519378521" />
     <inertia
       ixx="0.036950607687124"
       ixy="-0.000657369851317249"
       ixz="-3.12415445848607E-09"
       iyy="0.0225899614872816"
       iyz="4.09586418059664E-10"
       izz="0.0316126776742465" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_2.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_2.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_2"
   type="revolute">
   <origin
     xyz="0.12904 -0.048916 0"
     rpy="1.5708 0 1.2085" />
   <parent
     link="link_1" />
   <child
     link="link_2" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
 <link
   name="link_3">
   <inertial>
     <origin
       xyz="-0.0438026020061207 -0.232447211806827 -0.00218160095080577"
       rpy="0 0 0" />
     <mass
       value="5.97036587956182" />
     <inertia
       ixx="0.0468125775592432"
       ixy="-0.00766802197777573"
       ixz="0.000257924746021982"
       iyy="0.00756656521319655"
       iyz="0.00136837552657405"
       izz="0.0475881277660537" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_3.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_3.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_3"
   type="revolute">
   <origin
     xyz="0.019395 0.42456 -0.138"
     rpy="-3.1416 0 0" />
   <parent
     link="link_2" />
   <child
     link="link_3" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
 <link
   name="link_4">
   <inertial>
     <origin
       xyz="-8.32374365655753E-07 -0.00287170265688541 0.0145055142756531"
       rpy="0 0 0" />
     <mass
       value="1.96417351339286" />
     <inertia
       ixx="0.0032106143961567"
       ixy="5.63448346620329E-08"
       ixz="-1.18854560464133E-08"
       iyy="0.00258096291205603"
       iyz="-0.000106933957527964"
       izz="0.00228746114709311" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_4.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_4.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_4"
   type="revolute">
   <origin
     xyz="-0.07315 -0.38818 -0.13"
     rpy="0 0 0.13235" />
   <parent
     link="link_3" />
   <child
     link="link_4" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
 <link
   name="link_5">
   <inertial>
     <origin
       xyz="-0.0109159331997213 0.018666218196776 0.00281146144878552"
       rpy="0 0 0" />
     <mass
       value="2.10963951071355" />
     <inertia
       ixx="0.00223491733886044"
       ixy="0.000210927909434149"
       ixz="-1.39792766411928E-05"
       iyy="0.00199697710678008"
       iyz="2.41930796734157E-05"
       izz="0.00225535034542978" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_5.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="0.898039215686275 0.917647058823529 0.929411764705882 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_5.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_5"
   type="revolute">
   <origin
     xyz="0 -0.102 0"
     rpy="-1.5708 1.2055 0" />
   <parent
     link="link_4" />
   <child
     link="link_5" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
 <link
   name="link_6">
   <inertial>
     <origin
       xyz="-2.1923E-11 6.3394E-13 0.051171"
       rpy="0 0 0" />
     <mass
       value="0.025761" />
     <inertia
       ixx="8.083E-06"
       ixy="-5.294E-22"
       ixz="-1.2737E-15"
       iyy="8.083E-06"
       iyz="3.683E-17"
       izz="1.1056E-05" />
   </inertial>
   <visual>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_6.STL" />
     </geometry>
     <material
       name="">
       <color
         rgba="1 1 1 1" />
     </material>
   </visual>
   <collision>
     <origin
       xyz="0 0 0"
       rpy="0 0 0" />
     <geometry>
       <mesh
         filename="package://luck_description/meshes/visual/link_6.STL" />
     </geometry>
   </collision>
 </link>
 <joint
   name="joint_6"
   type="revolute">
   <origin
     xyz="-0.079142 0.13559 0"
     rpy="1.5708 0.053984 0.52833" />
   <parent
     link="link_5" />
   <child
     link="link_6" />
   <axis
     xyz="0 0 1" />
   <limit
     lower="-3.14"
     upper="3.14"
     effort="100"
     velocity="1.000001" />
 </joint>
<transmission name="tran_joint_1">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_1">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_1_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>

<transmission name="tran_joint_2">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_2">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_2_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>

<transmission name="tran_joint_3">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_3">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_3_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>

<transmission name="tran_joint_4">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_4">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_4_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>

<transmission name="tran_joint_5">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_5">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_5_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>

<transmission name="tran_joint_6">
 <type>transmission_interface/SimpleTransmission</type>
 <joint name="joint_6">
   <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
 </joint>
 <actuator name="joint_6_motor">
   <mechanicalReduction>1</mechanicalReduction>
 </actuator>
</transmission>


<!-- ==================================================== -->
<!-- 关键修改四:将底座固定在世界坐标系 -->
<!-- ==================================================== -->

<!-- 防止整个机械臂在重力作用下掉落[1](@ref) -->
<link name="world"/>

<joint name="world_to_base_fixed_joint" type="fixed">
 <parent link="world"/>
 <child link="base_link"/>
 <origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
</robot>

三,测试

cd ~/luck_ws
colcon build --symlink-install
source install/setup.bash

尝试运行

ros2 launch luck_gazebo gazebo_moveit.launch.py

在这里插入图片描述

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐