首页 > 其他分享 >ros2,功能包下使用自定义的msg,msg文件在定义在当前文件下

ros2,功能包下使用自定义的msg,msg文件在定义在当前文件下

时间:2024-07-15 15:57:32浏览次数:16  
标签:文件 target 自定义 typesupport cpp ament msg rosidl

1.创建功能包,参考ros官方方式Writing a simple publisher and subscriber (C++) — ROS 2 Documentation: Humble documentation

ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_pubsub

2.创建msg

在cpp_pubsub功能包下创建msg文件夹  ros2_ws/cpp_pubsub/msg

mkdir msg

在msg文件夹下创建.msg文件   ros2_ws/cpp_pubsub/msg/Demo.msg

touch Demo.msg 

Demo.msg定义如下

int64 num
std_msgs/String str

3.修改cpp_pubsub功能包下的package.xml文件

xml文件内添加 
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

4.CmakeLists.txt添加

find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Demo.msg"
  DEPENDENCIES std_msgs
)
#导出运行时依赖 
ament_export_dependencies(rosidl_default_runtime)
 

5.修改功能CmakeLists.txt 要编译的 talker listener node节点的依赖

add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp)


add_executable(listener src/subscriber_member_function.cpp)
ament_target_dependencies(listener rclcpp)
  
install(TARGETS
  talker
  listener
  DESTINATION lib/${PROJECT_NAME})

rosidl_get_typesupport_target(cpp_typesupport_target
  ${PROJECT_NAME} rosidl_typesupport_cpp)
 
target_link_libraries(talker "${cpp_typesupport_target}")
target_link_libraries(listener "${cpp_typesupport_target}")
 
ament_export_dependencies(rosidl_default_runtime)

6.完整的package.xml和CmakeLists.txt如下

#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>cpp_pubsub</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="">nvidia</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <depend>rclcpp</depend> <depend>std_msgs</depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <buildtool_depend>rosidl_default_generators</buildtool_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group> <export> <build_type>ament_cmake</build_type> </export> </package>
#CMakeLists.txt文件
cmake_minimum_required(VERSION 3.8) project(cpp_pubsub) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/Num.msg" DEPENDENCIES std_msgs ) add_executable(talker src/publisher_member_function.cpp) ament_target_dependencies(talker rclcpp) add_executable(listener src/subscriber_member_function.cpp) ament_target_dependencies(listener rclcpp) install(TARGETS talker listener DESTINATION lib/${PROJECT_NAME}) rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} rosidl_typesupport_cpp) target_link_libraries(talker "${cpp_typesupport_target}") target_link_libraries(listener "${cpp_typesupport_target}") ament_export_dependencies(rosidl_default_runtime) ament_package()

7.publisher_member_function.cpp文件代码修改

void timer_callback()
  {
    auto message = cpp_pubsub::msg::Num();
    message.num = (int64_t)count_++;
    message.str.data = "Hello, world!";
    RCLCPP_INFO(this->get_logger(), "Publishing: %s %ld", message.str.data.c_str(), message.num);
    publisher_->publish(message);
  }

8.subscriber_member_function.cpp文件修改

void topic_callback(const cpp_pubsub::msg::Num & msg) const
  {
    RCLCPP_INFO(this->get_logger(), "I heard: %s %ld", msg.str.data.c_str(), msg.num);
  }

 

标签:文件,target,自定义,typesupport,cpp,ament,msg,rosidl
From: https://www.cnblogs.com/duzw/p/18303331

相关文章

  • 全志科技官方Ubuntu16.04根文件系统镜像的替换和测试方法
    本文主要基于全志A40i开发板——TLA40i-EVM,一款基于全志科技A40i处理器设计的4核ARMCortex-A7高性能低功耗国产评估板,演示Ubuntu根文件系统镜像的替换和测试方法。创龙科技TLA40i-EVM评估板接口资源丰富,引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI......
  • 开发板测试手册——系统启动、文件传送操作步骤详解(1)
    前言本文适用开发环境:Windows开发环境:Windows764bit、Windows1064bitLinux开发环境:Ubuntu14.04.364bit虚拟机:VMware15.1.0U-Boot:U-Boot-2017.01Kernel:Linux-4.9.0、Linux-RT-4.9.0进行本文档操作前,请先按照调试工具安装、Linux开发环境搭建相关文档,安装......
  • 微服务项目配置文件参数安全方案
    项目环境springboot系列项目maven依赖管理任意配置中心(apollo/配置文件/k8sConfigMapSecrets)项目代码添加依赖<dependency>    <groupId>com.github.ulisesbocchio</groupId>    <artifactId>jasypt-spring-boot-starter</artifactId>    <version>${ver......
  • JVM类文件结构
    .java源文件packagetest.JVM;publicclassTest{publicstaticvoidmain(String[]args){System.out.println("haha");}}十六进制查看.class文件魔数第一行中有一串特殊的字符CAFEBABE,它就是一个魔数,是JVM识别class文件的标志,JVM会在......
  • 精准搜索:本地文件检索工具的高效策略
    背景背景1:在日常的工作中,本地磁盘随着工作时间的变长,新建的目录会越来越多存放的文件也越来越多;每次想要找一个文件,确实要浪费一点时间,本着让时间更高效的原则,想着如果借助程序去检索那是不是更快些,于是有了下边的实践。背景2:保险的销售人员也就是业务老师,由于资料过多,找起来确......
  • C文件操作
    1.为什么使用文件我们前面学习结构体时,写通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。我们在想既然......
  • css自定义滚动条
    /*定义滚动条高宽及背景高宽分别对应横竖滚动条的尺寸*/::-webkit-scrollbar{width:6px;height:6px;background-color:#F5F5F5;}/*定义滚动条轨道内阴影+圆角*/::-webkit-scrollbar-track{-webkit-box-shadow:inset006pxrgba(0,0,......
  • 在 package.json 文件中,版本号前的 ^ 符号含义
    在package.json文件中,版本号前的^符号表示兼容某个主版本(majorversion)的更新。具体来说,^符号允许自动安装具有相同主版本号的更新版本,但不包括主版本号变更的版本。例如:***"^1.2.3"允许的版本范围是>=1.2.3<2.0.0。这意味着会自动安装1.2.4、1.3.0等版本,但不会安装......
  • vue3+Element Plus 自定义表格单选 多选
    项目背景:用vue3+elementplus做一套考试系统功能场景:添加试题中分为客观题、主观题两种类型,在客观题会出现单选题、多选题两种类型就会导致单选题只能勾选一个答案、多选题能勾选多个答案。效果图废话不说直接上代码<el-buttonclass="btn"icon="Plus"plainst......
  • logging模块切割日志时:另一个程序正在使用此文件,进程无法访问。
    使用:  concurrent-log-handlerGITHUB:  https://github.com/Preston-Landers/concurrent-log-handler安装: pipinstallconcurrent-log-handlerimportloggingfromconcurrent_log_handlerimportConcurrentRotatingFileHandlerlogger=logging.getLogger(__name_......