Matlab使用ROS Toolbox编译MAVROS2消息报错缺少geographic_msgs消息的解决方法
- 问题描述
- 解决方法
环境:
MATLAB : R2022b
ROS Toolbox : 1.6
Windows :Windows 10 22H2
ROS :ROS2 Foxy
问题描述
在使用Matlab的ROS Toolbox工具箱编译与PX4联合调试的代码,Matlab官方给出的示例是使用ROS2配合microRTPS连接无人机,并发送控制命令来导航模拟无人机。
Control a Simulated UAV Using ROS 2 and PX4 Bridge
但是实际中使用更多的是MAVROS2连接的方法,所以这里选择了编译MAVROS2消息来实现与Matlab的联合调试。
MAVROS2
在官网下载MAVROS2的源码,使用Matlab中的ros2genmsg命令生成ROS2消息。
Generate custom messages from ROS 2 definitions
新建一个PX4-ROS2-Simulink文件夹用来存储工程文件(名字可以任取),在其下新建custom文件夹、others文件夹。
将下载的MAVROS2包的Zip压缩包放在PX4-ROS2-Simulink/others文件夹下。
解压,将其中的mavros_msgs文件夹放在PX4-ROS2-Simulink/custom文件夹下。
最后的结构为下列所示。
PX4-ROS2-Simulink
├─custom
| └─mavros_msgs
| ├─include
| ├─msg
| ├─srv
| ├─CHANGELOG.rst
| ├─CMakeLists.txt
| ├─mavros_msgs_mapping_rule.yaml
| └─package.xml
└─others
└─mavros-ros2.zip
用Matlab打开PX4-ROS2-Simulink文件夹,在Matlab命令行中输入以下命令。
folderPath = fullfile(pwd,"custom");
ros2genmsg(folderPath);
编译过程中报错如下:
>> ros2genmsg(folderPath);
Identifying message files in folder 'F:/PX4-ROS2-Simulink/custom'..Done.
Validating message files in folder 'F:/PX4-ROS2-Simulink/custom'..Done.
[0/1] Generating MATLAB interfaces for custom message packages... 0%错误使用 ros.internal.utilities.locateMessage
Specified message package geographic_msgs does not exist. Check the message package specified.
出错 ros.internal.MessageParser/getMessageDefinitionHelper (第 143 行)
filePath = ros.internal.utilities.locateMessage(...
出错 ros.internal.MessageParser/nestedMessageParser (第 662 行)
dataStructure = getMessageDefinitionHelper(obj, CirDependList);
出错 ros.internal.MessageParser/getDataStructure (第 356 行)
nestedMessageParser(obj,dataType,CirDependList);
出错 ros.internal.MessageParser/getMessageDefinitionHelper (第 160 行)
messageDefinition = getDataStructure(obj,filePath,contentsOfFile,...
出错 ros.internal.MessageParser/getMessageDefinition (第 135 行)
messageDefinition = getMessageDefinitionHelper(obj,CirDependList);
出错 ros.internal.pubsubEmitter (第 47 行)
msgDefn = getMessageDefinition(parser);
出错 ros2genmsg (第 233 行)
[genFiles, dependencies] = ros.internal.pubsubEmitter(msgFullName{end}, ...
原因是Matlab的内置ROS2中缺少geographic_msgs这个消息包。
Matlab安装路径的D:\MATLAB\R2022b\sys\ros2\win64\ros2\share文件夹中没有geographic_msgs这个消息包。
但是在Matlab的帮助文档中,Supported Messages栏目中是有列出这个消息的。
Built-In Message Support
这可能是一个BUG。
解决方法
解决方法就是下载geographic_msgs这个消息包,一起放到custom文件夹下进行编译。
打开官网链接进行下载,注意需要下载的是ROS2版本的。
ros-geographic-info/geographic_info
解压后将其中的geographic_msgs文件夹复制到custom文件夹下
将下载的geographic_msgs包的Zip压缩包放在PX4-ROS2-Simulink/others文件夹下。
解压,将其中的geographic_msgs文件夹放在PX4-ROS2-Simulink/custom文件夹下。
最后的结构为下列所示。
PX4-ROS2-Simulink
├─custom
| ├─geographic_msgs
| | ├─include
| | ├─msg
| | ├─srv
| | ├─test
| | ├─CHANGELOG.rst
| | ├─CMakeLists.txt
| | ├─geographic_msgs_mapping_rule.yaml
| | ├─mainpage.dox
| | └─package.xml
| └─mavros_msgs
| ├─include
| ├─msg
| ├─srv
| ├─CHANGELOG.rst
| ├─CMakeLists.txt
| ├─mavros_msgs_mapping_rule.yaml
| └─package.xml
└─others
└─mavros-ros2.zip
用Matlab打开PX4-ROS2-Simulink文件夹,再次编译即可。
folderPath = fullfile(pwd,"custom");
ros2genmsg(folderPath);
参考资料:
Generate custom messages from ROS 2 definitions
Built-In Message Support