ros操作系统中有两种节点,一种是发布者Publisher,一种是订阅者Subscriber
Publisher:
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char *argv[])
{
ros::init(argc,argv,"chao_node");//ros初始化
ros::NodeHandle nh;
//ros::NodeHandle对象,也就是节点的句柄,它可以用来创建Publisher、Subscriber以及做其他事情。
ros::Publisher pub = nh.advertise<std_msgs::String>("Publisher_Topic_group",10);
//了解这次创建了什么名字的话题"Publisher_Topic_group"以及缓冲区10
ros::Rate loop_rate(20);
//控制发布频率为1秒20次
printf("hello world,jetson nano!\n");
while(ros::ok())//如此循环,不会自动退出节点,可以收到Ctrl+c打断
{
std_msgs::String msg;
msg.data = "i love you";//定义发送的字符内容
pub.publish(msg);//发送指定的内容文件
loop_rate.sleep();
}
return 0;
}
Subscriber:
#include <ros/ros.h>
#include <std_msgs/String.h>
void jetson_callback(std_msgs::String msg)//收到订阅信息的回调函数,类比单片机的中断处理函数
{
printf(msg.data.c_str());//重新答应一次收到的数据
//也可以使用ROS::INFO(msg.data.c_str())
printf("\n");
}
int main(int argc, char *argv[])
{
ros::init(argc,argv,"ma_node");//ros初始化
ros::NodeHandle master;
//ros::NodeHandle对象,也就是节点的句柄,它可以用来创建Publisher、Subscriber以及做其他事情。
ros::Subscriber sub = master.subscribe("Publisher_Topic_group",10,jetson_callback);
//了解这次创建了什么名字的话题"Publisher_Topic_group"以及缓冲区10
//如果想要上下通讯,必须保障订阅名(Topic)一样,最后一个数据是回调函数
while(ros::ok())
{
ros::spinOnce();//在死循环过程中时刻关注ros系统发来的数据
}
return 0;
}
CMakeLists:
add_executable(ma_node src/ma_node.cpp)
target_link_libraries(ma_node
${catkin_LIBRARIES}
)
一些ros观察节点的指令
rosrun XXXXX XXXXXX//运行单个节点
rostopic list//查看目前活跃节点
rostopic echo /Publisher_Topic_group //查看Publisher_Topic_group节点的信息
rostopic hz /Publisher_Topic_group //查看Publisher_Topic_group节点的发送频率
rqt_graph //查看节点可视化图
![](https://i-blog.csdnimg.cn/blog_migrate/88cf924c3531de3730a1ca8003f847f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f24b5a4aea2fa5ae7cdd4c9bf54cffd2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bca4c7ac2fcbb577db766947f1a6e8c3.png)