ROS編程第一步: 自己寫一個消息發佈者和訂閱者

明確幾點:

我們使用ros的  發佈-訂閱 機制,編碼肯定脫不開ros層的數據類型


一旦我們 編寫好了文件,只用做以下幾步就可以 運行我們的程序了。

  1. 把你的cpp文件放到
    home/工作空間名/src/功能包名/src 下面
  2. 修改這個文件
    home /工作空間名/src/功能包名/CMakelist文件
    打開,找找有一段 , 一堆#號包圍 build
    如圖:
    在這裏插入圖片描述這個時候,你向下找到 一堆#號 包圍的 Install, 在它上面添加兩句話:
add_executable(你的文件名  src/你的文件名.cpp)

target_link_libraries(你的文件名
   ${catkin_LIBRARIES}
 )

比如我有兩個文佳, 一個是 pose_subscriber.cpp ,一個是 velocity_publisher.cpp, 這個時候,我的文件就像下面

在這裏插入圖片描述 最後一步

回到
	home/你的工作空間
執行: catkin_make       然後 source devel/setup.bash

要是這一步報錯,可能是你的cpp文件有語法錯誤了

然後檢驗一下運行

rosrun  你的功能包名  你的文件名

沒報錯就是成功了

貼上 發佈者和訂閱者的代碼

發佈者

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
int main(int argc, char const *argv[])
{	
	
	//ROS節點初始化
	ros::init(argc,argv,"velocity_publisher");
	
	//創建節點句柄
	ros::NodeHandle n;
	
	//創建一個publisher, 發佈名爲/ turtile1/cmd_vel的topic ,消息類型爲geometry_msgs::Twist,隊列長度爲10
	//注意,尖括號裏面你發佈的數據類型,這裏的 cmd_vel 是你的數據的目的地 
	ros::Publisher  turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel" , 10);
	
	//設置循環頻率
	ros::Rate  loop_rate(10);

	int count=0;

	while(ros::ok()){
		//初始化geometry_msg::Twist類型消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x=0.5;
		vel_msg.angular.z=0.2
		
		//發佈消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("publish turtle velocity command[%0.2f m/s , %0.2f rad/s]", vel_msg.linear.x ,vel_msg.angular.z);

		//按循環延時
		loop_rate.sleep();
	}
	return 0;
}
 

訂閱者

#include<ros/ros.h>
#include "turtlesim/Pose.h"


void poseCallback(const turtlesim::Pose::ConstPtr& msg){
	//打印接收到的信息
	ROS_INFO("Turtle pose:  x:%0.6f,  y:%0.6f" , msg->x, msg->y);
}


int main(int argc, char **argv)
{
	//初始化ros結點
	 ros::init(argc,argv,"pose_subscriber");
	 //句柄
	 ros::NodeHandle n;

	//實例化一個subscriber , 註冊回調函數
	ros::Subscriber pos_sub = n.subscribe("/turtle/pose",10, poseCallback);

	//循環等待回調函數
	ros::spin();


	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章