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,可以节约时间。
完成!!这个部分我居然还是报错了两次才过的,还是不细心呀!