C++学习ros2
- 一、创建文件和文件夹
- 1、结构
- 2、创建工作空间和工作包
- 3、直接创建node.cpp文件
- 二、编写节点文件(发布订阅)
- 1、node1.cpp(发布)
- 2、CMakeLists.txt(发布)
- 3、node1.cpp(订阅)
- 4、CMakeLists.txt(订阅)
- 三、编译与运行
-
话题机制=>发布与订阅=>talker and listener
服务机制=>服务端与客户端=>service and client
一、创建文件和文件夹
1、结构
工作包1下的node1是发布
工作包2下的node1是订阅
![在这里插入图片描述](https://img-blog.csdnimg.cn/701ff2d32bdf4d90a68d091f9b18a757.png)
2、创建工作空间和工作包
mkdir workspace
cd workspace
mkdir src
cd src
ros2 pkg create workpackage1 --build-type ament_cmake --dependencies rclcpp
ros2 pkg create workpackage2 --build-type ament_cmake --dependencies rclcpp
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5a34b1849974c85b634c96491f211bb.png)
3、直接创建node.cpp文件
二、编写节点文件(发布订阅)
1、node1.cpp(发布)
# include "rclcpp/rclcpp.hpp"
# include "std_msgs/msg/string.hpp"
using std::placeholders::_1;
using namespace std::chrono_literals;
class SolveNode:public rclcpp::Node{
public:
SolveNode(std::string name):Node(name), count(0){
puber=this->create_publisher<std_msgs::msg::String>("mytopic",10);
timer = this->create_wall_timer(500ms, std::bind(&SolveNode::callback, this));
}
private:
void callback(){
std_msgs::msg::String mytopic;
mytopic.data="第"+ std::to_string(count++)+"次回调函数";
puber->publish(mytopic);
}
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr puber;
rclcpp::TimerBase::SharedPtr timer;
size_t count;
};
int main(int argc,char ** argv){
rclcpp::init(argc,argv);
auto node=std::make_shared<SolveNode>("pub_node");
RCLCPP_INFO(node->get_logger(),"这是pub节点的主函数");
rclcpp::spin(node);
rclcpp::shutdown();
}
2、CMakeLists.txt(发布)
add_executable(pub_node src/node1.cpp)
ament_target_dependencies(pub_node rclcpp std_msgs)
install(TARGETS
pub_node
DESTINATION lib/${PROJECT_NAME}
)
3、node1.cpp(订阅)
# include "rclcpp/rclcpp.hpp"
# include "std_msgs/msg/string.hpp"
using std::placeholders::_1;
class SolveNode:public rclcpp::Node{
public:
SolveNode(std::string name):Node(name){
suber=this->create_subscription<std_msgs::msg::String>("mytopic",10,std::bind(&SolveNode::callback,this,_1));
}
private:
void callback(const std_msgs::msg::String::SharedPtr mytopic){
RCLCPP_INFO(this->get_logger(),"这是%s的回调函数",mytopic->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr suber;
};
int main(int argc,char ** argv){
rclcpp::init(argc,argv);
auto node=std::make_shared<SolveNode>("sub_node");
RCLCPP_INFO(node->get_logger(),"这是订阅节点主函数");
rclcpp::spin(node);
rclcpp::shutdown();
}
4、CMakeLists.txt(订阅)
add_executable(sub_node src/node1.cpp)
ament_target_dependencies(sub_node rclcpp)
install(TARGETS
sub_node
DESTINATION lib/${PROJECT_NAME}
)
三、编译与运行
1、编译(终端)
编译全部工作包
cd ..
colcon build
编译指定工作包
cd ..
colcon build --packages-select workpackage1
![在这里插入图片描述](https://img-blog.csdnimg.cn/923eae13d35f4010abc136f89a63517a.png)
2、运行
订阅(终端1)
source install/setup.bash
ros2 run workpackage2 sub_node
发布(终端2)
source install/setup.bash
ros2 run workpackage1 pub_node
3、查看节点及详细信息
在ros2 run XXX XX的情况下重新开一个终端
查看关系
rqt_graph
查看节点
ros2 node list
ros2 node info /node1
查看话题
ros2 topic list
ros2 topic info /chatter
实时话题内容
ros2 topic echo /mytopic
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)