【四足】第一篇:msg功能包创建

另外创建一个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
【四足】第一篇:msg功能包创建_第1张图片

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



<package format="3">
  <name>test_msgsname>
  <version>0.0.0version>
  <description>TODO: Package descriptiondescription>
  <maintainer email="[email protected]">hahalimmaintainer>
  <license>TODO: License declarationlicense>

  <buildtool_depend>ament_cmakebuildtool_depend>
<build_depend>rosidl_default_generatorsbuild_depend>

<exec_depend>rosidl_default_runtimeexec_depend>

<member_of_group>rosidl_interface_packagesmember_of_group>


  <test_depend>ament_lint_autotest_depend>
  <test_depend>ament_lint_commontest_depend>

  <export>
    <build_type>ament_cmakebuild_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”是发布者发布的话题

你可能感兴趣的:(四足,c++,开发语言)