Adaptação de dois pacotes com a inclusão de um robot com camera e um node de conversão entre mensagens twist e ackermann, para usar nas simulações do gazebo.
Para ligar a Microsoft Kinect 360 ao computador é necessário ter um adaptador que consiste num transformador, um connector (onde vai ligar o cabo da Kinect 360) e um cabo com USB que sai da caixa do connector e vai ligar a uma porta USB no computador.
dav
Os testes foram efectuados num portatil Lenovo IdeaPad S145, com o Linux Ubuntu Bionic (18.04)
Informações sobre a distro
~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Informações sobre o kernel
~$ uname -a
Linux ideapad 5.4.0-66-generic #74~18.04.2-Ubuntu SMP Fri Feb 5 11:17:31 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Informções USB da Kinect 360
~$ lsusb
Bus 001 Device 010: ID 045e:02ae Microsoft Corp. Xbox NUI Camera
Bus 001 Device 008: ID 045e:02b0 Microsoft Corp. Xbox NUI Motor
Bus 001 Device 009: ID 045e:02ad Microsoft Corp. Xbox NUI Audio
Exploração da Kinect 360 no linux sem o ROS
Podemos explorar a kinect fora do ros com o pacote libfreenect-bin. Este pacote pode ser instalado usando o apt.
Instalação no ubuntu do libfreenect-bin, ou do freenect, que o inclui.
sudo apt install freenect
Depois de instalado podemos executar um programa de exploração da kinect 360.
~$ freenect-glview
Este comando apresenta uma janela com a imagem da deep camera do lado esquerdo e uma imagem da camara rgb do lado direito.
Além disso permite controlar alguns aspectos da kinect, nomeadamente o controlo da inclinação. Os comandos disponiveis são os seguintes:
‘w’ – tilt up, ‘s’ – level, ‘x’ – tilt down,
‘0’-‘6’ – select LED mode,
‘+’ & ‘-‘ – change IR intensity
‘f’ – change video format, ‘m’ – mirror video,
‘o’ – rotate video with accelerometer
‘e’ – auto exposure, ‘b’ – white balance,
‘r’ – raw color, ‘n’ – near mode (K4W only)
Saida na consola após a execução do comando
Kinect camera test
Number of devices found: 1
GL thread
[Stream 70] Negotiated packet size 1920
write_register: 0x0105 <= 0x00
write_register: 0x0006 <= 0x00
write_register: 0x0012 <= 0x03
write_register: 0x0013 <= 0x01
write_register: 0x0014 <= 0x1e
write_register: 0x0006 <= 0x02
write_register: 0x0017 <= 0x00
[Stream 80] Negotiated packet size 1920
write_register: 0x000c <= 0x00
write_register: 0x000d <= 0x01
write_register: 0x000e <= 0x1e
write_register: 0x0005 <= 0x01
[Stream 70] Lost 240 total packets in 0 frames (inf lppf)
[Stream 70] Lost 270 total packets in 0 frames (inf lppf)
write_register: 0x0047 <= 0x00
(...)
A exploração do audio pode ser efectuada com o comando:
freenect-micview
No entanto o teste, conforme se pode verificar nas mensagens exibidas abaixo, correu mal.
~$ freenect-micview
Number of devices found: 1
Trying to open ./audios.bin as firmware...
Trying to open /home/inaciose/.libfreenect/audios.bin as firmware...
Trying to open /usr/local/share/libfreenect/audios.bin as firmware...
Trying to open /usr/share/libfreenect/audios.bin as firmware...
Trying to open ./../Resources/audios.bin as firmware...
upload_firmware: failed to find firmware file.
upload_firmware failed: -2
This is the libfreenect microphone waveform viewer. Press 'q' to quit or spacebar to pause/unpause the view.
audio: invalid magic in iso IN packet: 00000000
Pelos vistos o problema é que não consegue encontrar o ficheiro com o firmware (audios.bin).
Uma pesquisa na web referiu a necessidade de executar o scritp fwfetcher.py para gerar o ficheiro audio.bin, que posteriormente deve ser copiado para uma das localizações acima.
Tentei resolver o assunto instalando o pacote python-freenect com o seguinte comando, mas não resolveu.
sudo apt install python-freenect
Terei que pesquisar melhor este assunto mais tarde.
Exploração da Kinect 360 no ROS
As potencialidades da kinect 360 podem ser exploradas no ros com uma coleção de pacotes que podem ser instalados com o apt.
Pelos vistos existem há pelo menos duas soluções para a integração da kinect 360 no ROS melodic, uma baseada no openni e outra no freenect.
Nas minhas experiencias anteriores tinha instalado o pacote freenect para o ros, no entanto o pacote libfreenect para o ros melodic não está disponvel no ubunto bionic. pelo menos quando o tentamos instalar com o comando:
sudo apt install ros-melodic-libfreenect
Aparece o seguinte erro:
E: Unable to locate package ros-melodic-libfreenect
Pelos vistos, e conforme exibido na pagina do pacote, o pacote libfreenect está apenas disponivel para o ros Kinectic.
http://wiki.ros.org/libfreenect
A pesquisa dos pacotes disponiveis cujo nome inclui libfreenect revelou algumas opções
No entanto a descrição ‘A libfreenect-based ROS driver for the Microsoft Kinect’ é exactamente nas duas o que não ajuda muito, mas ambos tem uma página que os descreve na wiki do ROS, que já referi acima, e nela descobri que o freenect-camera faz parte do freenect-stack.
Indeciso sobre se devia instalar o pacote libfreenect-stack, resolvi experimentar se o seguinte comando funcionava (e funcionou).
roslaunch openni_launch openni.launch
O comando devolve algumas informações sobre a kinect e publicando alguns topicos que podem ser usados no rviz
[ INFO] [1615640624.323407153]: Number devices connected: 1
[ INFO] [1615640624.323701914]: 1. device on bus 001:10 is a SensorV2 (2ae) from PrimeSense (45e) with serial id 'A00361A02199045A'
[ INFO] [1615640624.324962821]: Searching for device with index = 1
[ INFO] [1615640624.372737787]: Opened 'SensorV2' on bus 1:10 with serial number 'A00361A02199045A'
[ INFO] [1615640624.406604267]: rgb_frame_id = 'camera_rgb_optical_frame'
[ INFO] [1615640624.406676036]: depth_frame_id = 'camera_depth_optical_frame'
[ WARN] [1615640624.412769205]: Camera calibration file /home/inaciose/.ros/camera_info/rgb_A00361A02199045A.yaml not found.
[ WARN] [1615640624.412859410]: Using default parameters for RGB camera calibration.
[ WARN] [1615640624.412937672]: Camera calibration file /home/inaciose/.ros/camera_info/depth_A00361A02199045A.yaml not found.
[ WARN] [1615640624.412998888]: Using default parameters for IR camera calibration.
Kinect 360 com openni no rviz
A exploração da kinect 360 no rviz pode ser efectuada recorrendo aos seguintes displays:
Image
Camera
Pointcloud2
DeepCloud
Os dois ultimos displays, têm configurações para atribuir cores aos pontos, sobreposição de imagem com a camera rgb, etc.
ros-melodic-freenect-stack
Numa primeira parte descrevo a instalação e a exploração da solução openni, que era a que conhecia.
Kinect 360 com o ros freenect-stack no ubuntu bionic
Nesta segunda parte descrevo a instalação e a exploração da soluçãofreenect-stack, que no decorrer deste processo me apercebi que é uma alternativa a solução baseada em openni.
A instalação do software necessário no ros é efectuada com o apt
sudo ros-melodic-freenect-stack
Decidi não instalar neste computador. Eventualmente vou tentar a instalação mais tarde no ros noetic.
Apendice
Tópicos publicados pelos programas lançados pelo comando:
Pacote ROS para controlar base de robot móvel de propulsão diferencial com um RaspberryPi e um STM32F.
https://github.com/inaciose/rospibot6
O pacote do ROS inclui o seguinte software:
O node base que comunica por I2C com o microcontrolador STM32F
Vários nodes em Python que implementam isoladamente algumas das funções incluídas no node base.
Conjuntos de launch files e yaml com parâmetros de exemplo para a exploração da base em tarefas de navegação autónoma.
O node base depende do software para o microcontrolador STM32F.
O node base foi pensado para ser monolítico e incluir nele várias funções que podem estar dispersas por vários módulos.
twist_diff
pid controler
IMU MPU6050
odometria
interface de LCD e botões
interface MCU ROS
No entanto, apesar de todos estas funções estarem implementadas, até este momento momento as tarefas de navegação bem sucedidas fizeram uso dos node externo para a odometria e do controlo pid existente no microcontrolador,
Enumerando as funcionalidades no node base e o seu estado
O componente twist_diff que faz a conversão das velocidades expressas nas mensagens twist para as velocidades que cada um das duas rodas deve ter está a funcionar e a ser usado (se bem que foi desenhado de forma diferente da implementação do chefbot)
O pid controler tanto quanto me lembro está a funcionar, mas não está a ser usado.
O IMU está funcional e foi objeto de testes bem sucedidos com o pacote robot_pose_ekf.
A odometria, está implementada mas tanto quanto me lembro tem problemas e não está a ser usada, pois os robots estão a usar um node externo.
O interface de LCD e botões está funcional mas não está a ser usado, porque nenhum dos robots atuais tem o hardware necessário.
O interface MCU ROS está a funcionar.
O software para o microcontrolador STM32F será uma das versões disponíveis no seguinte repositório.
https://github.com/inaciose/rospibot6mcu
Sem uma averiguação mais detalhada o programa adequado deve ser um destes dois:
rospibot6_stm32d_v4
rospibot6_stm32d_v4d
A principal diferença entre estes dois programas é que o v4d faz uso de dois interrupts, um por cada canal do encoder , o que me faz apostar que este seja o programa adequado pois os pulsos por rotação que estão definidos nos parâmetros do node base são bastante elevados.
As instruções para instalar e usar estão no github.
Descrição do contexto que deu origem ao desenvolvimento do pacoteros_mpu6050_calibration.
Tenho estado a tentar fazer a fusão dos dados do IMU com a odometria usando o pacote robot_pose_ekf.
http://wiki.ros.org/robot_pose_ekf
O teste que efectuei não deu bons resultados, pois o resultado da fusão dos dados do IMU com a odometria, é uma pose completamente diferente daquela que é dada pela odometria e indubitavelmente de muito má qualidade.
Direi mesmo que o resultado no teste efectuado foi uma evolução da pose completamente divergente.
A represestação no rviz é feita com o visualização da: PoseWithCovariance tendo como fonte o topico: /robot_pose_ekf/odom_combined
O resultado deste teste pode ser obervado no seguinte video.
Após ter usado o programa para calibrar o mpu6050, e ter incluido na configuração do node adequado os offsets indicados nos parametros de configuração do mpu6050, efectuei outro teste e o resultado foi mais animador. Conforme se pode observar no seguinte video, a seta vermelha já não aponta para cima, nem diverge com o movimento do robot.
Outra coisa reparei foi que a visualização no topico imu/data, que antes da calibração dava uma seta enorme a apontar para a frente direita do robot e inclinada para cima, agora aparece uma setaao principio que rapidamente desaparece.
Fazer o login (password: ubuntu), ssh ubuntu@10.42.0.1
Trocar a password
locale-gen pt_PT.UTF-8
locale-gen en_US.UTF-8
sudo apt update (optional: sudo apt upgrade)
sudo systemctl disable magni-base (o serviço roscore continua a funcionar)
trocar o hostname, https://www.cyberciti.biz/faq/ubuntu-change-hostname-command/
pifi add sid password
reboot
Bibliotecas Instaladas
INSTALL I2Cdevlib:
sudo mkdir -p /usr/share/arduino/libraries cd /usr/share/arduino/libraries
sudo git clone https://github.com/chrisspen/i2cdevlib.git
INSTALL Bcm2835:
cd /tmp
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz
tar zxvf bcm2835-1.50.tar.gz
cd bcm2835-1.50
./configure
make
sudo make check
sudo make install