ROS2基础:cpp面向对象编程
在 chapter2_ws/sec/demo_one_pkg/src 下创建一个 person_node.cpp
1
2
3 cd chapter2_ws/src/demo_one_pkg/src
touch person_node.cpp
gedit person_node.cpp
然后,编辑 person_node.cpp 的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 定义一个类,使其继承 Node
class PersonNode : public rclcpp::Node{
private:
std::string name_;
int age_;
public:
// 构造函数,调用父类的构造函数,属性初始化
PersonNode(const std::string &node_name, const std::string &name, const int &age):Node(node_name){
this->name_ = name;
this->age_ = age;
};
void eat(const std::string &food_name){
// 这里用的是 C 的格式化输出,故需要将 name_ 转换为 C 风格的字符串
RCLCPP_INFO(this->get_logger(), "I'm %s, %d years old and love eatting %s", this->name_.c_str(), this->age_, food_name.c_str());
};
};
int main(int argc, char** argv){
rclcpp::init(argc, argv);
// 这里的 make_shared 需要修改为 PersonNode 类型,传入的参数个数和形式必须与上面的PersonNode的一致
auto node = std::make_shared<PersonNode>("person_node","Peter",18);
RCLCPP_INFO(node->get_logger(),"hello");
// 如果上面的 make_shared 不修改为 PersonNode 类型,那么这里无法调用其公共函数
node->eat("apple");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
修改 demo_one_pkg 的 CmakeLists 文件
1
2
3
4
5
6
7
8
9
10
11
12 添加可执行文件
add_executable(demo_one_node src/demo_one.cpp)
add_executable(person_node src/person_node.cpp) # 添加这句
添加依赖
ament_target_dependencies(demo_one_node rclcpp)
ament_target_dependencies(person_node rclcpp) # 添加这句
拷贝节点到 install
install(TARGETS demo_one_node person_node
DESTINATION lib/${PROJECT_NAME}
)
重新编译并执行
1
2
3 cd ./learn_ros2/chapter_2/chapter2_ws/
colcon build
ros2 run demo_one_pkg person_node