예제가 ros/ros.h를 사용하는게 많아 이를 참고하여 사용하려 하였지만, ROS2로 넘어오면서 rclcpp로 개발하는 것 같다.
- 추가로 ros/ros.h와 rclcpp/rclcpp.h의 구동 코드 구조가 많이 다르다.
package.xml, CMakeList.txt의 문제였다
각각에 dependence를 추가해주었다.
일단은 변수 명을 다르게 해서 해결중이다... 변수 release등에 관해서는 나중에 찾아봐야 할듯
delete로 해결 안됨
rclpy에서는 call_async, spin_once로 한번씩 실행이 가능하지만 cpp에서는 해당 함수가 없어서 해당 함수를 사용했다. 자세한 사용법은 좀 더 알아봐야함
#include "rclcpp/rclcpp.hpp"
#include "turtlesim/srv/kill.hpp"
#include "turtlesim/srv/spawn.hpp"
#include "turtlesim/srv/teleport_absolute.hpp"
#include "std_srvs/srv/empty.hpp"
#include "turtlesim/srv/kill.hpp"
#include <sstream>
#include <unistd.h>
#include <math.h>
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
auto test_node = rclcpp::Node::make_shared("client_test");
rclcpp::Client<std_srvs::srv::Empty>::SharedPtr cli_reset =
test_node->create_client<std_srvs::srv::Empty>("/reset");
auto req_reset = std::make_shared<std_srvs::srv::Empty::Request>();
auto result_reset = cli_reset->async_send_request(req_reset);
rclcpp::spin_until_future_complete(test_node, result_reset);
rclcpp::Client<turtlesim::srv::Kill>::SharedPtr cli_kill =
test_node->create_client<turtlesim::srv::Kill>("/kill");
auto req_kill = std::make_shared<turtlesim::srv::Kill::Request>();
req_kill->name = "turtle1";
auto result_kill = cli_kill->async_send_request(req_kill);
rclcpp::spin_until_future_complete(test_node, result_kill);
float before_x = 6.0;
float before_y = 6.0;
float star_length = 2.0;
int star_degrees[] = {
0,
-144,
-72,
144,
-144,
72,
144,
0,
72,
-72
};
rclcpp::Client<turtlesim::srv::Spawn>::SharedPtr cli_spawn =
test_node->create_client<turtlesim::srv::Spawn>("/spawn");
auto req_spawn = std::make_shared<turtlesim::srv::Spawn::Request>();
req_spawn->x = before_x;
req_spawn->y = before_y;
req_spawn->name = "turtle1";
auto result_spawn = cli_spawn->async_send_request(req_spawn);
rclcpp::spin_until_future_complete(test_node, result_spawn);
rclcpp::Client<turtlesim::srv::TeleportAbsolute>::SharedPtr cli_teleport =
test_node->create_client<turtlesim::srv::TeleportAbsolute>("/turtle1/teleport_absolute");
auto req_teleport = std::make_shared<turtlesim::srv::TeleportAbsolute::Request>();
const double PI = 3.1415926;
for(int degree: star_degrees) {
req_teleport->x = before_x + star_length * cos(PI * degree / 180.0);
req_teleport->y = before_y + star_length * sin(PI * degree / 180.0);
auto result_teleport = cli_teleport->async_send_request(req_teleport);
rclcpp::spin_until_future_complete(test_node, result_teleport);
before_x = req_teleport->x;
before_y = req_teleport->y;
}
rclcpp::shutdown();
return 0;
}