Возрождает и контролирует вторую руку, используя OpenManipulator и MoveIt.
В настоящее время я работаю над проектом, в котором я порождаю и контролирую 2 руки независимо в одной сцене для робота. Я перехожу к документации / учебным пособиям по OpenManipulator и использую MoveIt для управления своей рукой по умолчанию по этой ссылке:
http://emanual.robotis.com/docs/en/pl...
а также
http://emanual.robotis.com/docs/en/pl...
Таким образом, идея заключается в том, что в нескольких разных терминалах я запускаю следующие команды для создания экземпляра gazebo и rviz, которые связаны друг с другом, и я могу использовать предоставленный графический интерфейс для манипулирования одной рукой или использования кода.
$ 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 (порождает графический интерфейс)
Я хочу как-то манипулировать файлами запуска, чтобы создать вторую руку, которой я могу управлять независимо, так же, как я могу управлять первой рукой. Я пока не вижу удачи, и я все еще работаю над беседкой. Не уверен, как я пойду о контроллере, который порождает 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>
<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, прости меня, если я упустил что-то простое. Если я опущу какую-либо важную информацию, дайте мне знать, и я буду рад предоставить ее.
Спасибо за уделенное время
С уважением,
Альфред Шейкер
0 ответов
Я также новичок в 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")