ROS中自定义头文件的调用

本文介绍了如何在C++中新建并使用自定义头文件,包括创建hello.h头文件,定义命名空间和类,编辑use_head.cpp源文件,配置properties.json的includePath,以及修改CMakeLists.txt确保编译顺利。通过实例展示了不使用`using namespace std`时如何在main函数中明确指定命名空间。

熟悉C++类的调用对这一块肯定更为熟悉,那我们还是从最基本的入手

新建一个功能包
在这里插入图片描述
在这里插入图片描述
在define_by_us下新建文件hello.h,然后编辑头文件
在这里插入图片描述
先书写必要的,防止一个C源文件两次包含同一个头文件
再书写命名空间和类
在这里插入图片描述
接着新建一个源文件use_head.cpp
然后我们既然要引用一个头文件,为防止报错,首先,我们得设置properties.json,修改includePath
我们得把装头文件的include文件夹的路径给放到includePath里
在这里插入图片描述
接着编辑cpp文件
在这里插入图片描述

再编辑Cmakelist.txt
修改四个地方
在这里插入图片描述
在这里插入图片描述
ctrl+shift+B编译后发现没问题
在这里插入图片描述
终端运行成功输出
在这里插入图片描述
当然,上面那种写法类似我们平时用using namespace std,现在可以不加这一行,但是在main函数里就得稍微改一下
在这里插入图片描述
指明哪个命名空间的类的对象,反正两种效果一样,看你自己喜好

### ROS2 自定义消息接口头文件创建与使用 #### 定义自定义消息和服务 为了在ROS2中创建自定义的消息(`msg`)或服务(`srv`), 需要在对应的软件包内建立相应的`.msg` 或 `.srv` 文件。这些文件应放置于特定目录结构下的 `msg/` 和 `srv/` 子目录里[^1]。 对于每一个新创建的 `.msg` 或者 `.srv`, 必须更新该包中的 `CMakeLists.txt` 来调用宏 `rosidl_generate_interfaces()`,这会触发编译过程生成多种编程语言支持所需的源码和头文件。此功能由 `rosidl_default_generators` 提供。 ```cmake find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/CustomMessage.msg" "srv/AddTwoInts.srv" ) ``` 上述命令假设项目名称为 `${PROJECT_NAME}`, 并指定了两个待处理的接口描述文件路径。一旦完成配置并执行构建流程,则会在安装空间找到对应的语言绑定资源。 #### 查看已注册的服务接口详情 要查看某个具体服务类型的详细信息, 可利用命令行工具 `ros2 interface show` 加上完整的类型名作为参数来获取其内部字段说明。例如: ```bash install/setup.bash ros2 interface show tutorial_interfaces/srv/AddThreeInts ``` 这条指令展示了名为 `AddThreeInts` 的服务接口所包含的数据成员及其类型[^2]。 #### 实际应用案例展示 下面给出一段Python客户端程序片段用于请求加法运算的结果: ```python import rclpy from rclpy.node import Node from tutorial_interfaces.srv import AddThreeInts class MinimalClientAsync(Node): def __init__(self): super().__init__('minimal_client_async') self.cli = self.create_client(AddThreeInts, 'add_three_ints') while not self.cli.wait_for_service(timeout_sec=1.0): self.get_logger().info('service not available, waiting again...') self.req = AddThreeInts.Request() def send_request(self): self.req.a = int(input("Enter first number: ")) self.req.b = int(input("Enter second number: ")) self.req.c = int(input("Enter third number: ")) self.future = self.cli.call_async(self.req) def main(args=None): rclpy.init(args=args) minimal_client = MinimalClientAsync() minimal_client.send_request() while rclpy.ok(): rclpy.spin_once(minimal_client) if minimal_client.future.done(): try: response = minimal_client.future.result() except Exception as e: minimal_client.get_logger().info( f'Service call failed {e}') else: minimal_client.get_logger().info( f'Result of add_three_ints: {response.sum}') break minimal_client.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段代码实现了向服务器发送三个整数相加的任务,并打印返回值到控制台。这里的关键在于导入了之前提到过的 `tutorial_interfaces.srv.AddThreeInts` 接口类以便实例化请求对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eeemmm123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值