ROS2:编译c++节点

c++节点

创建功能包

整体同python一样,修改一下编译类型和依赖就可以了:ros2 pkg create –build-type ament_cmake --dependencies rclcpp

我这里创建了一个名为robot_b的功能包,意味着机器人的另一个部分。(python功能包创建出来和c++不一样,所以不要混用功能包哦!)

不记得怎么拼写用tab补全就可以了,编译类型写ament_cmake,依赖的是c++的功能包,如果你tab健按多了的话,就会发现在依赖之后,它会给你补全你之前写的python功能包,也就是说,也可以依赖自己哦!感觉有点类似于python里面的库,你要安装好环境才能使用这个库,而这里是你要告诉我依赖的功能包是什么,你才能使用这个功能包里面的类和函数啥的。

创建节点的c++文件

在功能包下的src文件夹下创建一个节点文件,后缀cpp(代表c++),我这里是创建了一个head_pop.cpp文件,意思是机器人的头(随便取的,大脑接收四肢消息吧~),pop代表面向过程。对的,我们还是要分为面向过程和面向对象。

编写c++代码

pop

1.导入头文件:#include “rclcpp/rclcpp.hpp”

这里会出现一些问题,编辑器会报错,因为scode找不到这个头文件在哪里,但是你可以正常编译,因为编译器colcon知道。但是也可以去解决一下这个问题,点击代码旁边的黄色灯泡,进入includePath,找到包含路径,添加rclcpp的路径就好了。之前提过ros在电脑的什么位置,现在就到了用到它的时候了,在电脑opt下面的ros下进去你的版本文件夹进去,进入include,rclcpp就在这个文件夹里面。你直接添加**,告诉编辑器这个里面的所有文件路径就好了。

这样就不会报错了!如果不处理的话,也不会有关于这个rclcpp的提示哦!

2.创建主函数:int main(int argc,char **argv)

后面是两个默认参数设置

3.初始化客户端:rclcpp::init(argc,argv);

将参数传入客户端

4.创建节点: auto node = std::make_sharedrclcpp::Node(“head_pop”);

c++这里用到了智能指针的语法,不理解就直接写,我c++学习也是几乎停止了好久,除了上学期开始之外,几乎就没太学习了,导致现在的我也没太学过这个知识点,见倒是见过几次。这也是要传入节点名字的,如果你在开头添加了using namespace std;那就不需要写std::了,学习过c++的大概都知道为什么,但是在ros2里面好像是不太推荐这么做的。

5.发出消息:RCLCPP_INFO(node->get_logger(),“收到!”);

这里也是同python不太一样,用到了默认宏去发消息,由于在c++中node是指针,所以要写->。(感觉c++比python写起来麻烦,也难理解一点),引号里面就是要发的消息。

6.回旋节点:rclcpp::spin(node);

7.关闭节点:rclcpp::shutdown();

完成!

完整代码:

#include “rclcpp/rclcpp.hpp”

int main(int argc,char **argv)
{
rclcpp::init(argc,argv);
auto node = std::make_sharedrclcpp::Node(“head_pop”);
RCLCPP_INFO(node->get_logger(),“收到!”);
rclcpp::spin(node);
rclcpp::shutdown();
}

oop

1.导入库:#include “rclcpp/rclcpp.hpp”

2.创建类:
class head_oop:public rclcpp::Node
{
public:
head_oop(std::string name):Node(name)
{
RCLCPP_INFO(this->get_logger(),“收到!”);
}

};
继承Node,这里需要注意发送时是this,是类里面的特点

3.剩下同上:
int main(int argc,char **argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<head_oop>(“head_oop”);
rclcpp::spin(node);
rclcpp::shutdown();
}
只是在创建节点的时候类是自己创建的。

告诉电脑节点在哪里

这一部分也是同python不同,感觉要麻烦一点,要在CMakeLists.txt文件里面修改,
记得下个CMake工具哦!

1.在结尾写上add_executable(head_pop_node src/head_pop.cpp)

添加可执行文件位置,括号第一个写节点名字,后面写文件位置

2.写上ament_target_dependencies(head_pop_node rclcpp)

依赖库,第一个是自己这个节点,第二个是客户端库

3.install(TARGETS
head_pop_node
DESTINATION lib/${PROJECT_NAME}
)

改变install里面的内容除了第二个写节点名,其他的先记住好了。

有没有感觉到麻烦!!哦,对了,温馨提示,PROJECT_NAME是大括号哦!这个是CMake文件的写法,我可是在这里栽了好几次,编译成功节点找不到。

完整如下:

编译和运行

同之前完全一样,我就不解释了,不懂看colcon编译以及节点

需要注意的是,我这里只编译了robot_b,可以节约时间。

完成!!这个部分我居然还是报错了两次才过的,还是不细心呀!

  • 52
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值