- PVSM.RU - https://www.pvsm.ru -
Добрый день, уважаемые читатели !
Недавно изучая книги по практическому использованию ROS я узнал об интересной возможности использования портов GPIO, доступных на Raspberry Pi из ROS. В этой статье я хочу рассказать о том, каким образом это возможно осуществить. Для доступа к портам GPIO на плате Raspberry Pi мы будем использовать библиотеку Wiring Pi. Кого заинтересовала эта тема, прошу под кат.
Для начала установим библиотеку Wiring Pi на Raspberry Pi:
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
Схему назначения портов GPIO на Raspberry Pi можно посмотреть в статье [1].
Мы сделаем простой пример мигания светодиодом с помощью команд, которые будем публиковать в топик ROS. Мы подключим светодиод к пинам на Raspberry Pi таким образом: короткую ножку (катод) к порту GND, длинную ножку (анод) к порту GPIO18 (пин номер 12 на схеме).
У нас получится такое подключение:
Создадим пакет ROS:
catkin_create_pkg ros_wiring_example
Создайте файл C++ со следующим кодом:
#include "ros/ros.h"
#include "std_msgs/Bool.h"
#include <iostream>
//Wiring Pi header
#include "wiringPi.h"
//Wiring PI first pin
#define LED 1
//Callback to blink the LED according to the topic value
void blink_callback(const std_msgs::Bool::ConstPtr& msg)
{
if(msg->data == 1){
digitalWrite (LED, HIGH) ;
ROS_INFO("LED ON");
}
if(msg->data == 0){
digitalWrite (LED, LOW) ;
ROS_INFO("LED OFF");
}
}
int main(int argc, char** argv)
{
ros::init(argc, argv,"blink_led");
ROS_INFO("Started RPi Blink Node");
//Setting WiringPi
wiringPiSetup ();
//Setting LED pin as output
pinMode(LED, OUTPUT);
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("led_blink",10,blink_callback);
ros::spin();
}
Здесь мы включаем библиотечный файл wiringPi.h и добавляем инициализацию вызовом метода wiringPiSetup(). Методы pinMode() и digitalWrite() выполняют то же самое, что одноименные методы, используемые для Arduino.
Создадим файл CMakeLists.txt с таким содержанием:
cmake_minimum_required(VERSION 2.8.3)
project(ros_wiring_examples)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
find_package(Boost REQUIRED COMPONENTS system)
//Include directory of wiring Pi
set(wiringPi_include "/usr/local/include")
include_directories(
${catkin_INCLUDE_DIRS}
${wiringPi_include}
)
//Link directory of wiring Pi
LINK_DIRECTORIES("/usr/local/lib")
add_executable(blink_led src/blink.cpp)
target_link_libraries(blink_led
${catkin_LIBRARIES} wiringPi
)
У нас будет простая логика. Создаем подписчика на топик led_blink типа Boolean. Если приходит значение 1, то зажигаем светодиод. Если приходит 0, то гасим светодиод.
Далее компилируем пакет:
cd ~/<catkin_ws>
catkin_make
source devel/setup.bash
И наконец запускаем узел:
roscore
Мы должны залогиниться из-под пользователя root для запуска узла:
sudo -s
cd /home/pi/<catkin_ws>
rosrun ros_wiring_example blink_led
Отправим команду для включения светодиода:
rostopic pub /blink_led std_msgs/Bool 1
Отправим команду для выключения светодиода:
rostopic pub /blink_led std_msgs/Bool 0
Все очень просто. Мы просто указываем топик blink_led, тип сообщения std_msgs/Bool и значение: 0 или 1.
Теперь можно использовать всю силу портов GPIO на Raspberry Pi в своих проктах. Мы можем подключать ультразвуковые сенсоры дистанции, сервомоторы и тд. и управлять ими или получать данные с них в узлах ROS без необходимости подключать дополнительные платы типа Arduino.
Желаю удачи в ваших робототехнических проектах с Raspberry Pi и до новых встреч!
Автор: vovaekb90
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/raspberry-pi/191745
Ссылки в тексте:
[1] статье: https://geektimes.ru/post/255050/
[2] Источник: https://geektimes.ru/post/280532/
Нажмите здесь для печати.