大良营销网站建设价位,丹阳网站建设机构,武邑网站建设代理,国外开源 企业网站在 ROS 通信协议中#xff0c;数据是以约定好的结构传输的#xff0c;即数据类型#xff0c;比如Topic使用的msg#xff0c;Service使用的srv#xff0c;ROS 中的 std_msgs 封装了一些原生的数据类型#xff0c;比如#xff1a;Bool、Char、Float32、Int64、String等数据是以约定好的结构传输的即数据类型比如Topic使用的msgService使用的srvROS 中的 std_msgs 封装了一些原生的数据类型比如Bool、Char、Float32、Int64、String等但这些类型结构简单常常不能满足我们的需要这时我们可以使用自定义的消息类型。
比如我们创建一个自定义消息定义一个机器人的ID位置x, y。
一、创建RobotPose.msg
我们仍然使用前文创建的 topic_hello_world 功能包结构如下 在src的同级目录创建 msg 目录在msg目录创建 RobotPose.msg 文件内容如下
string id
float64 x
float64 y
float64 angle二、配置编译文件
需要对 CMakeLists.txt 作以下修改
2.1 添加message_generation功能包
message_generation功能包在构建时根据msg和srv生成消息和服务的接口文件比如C头文件和Python包以便在 ROS 节点中使用。
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)注意这里需要同时在package.xml中添加以下内容
build_dependmessage_generation/build_depend2.2 添加msg文件
添加自定义msg该函数依赖message_generation功能包。
add_message_files(FILESRobotPose.msg
)2.3 配置依赖并生成接口文件
添加处理msg或srv所需要的依赖并生成接口文件该函数依赖message_generation功能包。
generate_messages(DEPENDENCIESstd_msgs
)2.4 添加message_runtime依赖
message_runtime 用于在运行时提供消息的序列化和反序列化支持。
这里注意有时可能会看到没有显式添加 message_runtime 也能正常运行这通常是因为其他依赖项例如roscpp 或 std_msgs可能已经隐含地包含了 message_runtime。在这种情况下构建系统已经处理了消息生成的任务。
然而为了确保你的软件包在所有情况下都能正常工作最好显示添加 message_runtime 作为你的软件包的依赖项。这样可以确保你的消息定义在构建和运行时得到正确处理。
需要对 CMakeLists.txt 作以下修改
catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)同时在package.xml中添加以下内容
exec_dependmessage_runtime/exec_depend节外生枝的小知识 catkin_package 是在ROS软件包的 CMakeLists.txt 文件中用于配置Catkin软件包的一条命令。它主要用于描述ROS软件包的元信息并在构建系统中定义软件包的依赖关系。以下是 catkin_package 的一般用途 软件包元信息配置 catkin_package 允许你指定软件包的元信息例如软件包的名称、版本、作者、描述等。这些信息将用于标识和描述你的ROS软件包。 cmakeCopy codecatkin_package(NAME your_package_nameVERSION 0.1.0DESCRIPTION Your package descriptionAUTHOR Your Name)设置软件包的依赖项 catkin_package 允许你指定你的软件包依赖于其他ROS软件包的哪些部分。这些依赖项将在构建和运行时被解析和满足。 cmakeCopy codecatkin_package(...CATKIN_DEPENDS roscpp std_msgs message_runtime)导出软件包的目标 通过 ${PROJECT_NAME}_EXPORTED_TARGETS 这样的参数你可以导出软件包的目标以便其他软件包能够正确地依赖你的软件包并包含所有必要的目标。 cmakeCopy codecatkin_package(...EXPORTED_TARGETS ${PROJECT_NAME}_EXPORTED_TARGETS)总体而言catkin_package 提供了一个中心化的地方用于指定ROS软件包的基本信息和配置以便构建系统和其他软件包能够正确地使用和依赖你的软件包。在ROS中它是配置软件包最重要的命令之一。 三、实现发布者与订阅者C版
3.1 源码
在创建的 topic_hello_world 包路径的 src 目录中创建 user_msg_pub.cpp 以实现发布者编辑内容如下
#include ros/ros.h
#include topic_hello_world/RobotPose.hint main(int argc, char **argv)
{ros::init(argc, argv, user_msg_pub);ros::NodeHandle nh;ros::Publisher pose_pub nh.advertisetopic_hello_world::RobotPose(/robot_pose, 10);topic_hello_world::RobotPose pose;pose.id vbot;pose.x 23.6;pose.y 12.8;pose.angle 90.0;while(ros::ok()){pose_pub.publish(pose);ROS_INFO(Pub robot: %s, pose(%lf, %lf, %lf), pose.id.c_str(), pose.x, pose.y, pose.angle);ros::Duration(1).sleep();ros::spinOnce();}return 0;
}创建 user_msg_sub.cpp 以实现订阅者编辑内容如下
#include ros/ros.h
#include topic_hello_world/RobotPose.hvoid robotPoseCallback(const topic_hello_world::RobotPose::ConstPtr pose)
{ROS_INFO(Sub robot: %s, pose(%lf, %lf, %lf), pose-id.c_str(), pose-x, pose-y, pose-angle);
}int main(int argc, char **argv)
{ros::init(argc, argv, user_msg_sub);ros::NodeHandle nh;ros::Subscriber pose_sub nh.subscribetopic_hello_world::RobotPose(/robot_pose, 10, robotPoseCallback);ros::spin();return 0;
}修改 CMakeLists.txt 只需添加如下内容
add_executable(${PROJECT_NAME}_user_msg_pub src/user_msg_pub.cpp)
add_executable(${PROJECT_NAME}_user_msg_sub src/user_msg_sub.cpp)target_link_libraries(${PROJECT_NAME}_user_msg_pub${catkin_LIBRARIES}
)target_link_libraries(${PROJECT_NAME}_user_msg_sub${catkin_LIBRARIES}
)3.2 编译运行
进入工作空间执行 catkin_make 命令编译工程你可能会遇到如下错误 这是因为上文提到的message_generation功能包在它编译自定义msg生成对应接口文件之前编译了c源文件但这时头文件RobotPose.h还没有生成所以报错了。
到这里你有没有发现如果各功能包间有依赖关系他们的编译是有先后顺序的那我们怎么控制这个先后顺序呢答案是不需要。哈哈CMake已经替我们做了我们只需告诉它哪个模块需要什么依赖CMake内部会自动分析项目中的依赖关系并根据这些依赖关系计算一个拓扑排序。然后CMake会按照这个顺序处理各个功能包以确保在构建过程中满足所有依赖关系。
我们可以在 CMakeLists.txt中使用 add_dependencies() 来添加这个依赖关系语法如下
add_dependencies(target_name dependency_target_name)其中target_name 是要添加依赖关系的目标名称dependency_target_name 是要添加的依赖目标名称。
例如如果你有一个名为 my_node 的目标你想要添加一个名为 my_dependency 的库作为其依赖项可以使用以下命令
add_dependencies(my_node my_dependency)所以为解决上述报错我们在 topic_hello_world/CMakeLists.txt中添加如下内容
# 注意他们要放在add_executable之后即先告诉CMake是哪个节点再告诉CMake它需要什么依赖
add_dependencies(${PROJECT_NAME}_user_msg_pub ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(${PROJECT_NAME}_user_msg_sub ${PROJECT_NAME}_generate_messages_cpp)其中第一项是我们生成的节点第二项 ${PROJECT_NAME}_generate_messages_cpp 是一个用于生成消息类型的C文件的宏它的作用是根据 .msg 和 .srv 文件生成对应的 .h 和 .cpp 文件。
3.3 节外生枝的小知识 在ROS软件包的构建过程中除了${PROJECT_NAME}_generate_messages_cpp还有一些其他与消息生成和编译相关的宏。这些宏通常都是与 Catkin 工具链和 ROS 构建系统的一部分。 以下是一些常见的与消息生成相关的宏 ${PROJECT_NAME}_generate_messages 这个宏表示生成所有与消息相关的任务。通常在调用 catkin_package(...) 时CATKIN_DEPENDS 部分会包含 ${PROJECT_NAME}_generate_messages以确保在构建软件包时执行消息生成任务。 catkin_package(CATKIN_DEPENDS roscpp std_msgs message_runtime${PROJECT_NAME}_generate_messages
)${PROJECT_NAME}_generate_messages_py 类似于 ${PROJECT_NAME}_generate_messages_cpp这个宏用于指定生成与消息相关的Python代码的路径。当你的ROS软件包包含使用Python编写的节点或服务时可能会用到这个宏。 ${PROJECT_NAME}_EXPORTED_TARGETS 这个宏用于导出所有与软件包相关的目标包括消息生成任务。通常在调用 catkin_package(...) 时EXPORTED_TARGETS 部分会包含 ${PROJECT_NAME}_EXPORTED_TARGETS以确保其他软件包能够正确地依赖你的软件包并包括所有必要的目标。 cmakeCopy codecatkin_package(...INCLUDE_DIRS includeLIBRARIES ${PROJECT_NAME}_libraryCATKIN_DEPENDS roscpp std_msgs message_runtimeDEPENDS system_libEXPORTED_TARGETS ${PROJECT_NAME}_EXPORTED_TARGETS
)请注意具体的宏可能会受到ROS版本、Catkin工具链版本和软件包的配置选项的影响。上述宏的名称中的 ${PROJECT_NAME} 部分会根据你的软件包的名称而变化。 3.4 编译成功后使用如下命令依次启动发布者和订阅者。
1. 启动ros master
roscore
2. 启动发布者
rosrun topic_hello_world topic_hello_world_user_msg_pub
3. 启动订阅者
rosrun topic_hello_world topic_hello_world_user_msg_sub结果如下 目前为止Topic Hello World 的自定义msg已经成功了。
四、实现发布者与订阅者Python版
4.1 源码
在 topic_hello_world 包路径下的 scripts 目录中创建 user_msg_pub.py 以实现发布者编辑内容如下
#! /usr/bin pythonimport rospy
from topic_hello_world.msg import RobotPosedef main():rospy.init_node(user_msg_pub)pub rospy.Publisher(/robot_pose, RobotPose, queue_size10)msg RobotPose()msg.id vbotmsg.x 52.1msg.y 12.6msg.angle 180.0while not rospy.is_shutdown():pub.publish(msg)rospy.loginfo(Pub robot: {}, pose({}, {}, {}).format(msg.id, msg.x, msg.y, msg.angle))rospy.sleep(1)if __name__ __main__:main()在scrips中创建 user_msg_sub.py 以实现订阅者编辑内容如下
#! /usr/bin pythonimport rospy
from topic_hello_world.msg import RobotPosedef robotPoseCallback(msg):rospy.loginfo(Sub robot: {}, pose({}, {}, {}).format(msg.id, msg.x, msg.y, msg.angle))def main():rospy.init_node(user_msg_sub)rospy.Subscriber(/robot_pose, RobotPose, robotPoseCallback, queue_size10)rospy.spin()if __name__ __main__:main()修改 CMakeLists.txt 只需添加如下内容
catkin_install_python(PROGRAMSscripts/user_msg_pub.pyscripts/user_msg_sub.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)4.2 编译运行
进入工作空间执行 catkin_make 命令编译工程编译成功后使用如下命令依次启动发布者和订阅者。
1. 启动ros master(如果已启动无需再启动)
roscore
2. 启动发布者
rosrun topic_hello_world user_msg_pub.py
3. 启动订阅者
rosrun topic_hello_world user_msg_sub.py结果如下
文章转载自: http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.tllws.cn.gov.cn.tllws.cn http://www.morning.wzknt.cn.gov.cn.wzknt.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.rfxw.cn.gov.cn.rfxw.cn http://www.morning.xuejitest.com.gov.cn.xuejitest.com http://www.morning.sjjq.cn.gov.cn.sjjq.cn http://www.morning.pmhln.cn.gov.cn.pmhln.cn http://www.morning.ckctj.cn.gov.cn.ckctj.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.ckwxs.cn.gov.cn.ckwxs.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.wrlqr.cn.gov.cn.wrlqr.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.lwdzt.cn.gov.cn.lwdzt.cn http://www.morning.wxckm.cn.gov.cn.wxckm.cn http://www.morning.gcfrt.cn.gov.cn.gcfrt.cn http://www.morning.rykw.cn.gov.cn.rykw.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.brkc.cn.gov.cn.brkc.cn http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn http://www.morning.nlrp.cn.gov.cn.nlrp.cn http://www.morning.rqjl.cn.gov.cn.rqjl.cn http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn http://www.morning.rqnzh.cn.gov.cn.rqnzh.cn http://www.morning.kzpy.cn.gov.cn.kzpy.cn http://www.morning.fkrzx.cn.gov.cn.fkrzx.cn http://www.morning.trsdm.cn.gov.cn.trsdm.cn http://www.morning.srbfz.cn.gov.cn.srbfz.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.slpcl.cn.gov.cn.slpcl.cn http://www.morning.gqfbl.cn.gov.cn.gqfbl.cn http://www.morning.cpktd.cn.gov.cn.cpktd.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.lrplh.cn.gov.cn.lrplh.cn http://www.morning.mzkn.cn.gov.cn.mzkn.cn http://www.morning.dqxnd.cn.gov.cn.dqxnd.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.mwrxz.cn.gov.cn.mwrxz.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.ksbmx.cn.gov.cn.ksbmx.cn http://www.morning.cpfbg.cn.gov.cn.cpfbg.cn http://www.morning.mmhyx.cn.gov.cn.mmhyx.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.xqwq.cn.gov.cn.xqwq.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.kwqt.cn.gov.cn.kwqt.cn http://www.morning.ghslr.cn.gov.cn.ghslr.cn http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.rynqh.cn.gov.cn.rynqh.cn http://www.morning.ywpwq.cn.gov.cn.ywpwq.cn http://www.morning.kjxgc.cn.gov.cn.kjxgc.cn http://www.morning.ykwbx.cn.gov.cn.ykwbx.cn http://www.morning.lpmdy.cn.gov.cn.lpmdy.cn http://www.morning.wjrtg.cn.gov.cn.wjrtg.cn http://www.morning.ctqbc.cn.gov.cn.ctqbc.cn http://www.morning.ppllj.cn.gov.cn.ppllj.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.c7512.cn.gov.cn.c7512.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn http://www.morning.jfcbs.cn.gov.cn.jfcbs.cn http://www.morning.fbccx.cn.gov.cn.fbccx.cn http://www.morning.xprq.cn.gov.cn.xprq.cn http://www.morning.sfphz.cn.gov.cn.sfphz.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.jhrqn.cn.gov.cn.jhrqn.cn