ros2 cmake包依赖自己内部的srv
时间: 2023-07-18 09:31:44 浏览: 213
ros2的几种基础话题例程
在ROS2中,我们可以使用ament工具来构建我们的ROS2软件包。在构建过程中,我们可以使用`find_package()`命令来搜索ROS2中已安装的软件包或自定义软件包,以便于设置依赖关系。
对于依赖于自己内部的srv的软件包,我们需要在CMakeLists.txt中添加以下内容:
```
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/MySrv.srv"
)
ament_export_dependencies(rosidl_default_runtime)
ament_target_dependencies(${PROJECT_NAME}
"rosidl_default_runtime"
)
```
这里我们使用`rosidl_generate_interfaces()`命令来生成我们的srv消息,然后使用`ament_export_dependencies()`和`ament_target_dependencies()`命令来设置软件包的依赖关系。
然后,在我们的代码中,我们可以使用以下语句来包含我们的srv消息:
```
#include "my_package/srv/my_srv.hpp"
```
其中`my_package`是我们的软件包名称,`my_srv.hpp`是我们的srv消息头文件。
接下来,我们可以使用以下语句来创建srv客户端和服务器:
```
rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("my_node");
auto client = node->create_client<my_package::srv::MySrv>("my_service");
auto request = std::make_shared<my_package::srv::MySrv::Request>();
request->input = 42;
auto future = client->async_send_request(request);
```
这里我们使用`create_client()`命令来创建srv客户端,并使用`async_send_request()`命令来发送请求。对于srv服务器,我们可以使用以下语句:
```
rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("my_node");
auto server = node->create_service<my_package::srv::MySrv>("my_service",
[](const std::shared_ptr<my_package::srv::MySrv::Request> request,
std::shared_ptr<my_package::srv::MySrv::Response> response) {
// srv handler code
});
```
这里我们使用`create_service()`命令来创建srv服务器,并在lambda函数中编写我们的srv处理程序。
总之,为了依赖于自己内部的srv,我们需要在CMakeLists.txt中设置依赖关系,并在我们的代码中包含srv消息头文件和使用相应的srv客户端和服务器API。
阅读全文