创建工作空间和功能包

1、工作空间(workspace)是一个存放工程开发相关文件的文件夹,包括:

  • src:代码空间(Source Space)                   放置功能包   代码文件  launch文件 CMakeLists.txt
  • build:编译空间(Build Space)                   编译过程产生的中间文件
  • devel:开发空间(Development Space)     可执行文件  库  脚本文件  代码在此运行
  • install:安装空间(Install Space)
# 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace   这是属性的变化,执行后会产生CMakeList.txt文件

# 编译工作空间          必须在工作空间路径下才可以编译
cd ~/catkin_ws
catkin_make             编译工作空间下所有功能包的源码  产生src build  devel文件夹
catkin_make install     产生install 文件夹

可见一般情况下最常用的是src文件

2、创建功能包

# 创建功能包
catkin_create_pkg <pakeage_name> [depend1] [depend2] [depend3]

cd ~/catkin_ws/src
catkin_create_pkg example_cpp(功能包名字) std_msgs roscpp 
例如 catkin_create_pkg test_pkg std_msgs roscpp rospy

其中std_msgs是通信文件,数据流,消息的发送和接收

创建完功能包后,功能包下面包含以下文件

3、编译与设置环境变量

catkin_make              编译

source devel/setup.bash   设置环境变量
source ~/catkin_ws/devel/setup.bash  将其添加到.bash文件中,不用每次重新设置环境变量

echo $POS_PACKAGE_PATH         检查环境变量  查找所有功能包的路径

package.xml的内容

<?xml version="1.0"?>
<package format="2">
  <name>test_pkg</name>      //功能包名字
  <version>0.0.0</version>   //版本
  <description>The test_pkg package</description>  

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="mxh2@todo.todo">mxh2</maintainer>     //Emil


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>       


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/test_pkg</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <buildtool_depend>catkin</buildtool_depend>       //功能包依赖
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

注:

同一个工作空间下,不允许存在同名功能包,不同工作空间下,允许尊在同名功能包

在~/catkin_ws/src/test_pkg/src$下

4、创建文件夹      

touch example_public.cpp      touch example_subscriber.cpp

其中example_subscriber.cpp  example_public.cpp可任意命名

发布者publisher的编程实现

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc,char **argv)
{
    ros::init(argc,argv,"example_public");       //a)
    ros::NodeHandle n;                           //b)
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000);    //c)
    ros::Rate loop_rate(10);                     //d)
    while(ros::ok())                     //中断,遇到ctrl+c时候中断
    {
        std_msgs::String msg;            //申请内存
        std::stringstream ss;                  //信息内容变量
        ss << "I am publisher ";         //写入变量
        msg.data = ss.str();             //写入内存
        chatter_pub.publish(msg);        //调用发布函数
        loop_rate.sleep();               //发送频率
    }
    return 0;
}

example_subscriber.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("I heard: [%s]",msg->data.c_str()); //接收的消息
}
int main(int argc,char **argv)
{
    ros::init(argc,argv,"example_subscriber");    //a)
    ros::NodeHandle n;                            //b)
    ros::Subscriber sub = n.subscribe("message",1000,chatterCallback);    //c)
    ros::spin();                                  //回调函数
    return 0;
}

5、修改~/catkin_ws/src/test_pkg/src下的CMakeList文件(在末尾加以下内容即可)

include_directories(
    include
    ${catkin_INCLUDE_DIRS}
)
add_executable(example_public src/example_public.cpp)         把代码文件转变为可执行文件
add_executable(example_subscriber src/example_subscriber.cpp)  也即把.cpp文件编译为example_public  example_subscriber 文件

target_link_libraries(example_public ${catkin_LIBRARIES})     把可执行文件与库做链接
target_link_libraries(example_subscriber ${catkin_LIBRARIES})

add_executable(节点名  src/test.cpp)  节点名也就是最后的可执行文件

target_link_libraries(节点名  ${catkin_LIBRARIES})

6、之后再source ~/catkin_ws/devel/setup.bash

在工作空间catkin_ws处catkin_make

7、rosrun 包名  节点名

// 分别打开三个终端
roscore
 
rosrun test_pkg example_public
 
rosrun test_pkg example_subscriber

8、运行结果如下

 参考:https://blog.csdn.net/qq_40626497/article/details/103744839

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值