ROS自定义消息&在其他包调用

自定义消息

在消息功能包下创建msg文件夹,再创建.msg文件,并写入自定义类型;

修改Cmakeist.txt:

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  rospy
  sensor_msgs
  std_msgs
  tf
  nav_msgs
  open_karto
  slam_karto_ceres
)
add_message_files(FILES
  Gposes.msg
)
generate_messages(DEPENDENCIES
  std_msgs
  nav_msgs
)


catkin_package(
 INCLUDE_DIRS include
 #LIBRARIES six_f #这里注释掉,解决下面的错误
 CATKIN_DEPENDS roscpp rospy sensor_msgs std_msgs tf message_runtime
 DEPENDS system_lib
)

修改package.xml:

  <build_depend>message_generation</build_depend>
  <build_export_depend>message_generation</build_export_depend>
  <build_depend>nav_msgs</build_depend>
  <exec_depend>nav_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>
  <exec_depend>message_generation</exec_depend>

注意,nav_msgs那里应该也需要添加上std_msgs

参考:

https://blog.csdn.net/u013453604/article/details/72903398

如下错误解决办法:

错误1:Project ‘xxx’ tried to find library ‘A_package’. The library is neither a target nor built/installed properly. Did you compile project ‘A_package’? Did you find_package() it before the subdirectory containing its code is included?

修改:A_package的CMakeList.txt文件:
catkin_package(
INCLUDE_DIRS include
#LIBRARIES A_package (这里要注释掉)
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
DEPENDS system_lib )

原因分析:

A包输出了并不存在的库(LIBRARIES A),导致B包find_package()在寻找A库的时候无法找到。

当去掉LIBRARIES A的时候,find_package()将不会寻找LIBRARIES A,因此CMAKE配置通过。

其他包调用:

package.xml:
 

<build_depend>six_f</build_depend>

<build_export_depend>six_f</build_export_depend>

<exec_depend>six_f</exec_depend>
six_f:是自己的消息功能包

如需要:
还可以添加上,自定义消息里面依赖的基础消息,如six_f,换成nav_msgs

在需要调用消息的功能包下,CmakeList.txt添加自定义的pkg在find_package

并添加:

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
${PROJECT_NAME}_node改为自己的可执行文件

最后,通过#include“”........即可。

查看自己定义的消息,可以使用如下命令:

rosmsg show ....

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 ROS 自定义消息并以容器形式发送消息,需要进行以下步骤: 1. 创建自定义消息文件:打开终端,进入 ROS 工作空间的 src 目录,执行 `catkin_create_pkg` 命令创建一个新的,例如: ``` cd ~/catkin_ws/src catkin_create_pkg my_msgs std_msgs ``` 这将在 src 目录下创建一个名为 my_msgs 的,其含一个依赖项 std_msgs。然后,在 my_msgs 创建一个名为 MyMsg.msg 的消息文件,例如: ``` cd my_msgs touch msg/MyMsg.msg ``` 在 MyMsg.msg 文件定义自定义消息的结构,例如: ``` int32 id string name float32[] data ``` 其 data 是一个浮点数数组,用于存储一组数据。 2. 编译消息文件:在终端执行 `catkin_make` 命令来编译自定义消息文件: ``` cd ~/catkin_ws catkin_make ``` 3. 发布自定义消息:在发布自定义消息的节点,可以通过以下方式创建并填充自定义消息,然后以容器形式发送: ``` #include "ros/ros.h" #include "my_msgs/MyMsg.h" int main(int argc, char **argv) { ros::init(argc, argv, "my_publisher"); ros::NodeHandle nh; // 创建一个名为 my_msg 的自定义消息对象 my_msgs::MyMsg my_msg; // 填充自定义消息对象的字段 my_msg.id = 1; my_msg.name = "my_message"; my_msg.data.push_back(1.0); my_msg.data.push_back(2.0); my_msg.data.push_back(3.0); // 创建一个名为 my_topic 的话题发布者,并发布自定义消息 ros::Publisher pub = nh.advertise<my_msgs::MyMsg>("my_topic", 10); pub.publish(my_msg); return 0; } ``` 在这个示例,我们创建了一个名为 my_msg 的自定义消息对象,并填充了它的字段。然后,创建了一个名为 my_topic 的话题发布者,并以容器形式发布了自定义消息 my_msg。 4. 订阅自定义消息:在订阅自定义消息的节点,可以通过以下方式订阅自定义消息,并以容器形式接收和处理消息: ``` #include "ros/ros.h" #include "my_msgs/MyMsg.h" void myCallback(const my_msgs::MyMsg::ConstPtr& msg) { ROS_INFO("Received message with id = %d, name = %s, and data = [%f, %f, %f]", msg->id, msg->name.c_str(), msg->data[0], msg->data[1], msg->data[2]); } int main(int argc, char **argv) { ros::init(argc, argv, "my_subscriber"); ros::NodeHandle nh; // 创建一个名为 my_topic 的话题订阅者,并注册回调函数 myCallback ros::Subscriber sub = nh.subscribe<my_msgs::MyMsg>("my_topic", 10, myCallback); ros::spin(); return 0; } ``` 在这个示例,我们创建了一个名为 my_topic 的话题订阅者,并注册了一个回调函数 myCallback。当订阅者收到自定义消息时,回调函数将被调用,并以容器形式接收和处理消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值