C++工程转ROS功能包


前言

因为项目需要把写好的C++工程改为在ROS下编译运行,网上相关博客很杂,便想记录一下我的修改过程。


一、新建catkin工作空间,复制源码

mkdir -p catkin_planner/src
cd catkin_planner/src

在它下面新建frenet_planner功能包

catkin_create_pkg frenet_planner roscpp

这步会自动生成CMakeLists.txt和package.xml文件,src文件夹和include文件夹
把原来C++工程中的src文件夹和include文件夹复制到frenet_planner目录下。
在这里插入图片描述

二、改CMakeLists.txt和package.xml

1.修改CMakeLists.txt

添加ROS的catkin包,链接 Eigen 库。

# 添加ROS的catkin包
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
)
# 添加代码需要的eigen3库
find_package(Eigen3 REQUIRED)

# 添加当前包所依赖的其他 Catkin 包
catkin_package(
   CATKIN_DEPENDS
        roscpp
		std_msgs
)

include_directories(
    include
    ${catkin_INCLUDE_DIRS}
    ${EIGEN3_INCLUDE_DIRS}
)

add_executable(threemode src/three_mode.cpp)
#添加依赖库
target_link_libraries(threemode ${catkin_LIBRARIES} ${EIGEN3_LIBRARIES})

2.修改package.xml文件

其他的都不用变,添加所依赖的ROS包即可。

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>eigen3</build_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>eigen3</exec_depend>

三、源码添加ROS头文件和创建ROS节点

1. 添加ROS头文件

#include <ros/ros.h>

2. 创建并运行ROS节点

int main(int argc, char** argv) {
    // Initialize ROS node
    ros::init(argc, argv, "threemode");

    // Your code here

    return 0;
}

回到工作目录下,重新编译。

cd catkin_planner
catkin_make

添加工作空间环境

source devel/setup.bash

用ROS命令启动程序
新建一个终端:

roscore

再建一个终端:

rosrun frenet_planner threemode

就能看到运行结果啦
至此,已经将一个C++程序改造为一个ROS程序!


参考:
https://blog.csdn.net/u011304078/article/details/102986429
https://www.jianshu.com/p/2bc50ff68bdc

总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何将C++程序改造为ROS程序运行,后续还要考虑在源码添加ROS话题发布数据,最终实现利用ROS进行上下游工程相互通信的功能。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在C++ ROS功能中暴露HTTP端口,可以使用ROS提供的`ros::ServiceServer`和`ros::ServiceClient`来实现。具体步骤如下: 1. 在ROS功能的`include`目录下创建一个新的头文件,例如`my_service.h`,并在其中定义一个新的ROS服务消息。例如: ``` #include <string> #include <ros/ros.h> // 自定义服务消息 #include <my_package/MyService.h> // 服务回调函数 bool serviceCallback(my_package::MyService::Request &req, my_package::MyService::Response &res) { // 在这里添加服务处理逻辑 res.output = "Hello " + req.input + "!"; return true; } ``` 2. 在`my_service.h`文件中定义一个新的ROS服务服务器,例如: ``` ros::ServiceServer service = nh.advertiseService("my_service", serviceCallback); ``` 其中,`nh`是ROS节点句柄,`adverstiseService()`函数用于创建一个新的ROS服务服务器并将其注册到ROS Master上。 3. 在C++ ROS节点的`main()`函数中,调用`ros::spin()`函数来启动ROS节点,并等待服务请求。例如: ``` int main(int argc, char **argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; // 创建服务服务器 ros::ServiceServer service = nh.advertiseService("my_service", serviceCallback); // 启动ROS节点 ros::spin(); return 0; } ``` 4. 在另一个C++ ROS节点中,创建一个新的ROS服务客户端,并调用服务请求。例如: ``` // 创建服务客户端 ros::ServiceClient client = nh.serviceClient<my_package::MyService>("my_service"); my_package::MyService srv; srv.request.input = "world"; // 调用服务请求 if (client.call(srv)) { ROS_INFO("Response: %s", srv.response.output.c_str()); } else { ROS_ERROR("Failed to call service"); } ``` 5. 在Postman中创建一个新的HTTP请求,选择POST方法,并在请求的URL中指定ROS服务名称。例如: ``` http://localhost:11311/my_service ``` 6. 在请求的Body中输入服务请求数据,并在请求的Header中添加Content-Type标头,标明要发送的数据类型。 7. 点击发送按钮,Postman将发送请求到ROS服务服务器,并接收服务响应。 请注意,您需要在本地计算机上安装ROS,并将ROS环境设置为活动状态,以便正确地启动ROS节点和ROS服务。此外,您还需要在ROS Master上启动ROS节点以便Postman进行通信。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值