ros中自定义msg消息并用其他功能包调用

注:本篇文章仅作为学习笔记,如有侵权,请联系删除。

目录

一、创建msg消息

1.在src目录创建自定义的msg功能包。

2.修改自定义msg功能包内的package.xml文件

3.修改自定义msg功能包内的CMakeLists.txt

4.编译自定义msg功能包

二、同一工作空间下调用不同功能包内的自定义msg消息文件

1.在B功能包中添加自定义msg的头文件

2.在B功能包中调用时借口

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

4.修改CMakeLists.txt文件


例如我们想要在功能包B去订阅功能包A中自定义msg消息:A.msg

一、创建msg消息

首先我们先创建自定义的话题消息A.msg。

1.在src目录创建自定义的msg功能包。

# 在src目录下打开终端,输入:
catkin_create_pkg 功能包名字 roscpp rospy std_msgs

# 在刚刚创建的功能包文件夹内创建一个msg文件目录,并在msg文件内创建要定义的.msg文件(A.msg)
#int8, int16, int32, int64 (或者无符号类型: uint*)
#float32, float64
#string
#time, duration
#other msg files
#variable-length array[] and fixed-length array[C]
#ROS中还有一种特殊类型:Header,标头包含时间戳和ROS中常用的坐标帧信息

2.修改自定义msg功能包内的package.xml文件

#添加编译依赖与执行依赖
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

3.修改自定义msg功能包内的CMakeLists.txt

# 1.在find_package中添加message_generation
find_package(catkin REQUIRED COMPONENTS
  ...
  message_generation
)

# 2.add_message_files中添加自定义的msg文件
add_message_files(
        #DIRECTORY msg
        FILES
        A.msg

)

# 3.生成消息时依赖于 std_msgs
generate_messages(
        DEPENDENCIES
        std_msgs
)

# 4.执行时依赖
catkin_package(
  CATKIN_DEPENDS std_msgs message_runtime
)

# 5.头文件目录
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

4.编译自定义msg功能包

catkin_make -DCATKIN_WHITELIST_PACKAGES=" 包名"

若指定编译多个功能包,中间用";"分开

catkin_make -DCATKIN_WHITELIST_PACKAGES="A;B",

使用rosmsg show "定义msg文件名",可以显示表示定义成功,编译成功后生成的msg头文件目录为(.../工作空间/devel/include/包名/xxx.h)或(.../工作空间/devel/lib/python/dist-packages/包名/msg)

二、同一工作空间下调用不同功能包内的自定义msg消息文件

1.在B功能包中添加自定义msg的头文件

//c++
#include<A/A.h>    //自建一个消息类型, 第一个A为自定义msg文件的功能包名字,第二个A为自定义msg文件的名字
#python
from A.msg import A        #第一个A为自定义msg文件的功能包名字,第二个A为自动的msg文件名字

2.在B功能包中调用时接口

//c++
//第一个A为自定义msg文件的功能包名字,第二个A为自定义msg文件名
A::A a;
const A::A::ConstPtr& a
#python
#A为自定义msg文件名字
a = A()

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

#添加有关A的依,其中A为功能包名子
 <build_depend>A</build_depend>
 
 <build_export_depend>A</build_export_depend>
 
 <exec_depend>A</exec_depend>

4.修改CMakeLists.txt文件

1.
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  A   # 添加被引用消息的功能包的名字
)

2.取消注释
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

  • 13
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 C++ 代码示例,用于实现地图路径碰撞检测接口的ROS功能: ```cpp #include <ros/ros.h> #include <geometry_msgs/PointStamped.h> #include <vector> using namespace std; // 定义点的结构体 struct Point { double x; double y; }; // 定义地图类 class Map { public: Map(vector<Point> &path) : path_(path) {} // 判断点是否在路径上,如果在返回 true,否则返回 false bool isCollision(Point &p) { for (int i = 0; i < path_.size() - 1; ++i) { if (isPointOnLine(path_[i], path_[i + 1], p)) { return true; } } return false; } private: vector<Point> path_; // 判断点是否在直线上 bool isPointOnLine(Point &p1, Point &p2, Point &p) { // 如果点的横坐标小于直线两个端点的横坐标的最小值或大于最大值,那么点一定不在直线上 if (p.x < min(p1.x, p2.x) || p.x > max(p1.x, p2.x)) { return false; } // 如果点的纵坐标小于直线两个端点的纵坐标的最小值或大于最大值,那么点一定不在直线上 if (p.y < min(p1.y, p2.y) || p.y > max(p1.y, p2.y)) { return false; } // 如果点不在直线两个端点的纵坐标之间,那么点一定不在直线上 if ((p.y - p1.y) * (p2.x - p1.x) != (p2.y - p1.y) * (p.x - p1.x)) { return false; } return true; } }; class MapCollisionDetector { public: MapCollisionDetector(ros::NodeHandle &nh) { // 初始化地图路径 vector<Point> path = {{1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}}; // 创建地图实例 map_ = Map(path); // 创建点订阅器 point_sub_ = nh.subscribe("point", 10, &MapCollisionDetector::pointCallback, this); // 创建结果发布器 result_pub_ = nh.advertise<geometry_msgs::PointStamped>("result", 10); } private: Map map_; ros::Subscriber point_sub_; ros::Publisher result_pub_; // 回调函数,处理接收到的点 void pointCallback(const geometry_msgs::PointStamped::ConstPtr &msg) { Point p = {msg->point.x, msg->point.y}; bool collision = map_.isCollision(p); // 创建结果消息并发布 geometry_msgs::PointStamped result_msg; result_msg.header.stamp = ros::Time::now(); result_msg.point.x = p.x; result_msg.point.y = p.y; result_msg.point.z = collision ? 1 : 0; result_pub_.publish(result_msg); } }; int main(int argc, char **argv) { ros::init(argc, argv, "map_collision_detector"); ros::NodeHandle nh; MapCollisionDetector detector(nh); ros::spin(); return 0; } ``` 该代码首先定义了一个点的结构体,然后定义了一个地图类,该类含一个路径向量,并且实现了一个`isCollision`方法,用于判断一个给定的点是否在路径上。接下来,该代码实现了一个`MapCollisionDetector`类,该类含一个地图实例、一个点订阅器和一个结果发布器。该类在构造函数初始化了地图实例、创建了点订阅器和结果发布器,并且将点订阅器的回调函数设置为`pointCallback`方法。回调函数将接收到的点转化为地图上的点,并调用`isCollision`方法判断该点是否在路径上,最后将结果发布到结果发布器上。最后,该代码在`main`函数初始化了ROS节点,并创建了一个`MapCollisionDetector`实例,然后进入ROS循环。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值