Arduino ROS custom messages

Para usar ROS custom messages (mensagens personalizadas) no Arduino com o rosserial, é obrigatório ter instalados no computador os pacotes do ROS:  rosserial e rosserial arduino. Para instalar pode-se usar os seguintes comandos:

sudo apt install ros-melodic-rosserial
sudo apt install ros-melodic-rosserial-arduino

Quando o programa para o Arduino requer mensagens personalizadas do ROS  (ROS custom messages). Como por exemplo quando inclui uma linha como a seguinte:

#include <ntbd_msgs/Motors_Array.h>

Teremos que efectuar um procedimento especial, que envolve a compilação do pacote de ROS que tem as mensagens personalizadas (neste caso o ntbd_msgs), e obter o ficheiro de header necessário (neste caso, o ficheiro Motors_Array.h).

Para obter o ficheiro header , é necessário, antes de mais, colocar o pacote do ROS com a definição da mensagem na pasta adequada do catkin e proceder á sua compilação:

cd ~/catkin_sw/src
git clone https://github.com/HotBlackRobotics/ntbd
cd ~/catkin_sw
catkin_make

De seguida, tem de se usar um dos seguintes comandos (pelos vistos existe a informação de vários devido à evolução das várias versões do ROS):

No ROS Melodic, o comando que funcionou foi  o ultimo dos indicados abaixo.

rosrun rosserial_client make_library.py ~/ ntbd_msgs
rosrun rosserial_arduino make_library.py ~/ ntbd_msgs
rosrun rosserial_arduino make_libraries.py ~/ ntbd_msgs

~/ representa a pasta de destino onde se encontra a ros_lib (biblioteca rosserial para o arduino)

ntbd_msgs, indica o pacote (com as mensagens) a ser compilado

O comando que usei (o último) gerou uma pasta ros_lib na home com toda a biblioteca do rosserial incluindo uma pasta ntbd_msgs que contem o ficheiro pretendido.

Nesta fase, e tendo em consideração o exemplo, podemos optar por uma das duas soluções:

  • Copiar a pasta ~/ros_lib/ntbd_msgs para ~/Arduino/libraries/ros_lib;
  • Copiar a pasta para dentro da pasta do sketch do arduino, e alterar uma linha de include para passar a incluir a biblioteca localmente: #include “ntbd_msgs/Motors_Array.h”

Já podemos compilar e enviar o programa para o Arduino

 

ROS custom messages

As mensagens personalizadas no ROS (ROS custom messages) são constituidas a partir das  mensagens préviamente disponiveis.

Para criar novas mensagens personalizadas (custom messages) deveremos proceder do seguinte modo:

Primeiro deveremos definir o novo tipo de mensagem num ficheiro que tem de ser criado dentro da pasta msg do respectivo pacote.

Preferencialmente deve existir um pacote exclusivo para as mensagens pois assim elas são mais facilmente reutilizaveis.

# MyCustomMsg.msg

Header header
float64 data

Para criar as mensagens, quer seja num pacote dedicado quer sejam incluidas num outro pacote em que convivem com outras funcionalidades, as instruções de compilação tem de obedecer a alguns requisitos:

O ficheiro package.xml deve conter:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

No ficheiro CMakeLists.txt, tem de incluir vários blocos de texto:

Incluir o pacote message_generation na entrada find_package, no ficheiro CMakeLists.txt, como no exemplo abaixo:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

Exportar a dependência em tempo de execução incluindo a seguinte entrada no ficheiro CMakeLists.txt:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...
)

Declarar o ficheiro com a mensagem personalizada com a seguinte entrada no ficheiro  CMakeLists.txt.

add_message_files(
  FILES
  MyCustomMsg.msg
)

Se existirem mais mensagens será é uma por linha. Adequar o nome do ficheiro(s) indicado nesta entrada.

Fica assim completa a parte dos requisitos para a nossa mensagem personalizada ser compilada e disponivel para ser usada.

Caso esta mensagem esteja num pacote diferente daquele onde vai ser usadas, por exemplo um pacote dedicado a mensagens, para usar esta mensagem é necessário incluir as seguintes entradas nos ficheiros package.xlm e CMakeLists.txt.

No ficheiro package.xlm incluir o nome do pacote (substituir pelo nome correcto do pacote), conforme o exemplo abaixo:

<depend package="message_package" />

No ficheiro CMakeLists.txt, incluir message_package (substituir pelo nome correcto do pacote) na entrada adequada (ver exemplo abaixo).

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_package
)

No que respeita ao inclusão e utilização da mensagem personalizada no código C++, é necessário proceder da seguinte forma:

Importar para o código C++ code.

#include <message_package/MyCustomMsg.h>

Declarar o topic  publisher:

my_msg_pub_ = n.advertise<message_package::MyCustomMsg>("topic", 10);

Criar uma instancia da mensagem numa variavel:

message_package::MyCustomMsg msg;

Atribuir o(s) valor(es) e publicar a mensagem.

msg.header.stamp = ros::Time::now();
msg.header.frame_id = "/world";
msg.data = 0.0;

my_msg_pub_.publish(msg);

Que me lembre é tudo.

Fontes:

  • http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv
  • http://wiki.ros.org/ROS/Tutorials/DefiningCustomMessages

 

arm3dof_jpc_nolim_nofb

O pacote do ROS arm3dof_jpc_nolim_nofb é um pacote didático para controlar um braço robótico baseado em servos sem feedback (com quatro articulações) que funciona com o ros control com um modelo simples e funcional de software do hardware interface necessário para o ros controller joint position controller.

Esta é uma das implementações mais simples que conheço de um hardware interface para o ros control.

Neste pacote existem as seguintes limitações:

  • O feed back do hardware não é real. O método limita-se a entregar o valor que da posição desejada que é enviada para o hardware (micro controlador);
  • Não existe a imposição de limites às articulações;

O pacote está funcional e disponivel no seguinte link:

https://github.com/inaciose/ros_hardware_interfaces/tree/master/arm3dof_jpc_nolim_nofb

Existe uma versão deste hardware_interface com implementação de limites.

arm3dof_jpc_nofb

O pacote do ROS arm3dof_jpc_nofb é um pacote didático para controlar um braço robótico baseado em servos sem feedback (com quatro articulações) que funciona com o ros control com um modelo simples e funcional de software do hardware interface necessário para o ros controller joint position controller.

Esta versão implementa a imposição de limites definida num ficheiro yaml.

Neste pacote existem as seguintes limitações:

  • O feed back do hardware não é real. O método limita-se a entregar o valor que da posição desejada que é enviada para o hardware (micro controlador);

O pacote está funcional e disponivel no seguinte link:

https://github.com/inaciose/ros_hardware_interfaces/tree/master/arm3dof_jpc_nofb

Existe uma implementação de um hardware interface para o ros control sem a imposição de limites e por isso mais simples.

 

Install openrave ubuntu 18.04 bionic

Required instalation to use IK-Fast on ROS moveit

Install OpenRAVE  from source on Ubuntu 18.04 bionic No official PPA.

sudo apt install git
sudo apt install libboost-filesystem-dev libboost-system-dev libboost-python-dev libboost-thread-dev libboost-iostreams-dev libboost-numpy-dev
sudo apt install libqt4-dev qt4-dev-tools libxml2-dev libode-dev
sudo apt install libsoqt4-dev libcoin80-dev
sudo apt install rapidjson-dev liblapack-dev

# For openravepy. Note that Xenial sympy is 0.7.6, see next line
sudo apt install python-scipy

# OpenRAVE ikfast needs sympy 0.7.1, https://github.com/rdiankov/openrave/p ull/407
pip install --upgrade --user sympy==0.7.1

# Open .zae files, only Ubuntu 16.04
sudo apt install libcollada-dom2.4-dp-dev

cd # go home

mkdir -p repos; cd repos # create $HOME/repos if it doesn't exist; then, enter it 
git clone --branch boost-1.6x-forcompile https://github.com/roboticslab-uc3m/openrave.git # git clone --branch master https://github.com/rdiankov/openrave.git 
cd openrave; mkdir build; cd build 
cmake .. -DOPT_VIDEORECORDING=OFF # Avoids AV errors 
make -j$(nproc) 

sudo make install; cd # install and go home

Note that you may end up requiring over 2 GB of free space during the installation of apt dependencies. To avoid that, use the –noinstall-recommends option as in:

sudo apt install –no-install-recommends package

Thus, apt would not try to install non-critical packages marked as recommended by the dependencies of OpenRAVE.

Known Issues (Ubuntu 18.04) In case you run into non-constant-expression cannot be narrowed from type ‘double’ to ‘float’ in initializer list [- Wc++11-narrowing] errors (happened on OpenRAVE 0.15 and a Clang 6.0.0/7.0.0 compiler), reconfigure CMake with the following option: cmake .. -DOPT_IKFAST_FLOAT32=OFF Install Openrave 4

 

Source of instructions

http://robots.uc3m.es/gitbook-installation-guides/installation-guides.pdf

ros_controllers

ROS controllers, ros_controllers

Os controladores no ROS, (ros_controllers) são lançados e geridos com o gestor de controladors (controller_manager) e para poderem ser executados têm de cumprir com alguns requisitos, entre os quais o principal é herdarem a classe controller_interface::Controller. Para saber mais sobre o assunto, especialmente se for necessário desenvolver um controller  ver: controller_interface.

Apesar de podermos fazer controladores personalizados, já existem vários tipos de controladores disponíveis para o ROS e que no seu conjunto compõem o meta-pacote conhecido por ros_controllers:

  • ackermann_steering_controller
  • diff_drive_controller
  • effort_controllers
  • force_torque_sensor_controller
  • forward_command_controller
  • gripper_action_controller
  • imu_sensor_controller
  • joint_state_controller
  • joint_trajectory_controller
  • position_controllers
  • velocity_controllers

Estes pacotes devem ser usados conforme o hardware que é explorado no robot.

 

ros_control

ROS control, ros_control

O ROS control é a area do ROS que se dedica à normalização e gestão da aplicação de técnicas de controlo sobre o hardware (actuadores e sensores) dos robots.  O ros_control está intimamente ao ros_controllers.

ros_control packages

Os pacotes que compõem o ros_control são os seguintes:

Dos pacotes acima destaco os seguintes pacotes por terem uma utilização generalizada no uso do ros_control.

  • controller_manager
  • hardware_interface
  • joint_limits_interface

A importância destes pacotes pode ser verificada pela observação dos includes existentes no ficheiro de cabeçalho minimalista usado num pacote de hardware interface especifico para um robot simples (ver mais em hardware_interface).