Создание пакета - AR600Vision/Home GitHub Wiki

Ссылки на гайды

Ссылки на гайды по созданию пакетов

Создание пакета

Сборка пакета

Кодинг пакета

Больше туториалов:

Краткая компиляция из туториалов

Это небольшая вытяжка из туториалов. Не имеет смысла, потому что я уже нашел хороший урок с русскими комментариями. Но обратить внимание на CMake.

Пакет называется Helloworld

Создание пакета

$ cd ~/ros_workspace/src
$ catkin_create_pkg helloworld std_msgs rospy roscpp

Эта команда принимает название пакета и список зависимостей 1го уровня

В папке helloworld/src создайте два файла: talker.cpp, listener.cpp

Создание publisher

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;

}

Создание Subscriber

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

Перед сборкой надо настроить 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 для просмотра всех нод и топиков:

rqt_graph

⚠️ **GitHub.com Fallback** ⚠️