另外创建一个msg功能包的原因是在同一个功能包下msg会无法调用,出现error:The package “lys_pkg” must not “build_depend” on a package with the same name as this package,即不能有相同名字的包,所以要另外创建一个名为"test_msgs"的功能包,再在lys_pkg功能包里调用
一、创建工作空间
创建文件夹
mkdir -p ~/lys_ws/src
cd ~/lys_ws
colcon build
二、创建功能包
1、创建功能包
cd ~/lys_ws/src
ros2 pkg create --build-type ament_cmake test_msgs
2、复制文件
msg
3、修改文件
注意事项:
xxx.msg:文件名要以大写字母 开头且不能有下划线和数字;
float32 t:变量定义为小写字母,不能用大写字母
msg文件中不应有=的赋值操作
Motormsg.msg
int8 id
int8 mode
float32 t
float32 w
float32 pos
float32 p
float32 d
MotorBackmsg.msg
int8 id
float32 t
float32 w
float32 pos
IMU.msg
float32 roll
float32 pitch
float32 yaw
CMakeLists.txt
*注意自己的文件路径
cd ~/lys_ws/src/test_msgs
sudo gedit CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(test_msgs)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)
set(msg_files
"msg/IMU.msg"
"msg/Motormsg.msg"
"msg/MotorBackmsg.msg"
)
rosidl_generate_interfaces(${PROJECT_NAME} ${msg_files} DEPENDENCIES builtin_interfaces geometry_msgs std_msgs ADD_LINTER_TESTS)
ament_export_dependencies(rosidl_default_generators)
ament_export_dependencies(rosidl_default_runtime)
ament_export_include_directories(include)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>test_msgs</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="hahalim@todo.todo">hahalim</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
三、 编译和运行
cd ~/lys_ws
colcon build --packages-select test_msg
source install/setup.bash
查看消息类型
ros2 interface show test_msgs/msg/Motormsg
ros2 interface show test_msgs/msg/MotorBackmsg
ros2 interface show test_msgs/msg/IMU
附:C++调用msg方法
在CMakeLists.txt里面添加
find_package(test_msgs REQUIRED) # test_msgs根据你的功能包名称修改
ament_target_dependencies(${PROJECT_NAME}_node std_msgs rclcpp test_msgs) # test_msgs根据你的功能包名称修改
在package.xml里面添加
<depend>test_msgs</depend> # test_msgs根据你的功能包名称修改
在源文件中包含
特别注意,这里的格式,消息文件是驼峰风格的命名方式,也就是通过大写分割单词,但 是包含的时候要用下划线风格,全部是小写
#include "test_msgs/msg/test_msg.hpp"
使用的时候
publisher = this->create_publisher<test_msgs:msg::Motormsg>("pub", 10); //“pub”是发布者发布的话题