Uso de Controladores no ROS
Manipuladores
Walter Fetter Lages
Universidade Federal do Rio Grande do Sul Escola de Engenharia
Departamento de Sistemas Elétricos de Automação e Energia ENG10051 Dinâmica e Controle de Robôs
Introdução
• Existem várias formas de implementar
controladores no ROS
• A maioria delas não suporta operação em
tempo-real
• O framework ros_control oferece
ferramentas real-time safe para implementação de controladores
• Aqui será criado um pacote para usar os
controladores já implementados no ROS
• Simulador Gazebo
Controle de Juntas
interface com o usuário
comando do usuário planejamento (MoveIt!) geração de trajetória navegação action server referência controlador de junta ação de in fr ae st ru tu ra do R O S
Framework ros_control
• A definição de controlador não é a clássica de
Sistemas de Controle
• Módulo que é carregado pelo gerenciador de
controladores
• Não necessariamente implementa um
controlador
Laço de Tempo Real
pos eff cmd vel setForce() getAngle() getVelocity() Gazebo GazeboRosControlPlugin readSim() writeSim() update() RobotHW*cmd *vel *pos *eff
JointHandle getPosition()getVelocity()
setCommand() Controller JointStatePublisher getVelocity() getPosition() getEffort() ControllerManager update() update() unlockAndPublish() /joint_states /controller/command update() commandCB()
Plugin
para o Gazebo
• Incluir na descrição URDF
<gazebo>
<plugin name="gazebo_ros_control" filename=" libgazebo_ros_control.so">
<!-- <robotNamespace>/q2d</robotNamespace> -->
<controlPeriod>0.001</controlPeriod> </plugin>
Tipo dos Controladores
• Usualmente o namespace indica a grandeza de
saída do controlador
• Usualmente a classe indica a grandeza que é
controlada ou a lei de controle
• Às vezes a sintaxe é de path, outras é de C++
• namespace_do_controlador/ClasseDoControlador • namespace_do_controlador:: ClasseDoControlador • effort_controllers/JointPositionController • effort_controllers/JointVelocityController • velocity_controllers:JointPositionController
Estrutura do Pacote
q2d_bringup/ CMakeLists.txt launch/ bypass.launch -> ijc.launch gazebo.launch ijc.launch pid.launch -> ijc.launch config/ bypass.yaml pid.yaml package.xmlDependências
• ros_control • control_toolbox • controller_interface • controller_manager • hardware_interface • joint_limits_interface • transmission_interface • realtime_tools• Já incluídas na variante desktop do Melodic
Dependências
• ros_controllers
• position_controllers
• joint_position_controller
• Já incluído na variante desktop_full do
Melodic
• joint_state_controller
• joint_state_controller
Dependências
• ros_controllers • effort_controllers • joint_effort_controller • joint_position_controller • joint_velocity_controller • velocity_controllers • joint_position_controller • joint_velocity_controllerDependências
• robot_model
• kdl_parser
• robot_state_publisher
• Já instalado na variante robot do ROS
• orocos_kdl
Dependências
• gazebo_ros_pkgs
• gazebo_ros_control
• Já incluído na variante desktop_full do Melodic
sudo apt−get install ros−indigo−gazebo−ros−pkgs ros−indigo−
Criação do Pacote
cd ~/catkin_ws/src
catkin_create_pkg q2d_bringup effort_controllers
package.xml
• Editar o arquivo q2d_bringup/package.xml • Descrição • Mantenedor • Licença • Autor • DependênciasReconfigurar o Ambiente
cd ~/catkin_ws
catkin_make
ijc.launch
<launch>
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen"
args="shoulder_controller elbow_controller joint_states_publisher
" />
</launch>
• bypass.launch->ijc.launch • pid.launch->ijc.launch
config/pid.yaml
shoulder_controller: type: effort_controllers/JointPositionController joint: shoulder_active_joint pid: {p: 2310, i: 4640, d: 0.299} elbow_controller: type: effort_controllers/JointPositionController joint: elbow_active_joint pid: {p: 339, i: 851, d: 0.351}config/bypass.yaml
shoulder_controller: type: effort_controllers/JointEffortController joint: shoulder_active_joint elbow_controller: type: effort_controllers/JointEffortController joint: elbow_active_joint joint_states_publisher: type: joint_state_controller/JointStateController publish_rate: 100gazebo.launch
• q2d_bringup/launch/gazebo.launch
<launch>
<arg name="paused" default="true"/>
<arg name="headless" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="controller" default="pid"/>
<arg name="config" default="$(find q2d_bringup)/config/$(arg
gazebo.launch
<include file="$(find q2d_description)/launch/gazebo.launch" >
<arg name="paused" value="$(arg paused)"/>
<arg name="headless" value="$(arg headless)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
</include>
<rosparam file="$(arg config)" command="load"/>
<include file="$(find q2d_bringup)/launch/$(arg controller).launch"
/>
Download
e Instalação do Pacote
cd ~/catkin_ws/src wget http://www.ece.ufrgs.br/ros−pkgs/indigo−q2d−bringup.tgz tar −xvzpf indigo−q2d−bringup.tgz cd .. catkin_make source ~/catkin_ws/devel/setup.bashSimulação no Gazebo
Gráfico de Computação
Reconfiguração Dinâmica
• Permite a alteração de parâmetros dos nodos em
tempo de execução
• Nem todos os nodos do ROS utilizam
• PID do control_toolbox utiliza
• joint_state_controller não utiliza • CLI
rosrun dynamic_reconfigure dynparam
• GUI
Mover o Robô
• Para mover o robô deve-se publicar nos tópicos
das referências dos controladores
rostopic pub /shoulder_controller/command std_msgs/Float64 1 −1
rostopic pub /elbow_controller/command std_msgs/Float64 "{data:
−0.5}" −1
rosrun q2d_bringup ijc_step.sh 1 −0.5
rosrun q2d_bringup ijc_square.py /shoulder_controller/command
rqt
• Framework para GUIs
• Pode-se vizualizar várias instâncias do
Sem Saturação
rosrun q2d_bringup ijc_square.py /shoulder_controller/command