古月居ROS第二讲课后作业:创建一个工作空间和功能包,然后在功能包中完成如下工作,并且使用launch文件启动涉及的节点。通过代码新生成一只海龟,放置在(5,5)点,命名为“turtle2“

本文详细介绍了ROS话题编程的流程,包括创建发布者、订阅者、添加编译选项,以及运行节点。通过实例展示了如何创建一个发布者节点来控制乌龟的运动,并订阅乌龟的pose信息。同时,还讲解了如何使用launch文件启动多个节点,并提供了编译和运行节点的步骤。最后,文章提及将在后续学习中完善使用roslaunch启动所有节点的操作。
摘要由CSDN通过智能技术生成

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启动所有节点,但奈何武功尚弱,等后面彻底弄懂之后再来填坑。欢迎各位大神指导,有什么想法和建议欢迎在评论区留言交流讨论,一起成长.

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值