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