ROS2 - topic(c++)

2024. 10. 21. 17:06ROS2/기초

cmd_vel_pub.cpp

// Copyright 2021 Seoul Business Agency Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <memory>
#include "geometry_msgs/msg/twist.hpp"
#include "rclcpp/rclcpp.hpp"

class TwistPub : public rclcpp::Node {
private:
  rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr m_pub;
  rclcpp::TimerBase::SharedPtr m_timer;

  geometry_msgs::msg::Twist m_twist_msg;

  void timer_callback() { move_robot(); }

public:
  TwistPub() : Node("cmd_vel_pub_node") {
    RCLCPP_INFO(get_logger(), "Cmd_vel Pub Node Created");

    m_pub = create_publisher<geometry_msgs::msg::Twist>("skidbot/cmd_vel", 10);
    m_timer = create_wall_timer(std::chrono::milliseconds(100),
                                std::bind(&TwistPub::timer_callback, this));
  }

  void move_robot() {
    m_twist_msg.linear.x = 0.5;
    m_twist_msg.angular.z = 1.0;
    m_pub->publish(m_twist_msg);
  }

  void stop_robot() {
    m_twist_msg.linear.x = 0.0;
    m_twist_msg.angular.z = 0.0;
    m_pub->publish(m_twist_msg);

    RCLCPP_INFO(get_logger(), "==== Stop Robot ====");
  }
};

int main(int argc, char **argv) {
  rclcpp::init(argc, argv);

  auto twist_pub = std::make_shared<TwistPub>();

  auto t_start = twist_pub->now();
  auto t_now = twist_pub->now();

  auto stop_time = 5.0;

  while ((t_now - t_start).seconds() < stop_time) {
    t_now = twist_pub->now();
    // rclcpp::spin_some(twist_pub);
    twist_pub->move_robot();

    RCLCPP_INFO(twist_pub->get_logger(), "%f Seconds Passed", (t_now - t_start).seconds());
  }

  twist_pub->stop_robot();

  rclcpp::shutdown();

  return 0;
}

 

laser_sub.cpp

// Copyright 2021 Seoul Business Agency Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/laser_scan.hpp"

using LaserScan = sensor_msgs::msg::LaserScan;

class LaserSub : public rclcpp::Node {
private:
  rclcpp::Subscription<sensor_msgs::msg::LaserScan>::SharedPtr m_sub;

public:
  LaserSub() : Node("topic_sub_oop_node") {
    m_sub = this->create_subscription<sensor_msgs::msg::LaserScan>(
        "skidbot/scan", 10,
        std::bind(&LaserSub::sub_callback, this, std::placeholders::_1));
  }

  void sub_callback(const sensor_msgs::msg::LaserScan::SharedPtr msg) {
    // std::cout << (msg->ranges).size() << std::endl;

    // for (auto e : msg->ranges)
    //   std::cout << e << std::endl;

    RCLCPP_INFO(this->get_logger(), "Distance from Front Object : %f", (msg->ranges)[360]);
  }
};

int main(int argc, char **argv) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<LaserSub>());
  rclcpp::shutdown();

  return 0;
}

 

추가 정보

spin_some 쓰는 이유

 

twist_pub->move_robot(); 사용:

  • 이 코드는 단순히 로봇을 일정 시간 동안 움직이게 하려는 목적입니다. 외부에서 들어오는 이벤트나 콜백을 처리하지 않고, 루프 동안 로봇에 계속해서 움직이라는 명령을 보내는 역할만 합니다.

rclcpp::spin_some(twist_pub); 사용:

  • 이 코드는 로봇의 동작뿐만 아니라, 외부의 메시지서비스 요청과 같은 콜백도 동시에 처리하고자 할 때 사용됩니다.
  • 즉, spin_some()을 사용하면 로봇을 움직이면서도 다른 입력(예: 센서 데이터, 다른 노드에서 보내는 메시지)을 처리할 수 있습니다.

 

네이밍 컨벤션

  1. 헤더 파일 (Header Files):
    • 보통 snake_case를 사용합니다.
    • 예를 들어, 파일 이름이 my_publisher.hpp와 같이 작성됩니다.
  2. 실제 코드 (Source Code):
    • 일반적으로 CamelCase를 사용합니다.
    • 예를 들어, 클래스 이름은 MyPublisher, 메서드 이름은 createPublisher()처럼 작성됩니다.

 

this

this는 C++에서 클래스의 현재 인스턴스를 가리키는 포인터입니다. 클래스의 멤버 함수 내에서 사용되며, 객체의 속성이나 메서드에 접근할 때 유용합니다

'ROS2 > 기초' 카테고리의 다른 글

ROS2(humble + 22.04) depth camera  (0) 2024.12.17
ubuntu 24.04 ssh 설정 + docker 설정  (0) 2024.12.06
ROS2 4일차(2) Maze World  (0) 2024.09.24
ROS2 4일차(1) Maze World  (0) 2024.09.24
ROS2 3일차(4) Action 프로그래밍  (0) 2024.09.23