メインコンテンツ

共有可能な ROS 2 カスタム メッセージ パッケージの作成

この例では、MATLAB® で共有可能な ROS 2 カスタム メッセージ パッケージを作成します。必要な msg ファイルが含まれる ROS 2 パッケージがなければなりません。この図では、適切なフォルダー構造の例を示します。

ROS 2 custom message folder structure

カスタム メッセージ パッケージ フォルダーを準備したら、親フォルダーへのパスを指定し、指定したパスで ros2genmsg を呼び出します。

Windows® マシンでカスタム メッセージを生成する場合、フォルダー パスが Windows の MAX_PATH 制限を超えるとビルドが失敗する可能性があります。ビルドの失敗を回避するには、次のオプションのいずれかを選択します。

  • より短いフォルダー パスを使用するか、長いパスを短いネットワーク ドライブにマッピングする。

  • 名前と値の引数 BuildRoot を使用して、次のように短い代替ビルド パスを指定する。

ros2genmsg(genDir, BuildRoot='C:/shortBuildPath')

この例では、パスがより短い別の場所にカスタム メッセージを生成する方法を示します。

カスタム メッセージ パッケージ フォルダーをローカル ディレクトリに作成します。

genDir = fullfile(pwd, 'ros2CustomMessages');
packagePath = fullfile(genDir, 'simple_msgs');
mkdir(packagePath)

カスタム メッセージ パッケージ フォルダー内に msg という名前のフォルダーを作成します。

mkdir(packagePath,'msg')

msg フォルダー内に .msg という名前のファイルを作成します。

messageDefinition = {'int64 num'}
messageDefinition = 1×1 cell array
    {'int64 num'}

fileID = fopen(fullfile(packagePath,'msg', ...
               'Num.msg'),'w');
fprintf(fileID,'%s\n',messageDefinition{:});
fclose(fileID);

ROS 2 IDL (.idl) ファイルから ROS 2 のカスタム メッセージ タイプ、カスタム サービス タイプ、およびカスタム アクション タイプを直接生成することもできます。

.idl ファイルから ROS 2 カスタム メッセージを作成するには、ディレクトリ内に .idl ファイル用の別のカスタム メッセージ パッケージ フォルダーを作成します。

folderPath = fullfile(pwd,"ros2CustomMessages");
packagePath = fullfile(folderPath,"simple_idl_msgs");
mkdir(packagePath)

カスタム メッセージ パッケージ フォルダー内にフォルダー msg を作成します。

mkdir(packagePath, "msg")

msg フォルダー内に .idl ファイルを作成します。

idlMsgDefinition = { 
'module simple_idl_msgs {'
 'module msg {'
    'struct SimpleMsg {'
        'uint8 uint8_type;'
        'string string_type;'
    '};'
 '};'
'};' 
}
idlMsgDefinition = 8×1 cell array
    "'module simple_idl_msgs {'"
    "'module msg {'"
    "'struct SimpleMsg {'"
    "'uint8 uint8_type;'"
    "'string string_type;'"
    "'};'"
    "'};'"
    "'};'"

fileID = fopen(fullfile(packagePath,'msg','SimpleMsg.idl'),'w');
fprintf(fileID,'%s\n',idlMsgDefinition{:});
fclose(fileID);

ここで、カスタム メッセージ パッケージ フォルダーのパスを simple_msgs に戻し、その中に srv という名前のフォルダーを作成します。

packagePath = fullfile(genDir, 'simple_msgs');
mkdir(packagePath,'srv')

srv フォルダー内に .srv という名前のファイルを作成します。

serviceDefinition = {'int64 a'
                     'int64 b'
                     '---'
                     'int64 sum'}
serviceDefinition = 4×1 cell array
    "'int64 a'"
    "'int64 b'"
    "'---'"
    "'int64 sum'"

 
fileID = fopen(fullfile(packagePath,'srv', ...
               'AddTwoInts.srv'),'w');
fprintf(fileID,'%s\n',serviceDefinition{:});
fclose(fileID);

カスタム メッセージ パッケージ フォルダー内に action という名前のフォルダーも作成します。

mkdir(packagePath,'action')

action フォルダー内に .action という名前のファイルを作成します。

actionDefinition = {'int64 goal'
                    '---'
                    'int64 result'
                    '---'
                    'int64 feedback'}
actionDefinition = 5×1 cell array
    "'int64 goal'"
    "'---'"
    "'int64 result'"
    "'---'"
    "'int64 feedback'"

 
fileID = fopen(fullfile(packagePath,'action', ...
               'Test.action'),'w');
fprintf(fileID,'%s\n',actionDefinition{:});
fclose(fileID);

.msg ファイル、.srv ファイル、および .action ファイル内の ROS 2 定義からカスタム メッセージを生成します。名前と値の引数 CreateShareableFile を使用して、生成したカスタム メッセージの共有可能な ZIP アーカイブを作成し、名前と値の引数 BuildRoot を使用して、短い代替ビルド パスを指定します。

この ZIP アーカイブを使用してカスタム メッセージを別のマシンに登録する方法の詳細については、ros2RegisterMessagesを参照してください。

ros2genmsg(genDir, CreateShareableFile=true, BuildRoot='C:/shortBuildPath');
Creating Python virtual environment for ros2.Done.
Adding required Python packages to virtual environment.Done.
Copying include folders.Done.
Copying libraries.Done.
Done.
[2/2] Generating MATLAB interfaces for custom message packages... Done.
Running colcon build in folder 'C:/shortBuildPath/matlab_msg_gen_R2026a/win64'.
Build in progress. This may take several minutes...
Build succeeded.build_log.Generating zip file in the folder 'C:/shortBuildPath'.Done.

Generated shareable ROS 2 custom message package folder

コマンド ウィンドウで「ros2 msg list」と入力して、新しいカスタム メッセージの作成を確認します。

ROS 2 custom messages creation

参考

|

トピック