首页 > 解决方案 > 使用 OpenManipulator 和 MoveIt 生成和控制第二个手臂

问题描述

我目前正在开展一个项目,在该项目中,我在同一场景中独立地为机器人生成和控制 2 个手臂。我要离开 OpenManipulator 文档/教程,并使用 MoveIt 来控制他们的默认手臂,来自这个链接:

http://emanual.robotis.com/docs/en/pl ...

http://emanual.robotis.com/docs/en/pl ...

所以我的想法是,在几个不同的终端中,我正在运行以下命令来生成绑定在一起的凉亭和 rviz 实例,并且我能够使用提供的 GUI 来操作单个手臂或使用代码。

$ roslaunch open_manipulator_gazebo open_manipulator_gazebo.launch(生成带有基本主题/节点的凉亭和机械臂)

$ roslaunch open_manipulator_controller open_manipulator_controller.launch use_platform:=false (使用相同的手臂生成 rvis,并为手臂创建 moveit 控制器。我还修改了这个启动文件以将 moveit 设置为 true)

$ roslaunch open_manipulator_control_gui open_manipulator_control_gui.launch(生成提供的 gui)

我想以某种方式操纵启动文件以生成第二个手臂,我可以像控制第一个手臂一样独立操纵它。到目前为止,我还没有找到运气,我仍在研究凉亭。不知道我将如何处理产生 rviz 的控制器。

我按如下方式操作了凉亭启动文件,并且能够显示 2 个手臂,但没有让主题或服务单独分组或拥有自己的唯一名称,甚至生成。

open_manipulator_gazebo.launch

    <launch>
  <!-- These are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="use_robot_name" default="open_manipulator"
      doc="Must match the robotNamespace tag in the gazebo description file"/>
   <arg name="use_robot_name_2" default="open_manipulator_2"
      doc="Must match the robotNamespace tag in the gazebo description file"/>
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find open_manipulator_gazebo)/worlds/empty.world"/>
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="headless" value="$(arg headless)"/>
  </include>



  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description"
  command="$(find xacro)/xacro --inorder '$(find open_manipulator_description)/urdf/open_manipulator.urdf.xacro'"/>


<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model open_manipulator -z 0.0 -param robot_description"/>


<!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description_2"
  command="$(find xacro)/xacro --inorder '$(find open_manipulator_description)/urdf/open_manipulator.urdf.xacro'"/>


<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner_2" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model open_manipulator_2 -y 1.0 -param robot_description_2"/>

 <!-- ros_control robotis manipulator launch file -->
   <include file="$(find open_manipulator_gazebo)/launch/open_manipulator_controller.launch">
      <arg name="use_robot_name" value="$(arg use_robot_name)"/>
      <arg name="use_robot_name_2" value="$(arg use_robot_name_2)"/>
    </include>


</launch>

open_manipulator_controller.launch (open_manipulator_gazebo 包中的那个,不是 open_manipulator_controller 包。这个是上面的launch文件调用的)

    <launch>
  <arg name="use_robot_name" />
  <arg name="use_robot_name_2" />
        <!--default="open_manipulator"-->

  <group ns="/robot_1">
  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find open_manipulator_gazebo)/config/open_manipulator_controller.yaml" command="load"
           ns="$(arg use_robot_name)"/>

   <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
 output="screen" ns="$(arg use_robot_name)" args="joint_state_controller
                                              joint1_position
                                              joint2_position
                                              joint3_position
                                              joint4_position
                                              gripper_position
                                              gripper_sub_position"/>

   <!-- Run gripper sub position publisher -->
  <node name="gripper_sub_publisher" pkg="open_manipulator_gazebo" type="gripper_sub_publisher" output="screen" ns="$(arg use_robot_name)"/>

  </group>

  <group ns="/robot_2">

   <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find open_manipulator_gazebo)/config/open_manipulator_controller.yaml" command="load"
           ns="$(arg use_robot_name_2)"/>

    <!-- load the controllers -->
  <node name="controller_spawner_2" pkg="controller_manager" type="spawner" respawn="false"
 output="screen" ns="$(arg use_robot_name_2)" args="joint_state_controller
                                              joint1_position
                                              joint2_position
                                              joint3_position
                                              joint4_position
                                              gripper_position
                                              gripper_sub_position"/>
  <!-- Run gripper sub position publisher -->
  <node name="gripper_sub_publisher_2" pkg="open_manipulator_gazebo" type="gripper_sub_publisher" output="screen" ns="$(arg use_robot_name_2)"/>

  </group>


</launch>

这是原始源代码的来源,因此您可以将其与原始启动文件进行比较:https ://github.com/ROBOTIS-GIT/open_m ...

任何帮助,将不胜感激。我对 ROS 很陌生,如果我忽略了一些简单的事情,请原谅我。如果我遗漏了任何重要信息,请告诉我,我很乐意提供。

感谢您的时间

真挚地,

阿尔弗雷德·沙克尔

标签: pythonc++rosmoveitgazebo-simu

解决方案


我也是 Gazebo/ROS 的新手,但在我的项目中,我从文件中生成机器人并使用命名空间来区分每个 /cmd_vel,例如:

class GazeboEnvWithRobots(gazebo_env.GazeboEnv):
    def __init__(self):
        super(GazeboEnvWithRobots, self).__init__()
        number_of_robots = 1
        if rospy.has_param("NUMBER_OF_ROBOTS"):
            number_of_robots = rospy.get_param("NUMBER_OF_ROBOTS")
        for i in range(number_of_robots):
            self.robots.append(turtlebot3lidar.Turtlebot3Lidar("/tb3_" + str(i),i))
            rospy.logdebug("Robot " + str(self.robots[-1]) + " has been created")

推荐阅读