创建 Catkin 工作空间
建立工作空间目录
1. 打开终端,创建工作空间(例如命名为 catkin_ws
)及其源代码目录 src
:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
2. 初始化并构建工作空间:
在 ~/catkin_ws
目录下执行
catkin_make
该命令会生成以下目录:
- build/:保存编译过程中生成的中间文件和构建文件。
- devel/:开发空间,存放编译后生成的可执行文件、库、配置脚本(如
setup.bash
),用于设置 ROS 环境变量。
3. (可选)安装到指定目录:
如果需要将工程安装到系统指定目录,可执行
catkin_make install
这样会生成 install/ 目录,存放安装后的文件。
ROS 工程的目录结构及作用
在 catkin_ws/src
中,每个 ROS 包通常遵循如下目录结构
my_package/
├── package.xml # 包描述文件,记录包名称、版本、依赖、作者等信息
├── CMakeLists.txt # 编译构建规则,定义如何编译、链接、安装包内的代码
├── src/ # 存放源代码(例如 C++ 的 .cpp 文件或 Python 脚本)
├── include/ # 存放公共头文件(主要用于 C++),便于模块间共享接口
├── launch/ # 存放 ROS 启动文件(.launch),用于配置和启动多个节点
├── msg/ # 自定义消息定义文件(.msg),用于节点间数据通信
├── srv/ # 自定义服务定义文件(.srv),用于同步请求-响应交互
├── action/ # 自定义动作定义文件(.action),用于长时间任务并提供反馈
├── config/ # 存放配置文件(如 YAML 格式),在节点启动时加载参数
└── scripts/ # 存放可执行脚本(如 Python 脚本),需赋予可执行权限
- package.xml 与 CMakeLists.txt:ROS 系统通过这两个文件来识别包、解析依赖以及完成编译链接工作。
- src/:放置实际的源代码,实现功能的主要逻辑。
- include/:主要放置头文件,方便其他源文件调用共享接口。
- launch/:集中管理启动多个节点的配置,便于调试和部署整个系统。
- msg/、srv/、action/:分别用于定义消息、服务和动作接口,以便不同节点之间实现自定义通信。
- config/:保存程序运行时所需的参数配置文件。
- scripts/:适合存放 Python 脚本或其它解释型语言的程序,通过
rosrun
命令启动时直接执行。
添加一个包和一个节点
创建 ROS 包
切换到工作空间的 src
目录:
cd ~/catkin_ws/src
使用 catkin_create_pkg
命令创建包(本例中命名为 my_package
,依赖 rospy
和 std_msgs
)
catkin_create_pkg my_package rospy std_msgs
该命令会在 my_package
下生成基本的包结构,包括 package.xml
和 CMakeLists.txt
。
你可以根据需要在包内手动添加目录(如 scripts/
、launch/
等)
添加一个节点
以 Python 节点为例:
在 my_package
下创建 scripts
目录:
cd ~/catkin_ws/src/my_package
mkdir scripts
在 scripts
目录中创建一个名为 hello_node.py
的文件,并写入如下代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def talker():
# 初始化节点,节点名为 'hello_node'
rospy.init_node('hello_node', anonymous=True)
# 创建一个发布者,向主题 'chatter' 发布 String 类型消息
pub = rospy.Publisher('chatter', String, queue_size=10)
rate = rospy.Rate(1) # 1Hz 发布频率
while not rospy.is_shutdown():
hello_str = "Hello ROS at %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
保存后,为该脚本赋予可执行权限:
chmod +x scripts/hello_node.py
编译与启动节点
编译工作空间
返回工作空间根目录:
cd ~/catkin_ws
编译
catkin_make
如果包中新增了 Python 脚本,不需要额外编译,但最好编译以确保包的其他部分无误。
配置 ROS 环境
每次开启终端时需 source 工作空间的环境变量:
source ~/catkin_ws/devel/setup.bash
启动节点
方式一:使用 rosrun 启动节点
rosrun my_package hello_node.py
方式二:使用 launch 文件启动
在 my_package
下创建 launch
目录:
cd ~/catkin_ws/src/my_package
mkdir launch
在 launch
目录下创建文件 hello_launch.launch
,内容如下:
<launch>
<node pkg="my_package" type="hello_node.py" name="hello_node" output="screen"/>
</launch>
启动 launch 文件:
roslaunch my_package hello_launch.launch
总结
- 工作空间搭建
- 创建
catkin_ws
及其src
目录,使用catkin_make
初始化生成build/
与devel/
。
- 创建
- ROS 包目录结构
package.xml
与CMakeLists.txt
定义包信息和构建规则;src/
存源代码;include/
存头文件;launch/
存放启动文件;msg/
、srv/
、action/
分别定义自定义通信接口;config/
存参数配置;scripts/
存可执行脚本。
- 添加包和节点
- 使用
catkin_create_pkg my_package rospy std_msgs
创建包; - 在包中新增
scripts/hello_node.py
节点(示例为发布简单消息的 Python 节点),记得赋予可执行权限。
- 使用
- 编译与启动
- 编译工作空间,source 环境变量,然后使用
rosrun
或roslaunch
启动节点。
- 编译工作空间,source 环境变量,然后使用