ROS2 CPP 삽질 일기 - Turtlesim으로 별그리기

조홍기·2023년 12월 20일

ros

목록 보기
6/8

1. ROS2에서는 rclcpp/rclcpp.hpp를 사용한다.

예제가 ros/ros.h를 사용하는게 많아 이를 참고하여 사용하려 하였지만, ROS2로 넘어오면서 rclcpp로 개발하는 것 같다.

  • 추가로 ros/ros.h와 rclcpp/rclcpp.h의 구동 코드 구조가 많이 다르다.

2. rclcpp.hpp가 include 되지 않음.

package.xml, CMakeList.txt의 문제였다
각각에 dependence를 추가해주었다.

3. 변수 conflicting declaration

일단은 변수 명을 다르게 해서 해결중이다... 변수 release등에 관해서는 나중에 찾아봐야 할듯
delete로 해결 안됨

4. async_send_request, spin_until_future_complete

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;
}
profile
ROS, Python, Cpp 공부 중입니다.

0개의 댓글