์ปค์คํ
interfaces ๊ตฌํํ๊ธฐ
๊ฐ์
์ค์ต
package ์์ฑํ๊ธฐ
msg ํ์ผ ์์ฑํ๊ธฐ
๋์ผ package์์ interface ์ฌ์ฉํ๊ธฐ
ํด๋ณด๊ธฐ
์ปค์คํ
interfaces๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ (๋ด package์์ ์ปค์คํ
interface๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๊ธฐ)
custom interfaces๋ฅผ ํน์ package๋ด์์ ๊ตฌํํ๋ ๊ฒ์ ์ถ์ฒํ์ง๋ง
ํ๋์ package๋ด์์ ์ ์ธ, ์์ฑ, ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋์ ํธ๋ฆฌํ ์ ์๋ค! (์ถ์ฒํ์ง๋ ์์)
more_interfaces package ์์ฑํ๊ณ ์ด package ๋ด๋ถ์ msg ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ธฐ
cd ~ /ros2_ws/src
ros2 pkg create --build-type ament_cmake more_interfaces
mkdir more_interfaces/msg
2-2 msg ํ์ผ ์์ฑํ๊ธฐ
more_interfaces/msg ๋ด๋ถ์ AddressBook.msg ํ์ผ ์์ฑํ๊ณ ์๋ ์ฝ๋ ๋ถ์ฌ๋ฃ๊ธฐ
uint8 PHONE_TYPE_HOME=0
uint8 PHONE_TYPE_WORK=1
uint8 PHONE_TYPE_MOBILE=2
string first_name
string last_name
string phone_number
uint8 phone_type
2-2-1 msg ํ์ผ ๋น๋ํ๊ธฐ
package.xml ์ด๊ณ ์๋ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
<buildtool_depend >rosidl_default_generators</buildtool_depend >
<exec_depend >rosidl_default_runtime</exec_depend >
<member_of_group >rosidl_interface_packages</member_of_group >
CMakeLists.txt ์ด๊ณ ์๋ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
find_package (rosidl_default_generators REQUIRED )
์์ฑํ messages์ ๋ชฉ๋ก์ ์ ์ธ (CMakeLists.txt)
set(msg_files
"msg/AddressBook.msg"
)
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
)
ament_export_dependencies(rosidl_default_runtime)
2-3 ๋์ผ package์์ interface ์ฌ์ฉํ๊ธฐ
more_interfaces/src/publish_address_book.cpp ํ์ผ ์์ฑํ๊ณ ์๋ ๋ด์ฉ ๋ณต์ฌํ๊ธฐ
#include < chrono>
#include < memory>
#include " rclcpp/rclcpp.hpp"
#include " more_interfaces/msg/address_book.hpp"
using namespace std ::chrono_literals;
class AddressBookPublisher : public rclcpp ::Node
{
public:
AddressBookPublisher ()
: Node(" address_book_publisher" )
{
address_book_publisher_ =
this ->create_publisher <more_interfaces::msg::AddressBook>(" address_book" , 10 );
auto publish_msg = [this ]() -> void {
auto message = more_interfaces::msg::AddressBook ();
message.first_name = " John" ;
message.last_name = " Doe" ;
message.phone_number = " 1234567890" ;
message.phone_type = message.PHONE_TYPE_MOBILE ;
std::cout << " Publishing Contact\n First:" << message.first_name <<
" Last:" << message.last_name << std::endl;
this ->address_book_publisher_ ->publish (message);
};
timer_ = this ->create_wall_timer (1s, publish_msg);
}
private:
rclcpp::Publisher<more_interfaces::msg::AddressBook>::SharedPtr address_book_publisher_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main (int argc, char * argv[])
{
rclcpp::init (argc, argv);
rclcpp::spin (std::make_shared<AddressBookPublisher>());
rclcpp::shutdown ();
return 0 ;
}
2-3-2 publisher ๋น๋ํ๊ธฐ
CMakeLists.txt ์์ (์๋ก์ด target ์์ฑ)
find_package (rclcpp REQUIRED )
add_executable (publish_address_book src/publish_address_book.cpp )
ament_target_dependencies (publish_address_book rclcpp )
install (TARGETS
publish_address_book
DESTINATION lib/${PROJECT_NAME} )
2-3-3 interface์ ๋ํ Link
CMakeLists.txt ์์ (๋์ผ package๋ด์์ ์์ฑ๋ message ์ฌ์ฉํ๊ธฐ ์ํด ์ถ๊ฐ)
rosidl_target_interfaces (publish_address_book
${PROJECT_NAME} "rosidl_typesupport_cpp" )
cd ~ /ros2_ws
colcon build --packages-up-to more_interfaces
source install/local_setup.bash
ros2 run more_interfaces publish_address_book
address_book topic์ผ๋ก publish๋๋ message ํ์ธํ๊ธฐ (echo ๋ช
๋ น ์ฌ์ฉ)
source install/setup.bash
ros2 topic echo /address_book