C++学习ros2
话题机制=>发布与订阅=>talker and listener
服务机制=>服务端与客户端=>service and client
一、创建文件和文件夹
1、结构
工作包1下的node1是发布
工作包2下的node1是订阅
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
3、直接创建node.cpp文件
二、编写节点文件(发布订阅)
1、node1.cpp(发布)
# include "rclcpp/rclcpp.hpp"//导包
# include "std_msgs/msg/string.hpp"//导入消息类型
// # include "std_msgs/msg/u_int32.hpp"//导入发布者消息类型
using std::placeholders::_1;//占一个位置
using namespace std::chrono_literals;
class SolveNode:public rclcpp::Node{//自定义节点继承public rclcpp::Node
public:
//
//构造函数
//
//
SolveNode(std::string name):Node(name), count(0){
//RCLCPP_INFO(this->get_logger(),"这是%s的构造函数",name.c_str());//打印节点
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;//计时器
//const int count=1;//计数
size_t count;
};//节点类
int main(int argc,char ** argv){//argc参数个数,argv参数数组
rclcpp::init(argc,argv);//初始化
auto node=std::make_shared<SolveNode>("pub_node");//新建节点对象,类型是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 rclcpp::Node
public:
//
//
//构造函数
//
//
SolveNode(std::string name):Node(name){
//RCLCPP_INFO(this->get_logger(),"这是%s的构造函数",name.c_str());//打印节点
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){//argc参数个数,argv参数数组
rclcpp::init(argc,argv);//初始化
auto node=std::make_shared<SolveNode>("sub_node");//新建节点对象,类型是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
2、运行
订阅(终端1)
source install/setup.bash
ros2 run workpackage2 sub_node#sub_node定义在CMakeList.txt中
发布(终端2)
source install/setup.bash
ros2 run workpackage1 pub_node#pub_node定义在CMakeList.txt中
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