明確幾點:
我們使用ros的 發佈-訂閱 機制,編碼肯定脫不開ros層的數據類型
一旦我們 編寫好了文件,只用做以下幾步就可以 運行我們的程序了。
- 把你的cpp文件放到
home/工作空間名/src/功能包名/src 下面 - 修改這個文件
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;
}