Создание пакета - AR600Vision/Home GitHub Wiki
Ссылки на гайды по созданию пакетов
-
Русский гайд. Этот гайд под старую версию, где
rosbuild, а неcatkin, но C++ код такой же. Рекомендуется. Очень хорошее описание. - Официальная документация
Больше туториалов:
Это небольшая вытяжка из туториалов. Не имеет смысла, потому что я уже нашел хороший урок с русскими комментариями. Но обратить внимание на CMake.
Пакет называется Helloworld
$ cd ~/ros_workspace/src
$ catkin_create_pkg helloworld std_msgs rospy roscpp
Эта команда принимает название пакета и список зависимостей 1го уровня
В папке helloworld/src создайте два файла: talker.cpp, listener.cpp
talker.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc, char** argv)
{
//Инициируем ROS
ros::init(argc, argv, "talker");
//Хэндл ноды, используется для работы с ROS
ros::NodeHandle n;
/* Создаем объект для публикации сообщений в топики
* std_msgs::String - тип сообщений в топике
* chatter - название топика
* 100 - максимальное число сообщений в очереди. Если их будет больше,
* старые будут удаляться */
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",100);
//Установка периода, с какой будет работать в цикле наша нода
ros::Rate loop_rate(1);
/* Цикл будет повторятся до тех пор, пока не будет
* нажат CTR+C
* уничтожен объект NodeHandle
* будет вызван ros::shutdown
* сеть сломается */
int count=0;
while(ros::ok())
{
//Формируем строку
std::stringstream ss;
ss << "Hello World "<<count++;
//Создаем сообщение и задаем значение
std_msgs::String msg;
msg.data = ss.str();
//Публикуем сообщение в топик
chatter_pub.publish(msg);
//ЛОГ
ROS_INFO("%s", msg.data.c_str());
/* Это необходимо для более сложных программ,
* которые принимают данные. Иначе коллбеки не
* будут работать */
ros::spinOnce();
//Необходимая задержка
loop_rate.sleep();
}
return 0;
}Listener.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
//Обработчик получения сообщений
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
/*
* Подписываемся на топик
* chatter - название топика
* 100 - размер очереди сообщений
* callback-функция, вызываемая при получении сообщений */
ros::Subscriber sub = n.subscribe("chatter",100, chatterCallback);
/*
* Будет крутится в цикле до нажатия CTR+C
* Все обработчиики выполняются в главном потоке.
* Как делать многопоточное хз */
ros::spin();
return 0;
}Перед сборкой надо настроить CMakeList.txt. Это особая магия, не очень понятная.
После создания пакета, был создан большой, по большей части закомментированный файл.
В официальном туториале есть более короткий и понятный файл, но в нем есть ошибки.
cmake_minimum_required(VERSION 2.8.3)
project(helloworld)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
##########################################################################################
# !!! В этом туториале нет сервисов, поэтому эти строки не нужны и приведут к ошибке !!! #
##########################################################################################
# Declare ROS messages and services #
# add_message_files(FILES Num.msg) #
# add_service_files(FILES AddTwoInts.srv) #
# #
# Generate added messages and services #
# generate_messages(DEPENDENCIES std_msgs) #
###########################################################################################
## Declare a catkin package
catkin_package()
## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})
# Создаем исполняемые файлы на каждую ноду в пакете. У нас их две - talker и listener
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES}) # Важно указать библиотеки, иначе компиляция не удастся
# Тоже нет
# add_dependencies(talker helloworld_generate_messages_cpp)`
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES}) # Важно указать библиотеки, иначе компиляция не удастся
# Тоже нет
# add_dependencies(listener helloworld_generate_messages_cpp)$ cd ~/ros_workspace/src
$ catkin_make
Внимание: Для работы catkin_make нужно быть в директории ros_workspace/src, а не в директории пакета! Это приведет к сборке всего, что есть
Если надо собрать один или несколько пакетов:
$ catkin_make --pkg <package A> <package B>
Каждое действие надо выполнять в отдельном терминале
$ roscore
Talker:
$ rosrun helloworld talker
Listener:
$ rosrun helloworld listener
В терминале listener'a и talker'а можно видеть сообщения.
Можно открыть rqt_graph для просмотра всех нод и топиков:
