明确几点:
我们使用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;
}