From 6ef7197c0938821686aa165ee183593c82d620fc Mon Sep 17 00:00:00 2001 From: Warren Dmello Date: Sat, 25 Oct 2025 05:58:16 +0000 Subject: [PATCH] Completed Turtlesim sine challenge --- src/challenge/CMakeLists.txt | 37 +++++++++++++++++++++ src/challenge/package.xml | 21 ++++++++++++ src/challenge/src/solution.cpp | 59 ++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/challenge/CMakeLists.txt create mode 100644 src/challenge/package.xml create mode 100644 src/challenge/src/solution.cpp diff --git a/src/challenge/CMakeLists.txt b/src/challenge/CMakeLists.txt new file mode 100644 index 0000000..120ed86 --- /dev/null +++ b/src/challenge/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.5) +project(challenge) + +# Default to C99 +if(NOT CMAKE_C_STANDARD) + set(CMAKE_C_STANDARD 99) +endif() + +# Default to C++14 +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(turtlesim REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() +endif() + +add_executable(solution src/solution.cpp) +ament_target_dependencies(solution rclcpp geometry_msgs turtlesim) + +install(TARGETS + solution + DESTINATION lib/${PROJECT_NAME}) + +ament_package() + diff --git a/src/challenge/package.xml b/src/challenge/package.xml new file mode 100644 index 0000000..8ccea14 --- /dev/null +++ b/src/challenge/package.xml @@ -0,0 +1,21 @@ + + + + challenge + 0.0.0 + TODO: Package description + warren2005 + TODO: License declaration + + ament_cmake + + rclcpp + geometry_msgs + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/src/challenge/src/solution.cpp b/src/challenge/src/solution.cpp new file mode 100644 index 0000000..fbc80ba --- /dev/null +++ b/src/challenge/src/solution.cpp @@ -0,0 +1,59 @@ +#include +#include +#include "rclcpp/rclcpp.hpp" +#include "turtlesim/msg/pose.hpp" +#include "turtlesim/srv/teleport_absolute.hpp" +#include "geometry_msgs/msg/twist.hpp" + +using namespace std::chrono_literals; + +class SinePlotter : public rclcpp::Node +{ +public: + SinePlotter() : Node("solution_node"), t_(0.0) + { + client_ = this->create_client("/turtle1/teleport_absolute"); + + // wait for teleport service + while(!client_->wait_for_service(1s)) { + RCLCPP_INFO(this->get_logger(), "Waiting for turtlesim..."); + } + + timer_ = this->create_wall_timer(20ms, std::bind(&SinePlotter::plot_callback, this)); + } + +private: + void plot_callback() + { + double x0 = 5.5; // center of screen (midpoint) + double y0 = 5.5; // vertical starting point + double amplitude = 3.0; // height of sine wave + double speed = 0.05; // how fast to move across x-axis + double frequency = 2.0; // sine wave frequency + + double x = x0 + t_; + double y = y0 + amplitude * std::sin(frequency * t_); + double theta = 0.0; // orientation doesn't matter + + auto request = std::make_shared(); + request->x = x; + request->y = y; + request->theta = theta; + client_->async_send_request(request); + + t_ += speed; + } + + rclcpp::TimerBase::SharedPtr timer_; + rclcpp::Client::SharedPtr client_; + double t_; +}; + +int main(int argc, char * argv[]) +{ + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} +