ROS2 - topic(c++)
2024. 10. 21. 17:06ㆍROS2/기초
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()을 사용하면 로봇을 움직이면서도 다른 입력(예: 센서 데이터, 다른 노드에서 보내는 메시지)을 처리할 수 있습니다.
네이밍 컨벤션
- 헤더 파일 (Header Files):
- 보통 snake_case를 사용합니다.
- 예를 들어, 파일 이름이 my_publisher.hpp와 같이 작성됩니다.
- 실제 코드 (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 |