ROS学习之旅-----功能包和工作空间及发布者与订阅者代码实现

ROS学习之旅-----功能包和工作空间

在ROS(Robot Operating System)中,工作空间(Workspace)是一个用于组织和构建ROS功能包(packages)的目录结构。工作空间包含多个功能包,通常是使用catkin或colcon工具来管理和构建的。
功能包是ROS的基本构建单元,它包含了实现特定功能所需的全部文件。一个功能包通常包含以下几种文件和目录:
源代码:实现功能的C++或Python代码。
消息(messages)和服务(services)定义:用于定义节点间通信的数据格式。
配置文件:参数、启动文件等。
CMakeLists.txt:构建系统文件,定义如何编译和链接代码。
package.xml:元数据文件,包含功能包的名称、版本、依赖关系等信息。

mkdir myfast250_ws
cd myfast250_ws/
mkdir src
cd src/
cd ..
catkin build
cd src
catkin_create_pkg test_pkg std_msgs rospy roscpp

创建后可以看到test_pkg内部多出了include 和src文件夹
在这里插入图片描述

src主要放cpp和py的代码,include放h文件

编译:

进入工作空间目录(src上一级)

catkin build

在这里插入图片描述
编译完成后若要使用功能包,记得

source devel/setup.bash

或者直接在.bashrc文件里写入

source ~/myfast250_ws/devel/setup.sh

话题发布功能包

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc,char  **argv)
{
    //ros节点初始化
    ros::init(argc,argv,"velocity_publisher");

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个publisher,发布名为/turtle1/cmd_vel的话题,消息类型为geometry_msgs::Twist,队列长度为10
    ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
    //循环频率定位10
    ros::Rate loop_rate(10);

    int count = 0;
    while(ros::ok())
    {
        //初始化消息
        geometry_msgs::Twist vel_msg;
        vel_msg.linear.x = 0.5;
        vel_msg.linear.y = 0.5;
        vel_msg.linear.z = 0.2;
        //发布消息
        turtle_vel_pub.publish(vel_msg);
        ROS_INFO("PUBLISH TURTLE VELOCITY COMMAND[x:%0.2f m/s,0.2f rad/s]",vel_msg.linear.x,vel_msg.linear.z);
        
        loop_rate.sleep();
    }
    return 0;
}

修改src->learning_topic 里的cmakelist,
增加

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher  ${catkin_LIBRARIES})

之后

roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher

即可看到小乌龟自己动了起来

话题订阅功能包

#include <ros/ros.h>
#include <turtlesim/Pose.h>
#include <learning_topic/pose_subscriber.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::init(argc,argv,"pose_subscriber");

    ros::NodeHandle n;

    ros::Subscriber pose_pub = n.subscribe("/turtle1/pose",10,poseCallback);

    ros::spin();

    return 0;
}    

在cmakelist中
添加:

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber  ${catkin_LIBRARIES})

我还写了一个pose_subscriber.h文件
内容为:

#include <turtlesim/Pose.h>
#include <ros/ros.h>
namespace pose_sub{
    class pose_subscriber
    {
    private:
        /* data */
    public:
        void poseCallback(const turtlesim::Pose::ConstPtr& msg);
    };
}

在cmakelist中添加

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值