User Tools

Site Tools


neurali:gazebo_package_esempi

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
neurali:gazebo_package_esempi [2018/04/25 07:55] – external edit 127.0.0.1neurali:gazebo_package_esempi [2020/06/08 22:20] – external edit 127.0.0.1
Line 1: Line 1:
 +====== Esempio package ROS per Gazebo ======
  
 +
 +http://www.generationrobots.com/en/content/75-gazebo-and-ros
 +
 +===== 3 package =====
 +
 +In questo workspace creeremo 3 package di esempio, per simulare un piccolo carrello chiamando Gazebo dentro ROS
 +
 +  - mybot_gazebo: file world e launch
 +  - mybot_description: modello 3d 
 +  - mybot_control: interfaccia per ROS (file yaml e launch)
 +
 +
 +  mkdir -p ~/catkin_ws/src
 +  cd ~/catkin_ws/src
 +  catkin_init_workspace
 +  cd ..
 +  catkin_make
 +
 +Avremo generato delle nuove cartelle
 +
 +Ogni volta che vogliamo usare questo pacchetto dovremo preventivamente dare su ogni terminale:
 +
 +  source ~/catkin_ws/devel/setup.bash
 +Oltre al solito
 +  source /opt/ros/indigo/setup.bash
 +
 +  cd ~/catkin_ws/src
 +  catkin_create_pkg mybot_gazebo gazebo_ros
 +  catkin_create_pkg mybot_description
 +  catkin_create_pkg mybot_control
 +
 +Abbiamo creato CMakeLists.txt e package.xml dentro ogni cartella
 +=====In mybot_gazebo=====
 +
 +====Creare file.world ====
 +
 +
 +non usare cd, ma roscd
 +
 +  roscd mybot_gazebo 
 +  mkdir launch worlds
 +  cd worlds
 +  nano mybot.world
 +
 +<code xml>
 +<?xml version="1.0"?>
 +<sdf version="1.4">
 +<world name="myworld">
 + <include>
 + <uri>model://sun</uri>
 + </include>
 +
 + <include>
 + <uri>model://ground_plane</uri>
 + </include>
 +</world>
 +</sdf>
 +</code>
 +
 +====Creare file.launch====
 +  roscd mybot_gazebo/launch
 +  nano mybot_world.launch
 +
 +Quest è una prima versione del file.launch, ma vedere anche [[neurali:gazebo_package_esempi&#modificare filelaunch]]
 +
 +<code> 
 +  <launch>   
 + <include file="$(find gazebo_ros)/launch/empty_world.launch">     
 + <arg name="world_name" value="$(find mybot_gazebo)/worlds/mybot.world"/>     
 + <arg name="gui" value="true"/>   
 + </include>
 +</launch>
 +</code>
 +
 +  roslaunch mybot_gazebo mybot_world.launch
 +
 +=====In mybot_description=====
 +==== Creare il file.urdf ====
 +
 +  * Si possono utilizzare modelli esistenti (;;Ora NON uso .sdf perché oltre a Gazebo c'è anche ROS;;)
 +    * http://wiki.ros.org/urdf/Examples ([[neurali:guardian]] robotnik) ([[neurali:husky]] clearpath)
 +    * http://wiki.ros.org/Robots
 +  * Si può creare il proprio modello con un metalinguaggio di programmazione come xacro
 +
 +  roscd mybot_description
 +  mkdir urdf
 +  cd urdf
 +  nano mybot.xacro
 +  
 +[[neurali:ROS approfondimento XACRO|approfondimento XACRO]]
 +
 +I modelli ottenuti dovranno avere opportuni tag per colore, coefficiente di attrito, opportuni giunti (joint) e opportuni controlli sui movimenti (Attuatori)
 +
 +==== Creare il file.gazebo ====
 +
 +myrobot.gazebo
 +
 +Ogni elemento che compone il robot (case, ruote, braccio, manipolatore, sensori, ecc.) avrà un diverso file.urdf che dovranno essere messi insieme tramite apposito tag %%<robot>%% nel file myrobot.gazebo
 +
 +
 +
 +<code>
 +<robot>
 +  <gazebo reference="chassis">
 +    <material>Gazebo/Orange</material>
 +  </gazebo>
 +
 +  <gazebo reference="caster_wheel">
 +    <mu1>0.0</mu1>
 +    <mu2>0.0</mu2>
 +    <material>Gazebo/Red</material>
 +  </gazebo>
 +
 +</robot>
 +</code>
 +
 +----
 +NOTA: Il tag %%<gazebo>%% può essere inserito anche nel file.xacro.........???
 +----
 +
 +====Modificare file.launch in mybot_gazebo====
 +<code xml>
 +<!-- urdf xml robot description che verrà convertita e caricata da ROS usando un parametro "robot_description" vedi sotto-->
 +<param name="robot_description" command="$(find xacro)/xacro.py '$(find mybot_description)/urdf/mybot.xacro'" />
 +
 +<!-- carica robot_description per costruire e depositare il robot in gazebo -->
 +<node name="mybot_spawn" pkg="gazebo_ros" type="spawn_model" output="screen"
 + args="-urdf -param robot_description -model mybot" />
 +
 +<!-- verrà realizzato anche un file launch per il ros_control  -->
 +<include file="$(find mybot_control)/launch/mybot_control.launch" />
 +</code>
 +
 +===== In mybot_control =====
 +
 +La **connessione a ROS** si ottiene per mezzo di un [[neurali:gazebo scrivere un plugin|plugin di Gazebo]]
 +
 +Avendo usato un tag %%<transmission>%% nel file.urdf, ora posso collegarci un plugin modificando il file myrobot.gazebo
 +
 +<code>
 +<gazebo>
 +  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
 +    <robotNamespace>/mybot</robotNamespace>
 +  </plugin>
 +</gazebo>
 +</code>
 +
 +====Creare il File.yaml====
 +<code>
 +roscd mybot_control
 +mkdir config
 +cd config
 +nano mybot_control.yaml
 +</code>
 +
 +Definisco: 2 giunti perché uso due ruote, e un sensore che restituisce l'angolo delle ruote (propriocezione)
 +<code>
 +mybot:
 +  # Publish all joint states -----------------------------------
 +  joint_state_controller:
 +    type: joint_state_controller/JointStateController
 +    publish_rate: 50  
 +  
 +
 +  # Effort Controllers ---------------------------------------
 +  leftWheel_effort_controller:
 +    type: effort_controllers/JointEffortController
 +    joint: left_wheel_hinge
 +    pid: {p: 100.0, i: 0.1, d: 10.0} # gain??
 +  rightWheel_effort_controller:
 +    type: effort_controllers/JointEffortController
 +    joint: right_wheel_hinge
 +    pid: {p: 100.0, i: 0.1, d: 10.0}
 +</code>
 +
 +====Creare il File.launch====
 +
 +<code>
 +roscd mybot_control
 +mkdir launch
 +cd launch
 +nano mybot_control.launch
 +</code>
 +
 +<code xml>
 +<launch>
 +
 +  <!-- Caricare controllo giunti (joint) e configurazioni da file.yaml -->
 +  <rosparam file="$(find mybot_control)/config/mybot_control.yaml" command="load"/>
 +
 +  <!-- load the controllers -->
 +  <node name="controller_spawner"
 +    pkg="controller_manager"
 +    type="spawner" respawn="false"
 +    output="screen" ns="/mybot"
 +    args="joint_state_controller rightWheel_effort_controller leftWheel_effort_controller"
 +  />
 +
 +
 +  <!-- avvierà un node ROS che trasforma TF lo stato dei giunti (joint) in 3D per vedere la traiettoria su rviz, ecc -->
 +  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen">
 +    <param name="robot_description" command="$(find xacro)/xacro.py '$(find mybot_description)/urdf/mybot.xacro'" />
 +    <remap from="/joint_states" to="/mybot/joint_states" />
 +  </node>
 +
 +</launch>
 +</code>
 +
 +=====Avvio=====
 +
 +Dopo aver specificato il mio robot???
 +
 +  source ~/catkin_ws/devel/setup.bash???
 +
 +  roslaunch mybot_gazebo mybot_world.launch
 +
 +
 +In un altro terminale, questo comando permette di vedere i controllori in azioine
 +
 +  rostopic list
 +
 +In altro terminale, dopo opportuna inizializzazione???, inviare i comandi di controllo, uno per ruota. Successivamente si potrà aggiungere un plugin che è subscriber del topic **cmd_vel**, e inviare opportuni comandi alle due ruote.
 +
 +  rostopic pub -1 /mybot/leftWheel_effort_controller/command std_msgs/Float64 "data: 1.5"
 +  rostopic pub -1 /mybot/rightWheel_effort_controller/command std_msgs/Float64 "data: 1.0"
 +
 +Questo permette di monitorare lo stato dei giunti
 +
 +  rostopic echo /mybot/joint_states
 +  
 +[[neurali:gazebo package esempio_aggiungere_qualcosa|Aggiungere telecomando e telecamera]]
neurali/gazebo_package_esempi.txt · Last modified: 2023/06/09 10:47 by profpro