MATLAB에서 ROS 2 사용자 지정 메시지 생성하기
사용자 지정 메시지를 사용하여 현재 ROS 2에서 지원되는 메시지 유형 세트를 확장할 수 있습니다. 사용자 지정 메시지는 사용자가 정의하는 메시지입니다. 현재 지원되는 메시지 유형을 보내고 받고 있다면 사용자 지정 메시지를 사용할 필요가 없습니다. 지원되는 메시지 유형의 목록을 보려면 MATLAB® 명령 창에 ros2 msg list
를 입력합니다. 지원되는 ROS 2 메시지에 대한 자세한 내용은 Work with Basic ROS 2 Messages 항목을 참조하십시오.
ROS 2 사용자 지정 메시지를 처음 사용한다면 ROS Toolbox 시스템 요구 사항 항목을 참조하십시오.
ROS 2 사용자 지정 메시지는 이름이 msg
인 폴더가 포함된 ROS 2 패키지 폴더에 지정됩니다. msg
폴더에는 모든 사용자 지정 메시지 유형 정의가 포함됩니다. 예를 들어 custom
폴더의 example_b_msgs
패키지는 다음과 같은 폴더와 파일 구조를 갖습니다.
이 패키지는 사용자 지정 메시지 유형 Standalone.msg
를 포함합니다. MATLAB은 이러한 파일을 사용하여 패키지에 포함된 사용자 지정 메시지를 사용하기 위해 필요한 파일을 생성합니다.
이 예제에서는 MATLAB에서 ROS 2 사용자 지정 메시지를 만듭니다. 필수적인 msg
파일이 포함되어 있는 ROS 2 패키지가 있어야 합니다.
사용자 지정 메시지 패키지가 올바른지 확인한 다음에는 부모 폴더의 경로를 지정하고 지정된 경로로 ros2genmsg
를 호출합니다. 다음 예제에서는 종속성이 있는 세 개의 메시지 example_package_a,
, example_package_b
, example_package_c
를 제공했습니다. 이 예제에서는 여러 메시지가 포함된 폴더를 사용하여 이들을 동시에 생성할 수 있음을 보여줍니다.
새 MATLAB 세션을 열고 로컬 폴더에 사용자 지정 메시지 폴더를 만듭니다.
folderPath = fullfile(pwd,"custom"); copyfile("example_*_msgs",folderPath);
사용자 지정 메시지 파일의 폴더 경로를 지정하고 ros2genmsg
를 사용하여 사용자 지정 메시지를 만듭니다.
ros2genmsg(folderPath)
Identifying message files in folder 'C:/Work/custom'.Done. Removing previous version of Python virtual environment.Done. Creating a Python virtual environment.Done. Adding required Python packages to virtual environment.Done. Copying include folders.Done. Copying libraries.Done. Validating message files in folder 'C:/Work/custom'.Done. [3/3] Generating MATLAB interfaces for custom message packages... Done. Running colcon build in folder 'C:/Work/custom/matlab_msg_gen/win64'. Build in progress. This may take several minutes... Build succeeded.build log
ros2 msg list
를 호출하여 새 사용자 지정 메시지가 생성되었는지 확인합니다.
ros2 msg list
action_msgs/CancelGoalRequest action_msgs/CancelGoalResponse action_msgs/GoalInfo action_msgs/GoalStatus action_msgs/GoalStatusArray actionlib_msgs/GoalID actionlib_msgs/GoalStatus actionlib_msgs/GoalStatusArray builtin_interfaces/Duration builtin_interfaces/Time composition_interfaces/ListNodesRequest composition_interfaces/ListNodesResponse composition_interfaces/LoadNodeRequest composition_interfaces/LoadNodeResponse composition_interfaces/UnloadNodeRequest composition_interfaces/UnloadNodeResponse diagnostic_msgs/AddDiagnosticsRequest diagnostic_msgs/AddDiagnosticsResponse diagnostic_msgs/DiagnosticArray diagnostic_msgs/DiagnosticStatus diagnostic_msgs/KeyValue diagnostic_msgs/SelfTestRequest diagnostic_msgs/SelfTestResponse example_a_msgs/DependsOnB example_b_msgs/Standalone example_c_msgs/DependsOnB example_interfaces/AddTwoIntsRequest example_interfaces/AddTwoIntsResponse example_interfaces/Bool example_interfaces/Byte example_interfaces/ByteMultiArray example_interfaces/Char example_interfaces/Empty example_interfaces/Float32 example_interfaces/Float32MultiArray example_interfaces/Float64 example_interfaces/Float64MultiArray example_interfaces/Int16 example_interfaces/Int16MultiArray example_interfaces/Int32 example_interfaces/Int32MultiArray example_interfaces/Int64 example_interfaces/Int64MultiArray example_interfaces/Int8 example_interfaces/Int8MultiArray example_interfaces/MultiArrayDimension example_interfaces/MultiArrayLayout example_interfaces/SetBoolRequest example_interfaces/SetBoolResponse example_interfaces/String example_interfaces/TriggerRequest example_interfaces/TriggerResponse example_interfaces/UInt16 example_interfaces/UInt16MultiArray example_interfaces/UInt32 example_interfaces/UInt32MultiArray example_interfaces/UInt64 example_interfaces/UInt64MultiArray example_interfaces/UInt8 example_interfaces/UInt8MultiArray example_interfaces/WString geometry_msgs/Accel geometry_msgs/AccelStamped geometry_msgs/AccelWithCovariance geometry_msgs/AccelWithCovarianceStamped geometry_msgs/Inertia geometry_msgs/InertiaStamped geometry_msgs/Point geometry_msgs/Point32 geometry_msgs/PointStamped geometry_msgs/Polygon geometry_msgs/PolygonStamped geometry_msgs/Pose geometry_msgs/Pose2D geometry_msgs/PoseArray geometry_msgs/PoseStamped geometry_msgs/PoseWithCovariance geometry_msgs/PoseWithCovarianceStamped geometry_msgs/Quaternion geometry_msgs/QuaternionStamped geometry_msgs/Transform geometry_msgs/TransformStamped geometry_msgs/Twist geometry_msgs/TwistStamped geometry_msgs/TwistWithCovariance geometry_msgs/TwistWithCovarianceStamped geometry_msgs/Vector3 geometry_msgs/Vector3Stamped geometry_msgs/Wrench geometry_msgs/WrenchStamped lifecycle_msgs/ChangeStateRequest lifecycle_msgs/ChangeStateResponse lifecycle_msgs/GetAvailableStatesRequest lifecycle_msgs/GetAvailableStatesResponse lifecycle_msgs/GetAvailableTransitionsRequest lifecycle_msgs/GetAvailableTransitionsResponse lifecycle_msgs/GetStateRequest lifecycle_msgs/GetStateResponse lifecycle_msgs/State lifecycle_msgs/Transition lifecycle_msgs/TransitionDescription lifecycle_msgs/TransitionEvent logging_demo/ConfigLoggerRequest logging_demo/ConfigLoggerResponse map_msgs/GetMapROIRequest map_msgs/GetMapROIResponse map_msgs/GetPointMapROIRequest map_msgs/GetPointMapROIResponse map_msgs/GetPointMapRequest map_msgs/GetPointMapResponse map_msgs/OccupancyGridUpdate map_msgs/PointCloud2Update map_msgs/ProjectedMap map_msgs/ProjectedMapInfo map_msgs/ProjectedMapsInfoRequest map_msgs/ProjectedMapsInfoResponse map_msgs/SaveMapRequest map_msgs/SaveMapResponse map_msgs/SetMapProjectionsRequest map_msgs/SetMapProjectionsResponse nav_msgs/GetMapRequest nav_msgs/GetMapResponse nav_msgs/GetPlanRequest nav_msgs/GetPlanResponse nav_msgs/GridCells nav_msgs/MapMetaData nav_msgs/OccupancyGrid nav_msgs/Odometry nav_msgs/Path nav_msgs/SetMapRequest nav_msgs/SetMapResponse pendulum_msgs/JointCommand pendulum_msgs/JointState pendulum_msgs/RttestResults rcl_interfaces/DescribeParametersRequest rcl_interfaces/DescribeParametersResponse rcl_interfaces/FloatingPointRange rcl_interfaces/GetParameterTypesRequest rcl_interfaces/GetParameterTypesResponse rcl_interfaces/GetParametersRequest rcl_interfaces/GetParametersResponse rcl_interfaces/IntegerRange rcl_interfaces/ListParametersRequest rcl_interfaces/ListParametersResponse rcl_interfaces/ListParametersResult rcl_interfaces/Log rcl_interfaces/Parameter rcl_interfaces/ParameterDescriptor rcl_interfaces/ParameterEvent rcl_interfaces/ParameterEventDescriptors rcl_interfaces/ParameterType rcl_interfaces/ParameterValue rcl_interfaces/SetParametersAtomicallyRequest rcl_interfaces/SetParametersAtomicallyResponse rcl_interfaces/SetParametersRequest rcl_interfaces/SetParametersResponse rcl_interfaces/SetParametersResult rosgraph_msgs/Clock sensor_msgs/BatteryState sensor_msgs/CameraInfo sensor_msgs/ChannelFloat32 sensor_msgs/CompressedImage sensor_msgs/FluidPressure sensor_msgs/Illuminance sensor_msgs/Image sensor_msgs/Imu sensor_msgs/JointState sensor_msgs/Joy sensor_msgs/JoyFeedback sensor_msgs/JoyFeedbackArray sensor_msgs/LaserEcho sensor_msgs/LaserScan sensor_msgs/MagneticField sensor_msgs/MultiDOFJointState sensor_msgs/MultiEchoLaserScan sensor_msgs/NavSatFix sensor_msgs/NavSatStatus sensor_msgs/PointCloud sensor_msgs/PointCloud2 sensor_msgs/PointField sensor_msgs/Range sensor_msgs/RegionOfInterest sensor_msgs/RelativeHumidity sensor_msgs/SetCameraInfoRequest sensor_msgs/SetCameraInfoResponse sensor_msgs/Temperature sensor_msgs/TimeReference shape_msgs/Mesh shape_msgs/MeshTriangle shape_msgs/Plane shape_msgs/SolidPrimitive simple_msgs/AddTwoIntsRequest simple_msgs/AddTwoIntsResponse simple_msgs/Num statistics_msgs/MetricsMessage statistics_msgs/StatisticDataPoint statistics_msgs/StatisticDataType std_msgs/Bool std_msgs/Byte std_msgs/ByteMultiArray std_msgs/Char std_msgs/ColorRGBA std_msgs/Empty std_msgs/Float32 std_msgs/Float32MultiArray std_msgs/Float64 std_msgs/Float64MultiArray std_msgs/Header std_msgs/Int16 std_msgs/Int16MultiArray std_msgs/Int32 std_msgs/Int32MultiArray std_msgs/Int64 std_msgs/Int64MultiArray std_msgs/Int8 std_msgs/Int8MultiArray std_msgs/MultiArrayDimension std_msgs/MultiArrayLayout std_msgs/String std_msgs/UInt16 std_msgs/UInt16MultiArray std_msgs/UInt32 std_msgs/UInt32MultiArray std_msgs/UInt64 std_msgs/UInt64MultiArray std_msgs/UInt8 std_msgs/UInt8MultiArray std_srvs/EmptyRequest std_srvs/EmptyResponse std_srvs/SetBoolRequest std_srvs/SetBoolResponse std_srvs/TriggerRequest std_srvs/TriggerResponse stereo_msgs/DisparityImage test_msgs/Arrays test_msgs/ArraysRequest test_msgs/ArraysResponse test_msgs/BasicTypes test_msgs/BasicTypesRequest test_msgs/BasicTypesResponse test_msgs/BoundedSequences test_msgs/Builtins test_msgs/Constants test_msgs/Defaults test_msgs/Empty test_msgs/EmptyRequest test_msgs/EmptyResponse test_msgs/MultiNested test_msgs/Nested test_msgs/Strings test_msgs/UnboundedSequences test_msgs/WStrings trajectory_msgs/JointTrajectory trajectory_msgs/JointTrajectoryPoint trajectory_msgs/MultiDOFJointTrajectory trajectory_msgs/MultiDOFJointTrajectoryPoint unique_identifier_msgs/UUID visualization_msgs/GetInteractiveMarkersRequest visualization_msgs/GetInteractiveMarkersResponse visualization_msgs/ImageMarker visualization_msgs/InteractiveMarker visualization_msgs/InteractiveMarkerControl visualization_msgs/InteractiveMarkerFeedback visualization_msgs/InteractiveMarkerInit visualization_msgs/InteractiveMarkerPose visualization_msgs/InteractiveMarkerUpdate visualization_msgs/Marker visualization_msgs/MarkerArray visualization_msgs/MenuEntry
이제 위에서 만든 사용자 지정 메시지를 표준 메시지로 사용할 수 있습니다. 메시지를 주고받는 것에 대한 자세한 내용은 ROS 2 Publisher 및 ROS 2 Subscriber를 사용해 데이터 교환하기 항목을 참조하십시오.
example_b_msgs/Standalone
메시지를 사용할 publisher를 생성합니다.
node = ros2node("/node_1"); pub = ros2publisher(node,"/example_topic","example_b_msgs/Standalone");
동일한 토픽에 대한 subscriber를 생성합니다.
sub = ros2subscriber(node,"/example_topic");
메시지를 만들고 만든 메시지를 보냅니다.
custom_msg = ros2message("example_b_msgs/Standalone"); custom_msg.int_property = uint32(12); custom_msg.string_property='This is ROS 2 custom message example'; send(pub,custom_msg); pause(3) % Allow a few seconds for the message to arrive
LatestMessage
필드를 사용하여 subscriber가 받은 최근 메시지를 확인합니다.
sub.LatestMessage
ans = struct with fields:
MessageType: 'example_b_msgs/Standalone'
int_property: 12
string_property: 'This is ROS 2 custom message example'
생성된 ROS 객체를 제거합니다.
clear node pub sub
내장 메시지의 정의를 사용자 지정 정의로 바꾸기
MATLAB에는 많은 ROS 2 메시지 유형이 내장되어 있습니다. 위에서 자세히 설명한 사용자 지정 메시지 생성 워크플로를 사용하여 이러한 메시지 유형의 정의를 새 정의로 바꿀 수 있습니다. 내장된 메시지 패키지의 정의를 바꿀 때는 해당 내장 메시지 패키지의 모든 메시지 유형에 대한 새 정의(.msg
파일)가 사용자 지정 메시지 패키지 폴더에 포함되어 있는지 확인해야 합니다.