gazebo和rviz2联合仿真——ROS2焊接机械臂(三)
摘要: 本文介绍了如何实现ROS2中rviz2和gazebo的联动配置。首先提供了上一节配置好的工作空间网盘链接,详细说明了.bashrc文件的可选修改步骤。接着讲解了功能包的整体运行逻辑,包括moveit2、rviz2和gazebo的交互关系。重点配置了Gazebo功能包结构,创建了controllers.yaml控制器配置文件,并编写了综合启动脚本gazebo_moveit.launch.py
上一节我们把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

更多推荐

所有评论(0)