RoboxКомплект из сервопривода и датчика расстояния
V.4Лабораторный стенд Promobot
RRStudioПростое написание алгоритмов
TestDevicesТестирование оборудования и проверка связи
Настройка WSL2Windows Subsystem for Linux
TelegramНаписать в чат технической поддержки
#include "ros/ros.h"
#include "trajectory_msgs/JointTrajectory.h"
#include <string>
#include <vector>
#define JOINTS_COUNT 7
enum RookySide
{
	LEFT = 0,
	RIGHT
};
int main(int argc, char **argv)
{
	// Определим тип Rooky
	RookySide rooky_side = RIGHT;
	// Инициализируем ROS с указанием названия узла
	ros::init(argc, argv, "move_joints");
	ros::NodeHandle nh;
	ros::Rate loop_rate(20);
	// В зависимости от типа Rooky определим наименование топика
	// в который необходимо отправлять сообщение
	std::string controller_name;
	if (rooky_side == RIGHT)
		controller_name = "right_arm_controller/command";
	else
		controller_name = "left_arm_controller/command";
	// Определим publisher с очередью в 1 сообщение
	ros::Publisher msg = nh.advertise<trajectory_msgs::JointTrajectory>(controller_name.c_str(), 1);
	// Создадим сообщение которое будем отправлять в топик
	// Данное сообщение будет содержать положение сразу всех суставов
	trajectory_msgs::JointTrajectory joints_state;
	joints_state.joint_names.resize(JOINTS_COUNT);
	for (int i = 1; i < JOINTS_COUNT + 1; i++)
	{
		// Построим имя сустава, 
		// например строка с именем должна выглядеть так:
		// "left_arm_1_joint"
		std::string joint_name;
		if (rooky_side == RIGHT)
			joint_name += "right";
		else
			joint_name += "left";
		joint_name += "_arm_";
		// Переведем int в ASCII цифру
		joint_name += boost::lexical_cast<std::string>(i); 
		joint_name += "_joint";
		// Добавим имя сустава в сообщение
		joints_state.joint_names[i - 1] = joint_name;
	}
	// Создадим описание положений - Точки
	std::vector<trajectory_msgs::JointTrajectoryPoint> points(1);
	while (ros::ok())
	{
		// Не будем задавать скорость движения
		points[0].velocities.resize(0);
		// Задаим время, которое должна двигаться Rooky до указанного положения
		points[0].time_from_start.sec = 1;
		points[0].positions.resize(JOINTS_COUNT);
		// Последовательно запишем позиции для каждого узла
		for (int i = 0; i < JOINTS_COUNT; i++)
		{
			// Первоначально все суставы двигаем на 1 радиан
			// Потом все суставы возвращаем в 0
			if (points[0].positions[i] != 0)
				points[0].positions[i] = 0;
			else
				points[0].positions[i] = 1;
		}
		joints_state.points = points;
		// Опубликуем сообщение в топик
		msg.publish(joints_state);
		// Сделаем паузу на 5 секунд
		ros::Duration(5).sleep();
		ros::spinOnce();
		loop_rate.sleep();
	}
	return 0;
}