工作空间是一个存放工程开发相关文件的文件夹。所有文件放到一个文件系统下,ROS开发所有工程,称为工作空间。
1、创建工作空间
workspace工作空间:
文件夹:
src:代码空间(所有工程包源码)
build:编译空间(编译产生的中间文件)
devel:开发空间(较常用,编译完成后所生成的可执行文件)
install:安装空间(与devel作用基本相同在ros2中合成了一个文件夹)
工作空间结构:
创建工作空间:
编译工作空间:
编译后无措,基于c_make开发的封装ros用。不会编译源码,因为什么都没有添加,可以在哥哥文件夹下查看。
设置环境变量:
很重要,之后找不到安装包可能就是环境白能量没有安装好,找不到节点等问题。终端有zsh和bash,根据自己用的设置后缀。在终端设置后,环境变量只在本终端有效,换个终端之后就无效了,建议在home根目录下改。命令放到根目录下,
vi ~/.bashrc
在最后一行中添加:
source ~/catkin_ws/devel/setup.bash
按shift+wq!(小写与大写指令不同) 保存退出。
然后:
source ~/.bashrc
使设置生效。在打开一个终端查看环境变量即可发现环境变量已经存在。
以下为只有当前终端有环境变量。
检查环境变量:
到此工作空间就建立好了。
创建功能包
指令:
catkin_create_pkg[depend1] [depend2] [depend3]
创建功能包:
cd ~/catkin_ws/srccatkin_create_pkg learning_communication std_msgs rospy roscpp
出现一系列创建就成功了。rospy :python依赖。 roscpp: c++依赖。
在catkin_ws/src下就已经成功创建了功能包,打开后会有一些文件和文件夹。src为防止功能包代码,include防止功能包头文件。package.xlm为功能包的一些描述,其中有功能包的一些依赖,在后期添加的依赖要在这里修改。
编译功能包:
cd ~/catkin_wscatkin_makesource ~/catkin_ws/devel/setup.bash
编译后会发现新建的功能包。
在src目录下:同一个工作空间下,不允许存在同名功能包;不同工作空间下允许存在同名功能包。
当同一个系统中存在多个同名功能包时ROS的会如何运行,一什么样的顺序去运行,会优先选择那个工作空间中的功能包。
ROS工作空间的Overlaying机制,即工作空间的覆盖。
env:查看系统的环境变量。
env | grep ros :过滤出与ros相关的环境变量。
在锁有环境变量中,其中ROS_PACKAGE_PATH=[路径1][路径2]
ros搜寻功能包的路径会由1向2,依次像后找,如果都找不到系统会报错。
设置的新路径会优先放置到最前端。
测试:
安装一个安装包,由于我用的是ROS Melodic,所以安装ros-melodic-roscpp-tutorials
sudo apt-get install ros-melodic-roscpp-tutorials
如果没安装过就显示安装了。
打开终端使用指令:
rospack find roscpp_tutorials
就会找到安装包路径。
在自己的工作空间新建一个同名的软件包roscpp_tutorials
source ~/.bashrc
使环境变量生效(如果是复制的,需要这样设置)
然后在打开查找安装包路径,就会变为自己所用工作空间的安装包。
2、ROS通信编程
话题编程、服务编程、动作编程
话题通讯模型:
话题编程流程:
1、创建发布者。
小知识:
创建文本文件,在ubuntu18中可能右键没有文本,因此需要我们手动添加。打开模板文档在其中打开终端输入:
sudo gedit txt
会出现一个文本,点保存即可。
如何定义话题消息--话题编程
1、定义msg文件
2、在package.xml添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3、在CMakeList.txt添加编译选项
。。。find_package(……message_generation)
。。。catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
。。。add_message_files(FILES Person.msg)
generate_mesages(DEPENDENCIES std_msgs)
2、创建订阅者。
3、添加编译选项
4、运行可执行程序。
3、实现分布式通信
4、ROS中的关键组件