ROS的话题编程基本流程:
话题编程流程:
1.创建发布者
2.创建订阅者
3.添加编译选项
4.运行可执行程序
实现一个发布者:
1.初始化ROS节点
2.向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
3.按照一定频率循环发布消息
实现一个订阅者:
1.初始化ROS节点;
2.订阅需要的话题;
3.循环等待话题消息,接受到消息后进入回调函数;
4.在回调函数中完成消息处理。
1.创建工作空间catkin_m:
mkdir -p ~/catkin_m/src #创建名为catkin_m的文件夹,包含src
cd ~/catkin_m/src #进入src
catkin_init_workspace #初始化工作空间,会生成CMakeLists.txt
cd ~/catkin_m #进入catkin_m
catkin_make #编译工作空间 catkin_m文件夹中会生成两个文夹build devel
source devel/setup.bash #在bash中注册工作空间
echo $ROS_PACK_PATH #验证是否注册成功
2.创建一个功能包learning_work:
cd ~/catkin_m/src
catkin_create_pkg learning_work std_msgs rospy roscpp #创建功能包,std_msgs rospy roscpp是给这个功能包添加的依赖
cd ~/catkin_m #返回到工作空间
catkin_make #编译功能包,编译过的功能包会增加CMakeLists.txt include package.xml src这四项
3.创建发布者(Publisher)订阅者(Subscriber)节点,并开始编写源码
cd ~/catkin_m/src/learning_work/src #进入learning_work的src目录
gedit turtle_control.cpp #创建并打开名为turtle_control的cpp文件
编写cpp文件
#include <ros/ros.h>
#include <turtlesim/Spawn.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Pose.h>
ros::Publisher turtle_vel; //发布者节点
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
ROS_INFO("Turtle2 position:(%f %f)",msg->x,msg->y);
}
int main(int argc,char** argv)
{
//ROS节点初始化
ros::init(argc,argv,"turtle_control");
//创建节点句柄
ros::NodeHandle node;
//通过服务调用,产生第二只乌龟turtle2
ros::service::waitForService("spawn");
ros::ServiceClient add_turtle=node.serviceClient<turtlesim::Spawn>("spawn");
turtlesim::Spawn srv;
//第二只海龟信息
srv.request.x=5;
srv.request.y=5;
srv.request.name="turtle2";
add_turtle.call(srv);
//成功后打印信息
ROS_INFO("The turtle2 has been spawn!");
//订阅乌龟的pose信息
ros::Subscriber sub=node.subscribe("turtle2/pose",10,&poseCallback);
//定义turtle的速度控制发布器
turtle_vel=node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel",10);
ros::Rate rate(10.0);
while(node.ok())
{
//发布速度控制命令
geometry_msgs::Twist vel_msg;
vel_msg.angular.z=1;
vel_msg.linear.x=1;
turtle_vel.publish(vel_msg);
//循环等待回调函数
ros::spinOnce();
rate.sleep();
}
return 0;
}
在learning_work下的CMakeLists.txt中添加编译选项
add_executable(turtle_control src/turtle_control.cpp)
target_link_libraries(turtle_control ${catkin_LIBRARIES})
4.编写launch文件
在工程包learning_work功能包下新建一个launch文件夹,并在文件夹里新建一个turtle_control.launch文件。
<launch>
<!-- pkg:节点所在的功能包名称 type:节点的可执行文件名称 name:节点运行时的名称 -->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"/>
<node pkg="learning_work" type="turtle_control" name="turtle_control" output="screen"/>
</launch>
5.编译工作空间,生成可执行文件
cd ~/catkin_m
catkin_make
6.运行节点
打开一个terminal运行roscore
roscore
再打开一个terminal进入工作空间
cd ~/catkin_m
在bash中注册
source ./devel/setup.bash
运行turtle_control节点
rosrun learning_work turtle_control
新打开一个terminal启动小海龟仿真器
rosrun turtlesim turtlesim_node
此时在运行turtle2_control就会打印输出小乌龟的信息
本来是要求用roslauch启动所有节点,但奈何武功尚弱,等后面彻底弄懂之后再来填坑。欢迎各位大神指导,有什么想法和建议欢迎在评论区留言交流讨论,一起成长.