机械臂全面学习---moveit和gazebo联合仿真

这篇博客详细介绍了如何配置MoveIt与Gazebo的集成,涉及修改ros_controllers.yaml、moveit_config的launch文件、创建控制器管理器启动文件以及设置新的功能包。步骤包括调整机器人控制器参数、加载控制器到参数服务器、启动模拟环境、发布机器人状态并启动MoveIt节点。通过这个过程,可以为其他机械臂在MoveIt和Gazebo的联动提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、修改XXX.moveit_config/config/ros_controllers.yaml

# MoveIt-specific simulation settings
moveit_sim_hw_interface:
  joint_model_group: controllers_initial_group_
  joint_model_group_pose: controllers_initial_pose_
# Settings for ros_control control loop
generic_hw_control_loop:
  loop_hz: 300
  cycle_time_error_threshold: 0.01
# Settings for ros_control hardware interface
hardware_interface:
  joints:
    - magician_joint1
    - magician_joint2
    - magician_joint3
  sim_control_mode: 1  # 0: position, 1: velocity
# Publish all joint states
# Creates the /joint_states topic necessary in ROS
joint_state_controller:
  type: joint_state_controller/JointStateController
  publish_rate: 50
controller_list:
  - name: magician_arm_controller
    action_ns: follow_joint_trajectory
    default: True
    type: FollowJointTrajectory
    joints:
      - magician_joint1
      - magician_joint2
      - magician_joint3

2、修改XXX.moveit_config/launch/ros_controllers.yaml

<?xml version="1.0"?>
<launch>

  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find magician_moveit_config)/config/ros_controllers.yaml" command="load"/>

  <!-- Load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" args=""/>

</launch>

3、修改XXX.moveit_config/launch/moveit_rviz.launch

<launch>

  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" />

  <arg name="config" default="false" />
  <arg unless="$(arg config)" name="command_args" value="" />
  <arg     if="$(arg config)" name="command_args" value="-d $(find magician_moveit_config)/launch/moveit.rviz" />

  <node name="$(anon rviz)" launch-prefix="$(arg launch_prefix)" pkg="rviz" type="rviz" respawn="false"
	args="$(arg command_args)" output="screen">
    <rosparam command="load" file="$(find magician_moveit_config)/config/kinematics.yaml"/>
  </node>

</launch>

4、在XXX.moveit_config/launch/move_group.launch修改一点小细节

<launch>

  <include file="$(find magician_moveit_config)/launch/planning_context.launch" />

  <!-- GDB Debug Option -->
  <arg name="debug" default="false" />
  <arg unless="$(arg debug)" name="launch_prefix" value="" />
  <arg     if="$(arg debug)" name="launch_prefix"
	   value="gdb -x $(find magician_moveit_config)/launch/gdb_settings.gdb --ex run --args" />

  <!-- Verbose Mode Option -->
  <arg name="info" default="$(arg debug)" />
  <arg unless="$(arg info)" name="command_args" value="" />
  <arg     if="$(arg info)" name="command_args" value="--debug" />

  <!-- move_group settings -->
  <arg name="allow_trajectory_execution" default="true"/>
  <arg name="fake_execution" default="false"/>
  <arg name="max_safe_path_cost" default="1"/>
  <arg name="jiggle_fraction" default="0.05" />
  <arg name="publish_monitored_planning_scene" default="true"/>

  <arg name="capabilities" default=""/>
  <arg name="disable_capabilities" default=""/>
  <!-- load these non-default MoveGroup capabilities (space seperated) -->
  <!--
  <arg name="capabilities" value="
                a_package/AwsomeMotionPlanningCapability
                another_package/GraspPlanningPipeline
                " />
  -->

  <!-- inhibit these default MoveGroup capabilities (space seperated) -->
  <!--
  <arg name="disable_capabilities" value="
                move_group/MoveGroupKinematicsService
                move_group/ClearOctomapService
                " />
  -->

  <!-- Planning Functionality -->
  <include ns="move_group" file="$(find magician_moveit_config)/launch/planning_pipeline.launch.xml">
    <arg name="pipeline" value="ompl" />
  </include>

  <!-- Trajectory Execution Functionality -->
  <include ns="move_group" file="$(find magician_moveit_config)/launch/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_manage_controllers" value="true" />
    <arg name="moveit_controller_manager" value="magician" unless="$(arg fake_execution)"/>
    <arg name="moveit_controller_manager" value="fake" if="$(arg fake_execution)"/>
  </include>

  <!-- Sensors Functionality -->
  <include ns="move_group" file="$(find magician_moveit_config)/launch/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)">
    <arg name="moveit_sensor_manager" value="magician" />
  </include>

  <!-- Start the actual move_group node/action server -->
  <node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
    <!-- Set the display variable, in case OpenGL code is used internally -->
    <env name="DISPLAY" value="$(optenv DISPLAY :0)" />

    <param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/>
    <param name="max_safe_path_cost" value="$(arg max_safe_path_cost)"/>
    <param name="jiggle_fraction" value="$(arg jiggle_fraction)" />
    <param name="capabilities" value="$(arg capabilities)"/>
    <param name="disable_capabilities" value="$(arg disable_capabilities)"/>


    <!-- Publish the planning scene of the physical robot so that rviz plugin can know actual robot -->
    <param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" />
    <param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" />
  </node>

</launch>

5、修改trajectory_execution.launch.xml

<launch>

  <!-- This file makes it easy to include the settings for trajectory execution  -->

  <!-- Flag indicating whether MoveIt! is allowed to load/unload  or switch controllers -->
  <arg name="moveit_manage_controllers" default="true"/>
  <param name="moveit_manage_controllers" value="$(arg moveit_manage_controllers)"/>

  <!-- When determining the expected duration of a trajectory, this multiplicative factor is applied to get the allowed duration of execution -->
  <param name="trajectory_execution/allowed_execution_duration_scaling" value="2"/> <!-- default 1.2 -->
  <!-- Allow more than the expected execution time before triggering a trajectory cancel (applied after scaling) -->
  <param name="trajectory_execution/allowed_goal_duration_margin" value="0.5"/> <!-- default 0.5 -->
  <!-- Allowed joint-value tolerance for validation that trajectory's first point matches current robot state -->
  <param name="trajectory_execution/allowed_start_tolerance" value="0.01"/> <!-- default 0.01 -->

  <!-- Load the robot specific controller manager; this sets the moveit_controller_manager ROS parameter -->
  <arg name="moveit_controller_manager" default="magician" />
  <include file="$(find magician_moveit_config)/launch/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml" />

</launch>

6、创建magician_moveit_controller_manager.launch.xml文件,并且启动ros_controllers.yaml

<launch>

  <!-- loads moveit_controller_manager on the parameter server which is taken as argument 
    if no argument is passed, moveit_simple_controller_manager will be set -->
  <arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager" />
  <param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>

  <!-- loads ros_controllers to the param server -->
  <rosparam file="$(find magician_moveit_config)/config/ros_controllers.yaml"/>
</launch>

7、新建一个功能包,里面放置启动文件

<?xml version="1.0"?>
<launch>
  <arg name="paused" default="true"/>
  <arg name="gazebo_gui" default="true"/>
  <arg name="urdf_path" default="$(find magician_description)/urdf/magician.urdf.xacro"/>

  <!-- startup simulated world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" default="worlds/empty.world"/>
    <arg name="paused" value="$(arg paused)"/>
    <arg name="gui" value="$(arg gazebo_gui)"/>
  </include>

  <!-- send robot urdf to param server -->
  <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find magician_description)/urdf/magician.urdf.xacro'" />

  <!-- push robot_description to factory and spawn robot in gazebo at the origin, change x,y,z arguments to spawn in a different position -->
  <node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" 
    args="-urdf -model magician 
          -param robot_description 
          -x 0
          -y 0
          -z 0.14
          -J magician_joint1 0
          -J magician_joint2 0.785
          -J magician_joint3 0.785
          -unpause"/>

  <rosparam file="$(find magician_description)/config/joint_state_controller.yaml" command="load"/>
  <node name="joint_state_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn joint_state_controller" respawn="false" output="screen"/>
  
  <rosparam file="$(find magician_description)/config/magician_arm_controller.yaml" command="load"/>
  <node name="elfin_arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn magician_arm_controller" respawn="false" output="screen"/>

 <!-- # The planning and execution components of MoveIt! configured to 
 # publish the current configuration of the robot (simulated or real)
 # and the current state of the world as seen by the planner
   -->
 <include file="$(find magician_moveit_config)/launch/move_group.launch">
  <arg name="publish_monitored_planning_scene" value="true" />
 </include>
 <!-- # The visualization component of MoveIt! -->
 <arg name="display" default="true"/>
 <include file="$(find magician_moveit_config)/launch/moveit_rviz.launch" if="$(arg display)">
   <arg name="config" value="true"/>
 </include>
 
</launch>

最后编译一下,启动launch文件。

 

 到这里moveit和gazebo的联动到此结束。

我们通过以上部分举一反三,其他的机械臂在moveit和gazebo联动时也是这样配置的。

### MoveItGazebo联合仿真实现教程 #### 配置概述 为了实现MoveItGazebo联合仿真,通常需要完成以下几个方面的配置:加载机器人的URDF/SRDF模型到ROS参数服务器、设置控制器插件以及启动相应的节点来同步MoveIt规划场景Gazebo物理引擎的状态。这些操作可以通过编写自定义的launch文件并结合已有的功能包来完成。 #### 功能包准备 在使用MoveIt Setup Assistant工具完成机械的初始配置之后,会生成一个特定名称的功能包[^3]。此功能包包含了用于描述机器人几何结构、关节限制以及其他必要信息的所有文件。例如,在某个案例中创建了一个名为`left_arm_moveit_config`的工作空间目录下的功能包。 #### Launch 文件示例 下面提供了一段典型的 launch 文件代码片段,它展示了如何通过组合多个子组件来构建完整的模拟环境: ```xml <launch> <!-- 加载 URDF 到参数服务器 --> <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" /> <!-- 启动 Gazebo 并传入世界文件 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot_gazebo)/worlds/my_world.world"/> <arg name="paused" default="false"/> <arg name="use_sim_time" default="true"/> </include> <!-- 插入机器人实体 --> <node pkg="gazebo_ros" type="spawn_model" args="-urdf -model robot -param robot_description"/> <!-- 发布时钟信号给其他依赖时间戳运行的服务 --> <node pkg="ros_control_boilerplate" type="joint_state_controller" output="screen"/> <!-- 运行 move_group 节点 --> <include file="$(find left_arm_moveit_config)/launch/move_group.launch"> <arg name="allow_trajectory_execution" value="true"/> <arg name="fake_execution" value="true"/> <!-- 设置为 true 表示仅执行而不实际移动硬件 --> </include> </launch> ``` 上述XML脚本实现了几个重要目标: - 将代表整个系统的URDF字符串上传至全局命名空间内的键路径'/robot_description'之下; - 使用标准方法调用空旷世界的实例化服务,并允许调整暂停状态或者启用仿真模式的时间轴管理选项; - 把预先设定好的虚拟对象放置于指定坐标系原点附近的位置处; - 定义了一些基本类型的控制回路单元以便后续环节能够正常运转起来; - 最终激活了负责处理高层次任务请求的核心模块——即'move_group'. #### 控制器配置 对于具体的运动学求解部分,则需参照官方文档说明进一步完善对应的yaml格式配置表单内容。比如针对某些特殊需求可能涉及到PID增益调节等方面的知识点[^2]. #### 注意事项 尽管存在所谓的“无脑配置”,但深入了解背后机制有助于解决潜在问题及优化性能表现。此外还需注意不同版本间可能存在兼容性差异等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没入&浅出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值