在写这篇文章的一年前左右,我有浅学过一段时间ROS机器人操作系统,用windows的记事本做了些笔记,现在做项目需要用到,回过头去看自己做的笔记,属实是有些杂乱无章,现在重新在这里整理一下笔记,顺便记录一下自己的学习过程,首先从ROS的架构开始。
ROS机器人操作系统是建立在最基本的操作系统之上的,ROS诞生于Ubuntu系统,随后不断更新,至目前为止也支持在Windows和Mac上进行部署开发。其本身是基于操作系统开发的,因此在配置ROS环境之前要先配置好底层操作系统的环境,如我所用的是基于Ubuntu18.04的ROS操作系统,那应当先配置好Ubuntu18.04的环境。
关于Ubuntu18.04的安装,个人实践过这个视频,安装很顺利:翘课去写代码:安装windows和ubuntu双系统
还有这篇博客:Ubuntu18.04安装教程
都非常的详细,有需要可以跳转去查看一下。
然后就到了ROS本身,ROS封装了大量的便于开发的库/包,在配置好工作空间后,可以通过API或终端命令行进行ROS系统的开发。以下为ROS官网和教程的超链接:
ROS官网:ROS官网(https://www.ros.org/)
ROS官方wiki:ROS Wiki(http://wiki.ros.org/)
最后是一个我个人认为很不错的ros入门教学视频和一个ros Melodic的安装视频:ROS机器人入门 、 ROS Melodic安装
我使用的系统是Ubuntu18.04,因此以melodic版本为例:首先打开 wiki.ros.org,如下图所示顺序点击进入官方的安装教程。
进入之后首先第一步是要添加ros的软件源至你的源列表中,如下图所示。
点击Mirrors,然后在中国的源列表中选择一个作为你的ros软件源,这里我选择1.1.1中科大的源,即打开终端,输入:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
再添加密钥:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
再进行完整的ros安装:
sudo apt install ros-melodic-desktop-full
这里会有较长的等待时间,安装完成后添加环境变量。
终端输入如下所示命令即可:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo rosdep init
如果出现报错,可参考该视频:ROS Melodic安装,在4:05开始初始化rosdep。
完成并且不报错后,输入如下所示命令:
rosdep update
至此ros的安装就完成了,如下所示为小海龟命令:
先打开一个终端用于运行ros master:
roscore
再打开2个终端分别运行海龟和键盘的节点:
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
首先了解一下catkin。catkin是ROS中的一种基于Cmake衍生出来的常用的编译系统,利用该套编译系统搭建工作空间并对已写的逻辑程序进行编译和运行,实现ROS的开发。
如下为ROS的catkin下的工作空间基本架构:
在上述工作空间主目录下的src中,存放了各个自定义的功能包,功能包内通常的文件架构如下所示:
在这里记录一个搭建工作空间的模板,方便以后copy。
在搭建工作空间之前,一个必不可少的步骤就是运行ros master。master在ros里充当着一个管理员的角色或者说是一个主节点,在这个松耦合的分布式通信平台上,所有节点之间想要互相通信都要通过这位master之手,它负责对节点之间通信进行管理调度。打开一个独立的终端,输入以下程序即可启动master:
roscore
启动master的同时启动参数服务器和rosout日志节点,这种情况下,节点与节点之间可利用参数服务器减少许多累赘的参数交换。
首先在master运行的情况下,再打开一个新的终端,输入如下命令,建立一个文件夹作为工作空间,并在工作空间内先行创建src文件夹。然后使用catkin_make进行编译,其中formwork为工作空间名称(可改):
mkdir -p formwork/src
cd formwork
catkin_make
编译完成后会在工作空间内生成build和devel文件夹。随后就是在src文件夹中创建一个的功能包用于开发。
在刚刚的终端输入如下命令:
cd src
catkin_create_pkg package roscpp rospy std_msgs
如上命令中的catkin_create_pkg即为功能包创建命令,package为功能包名(可改),roscpp为C++库,rospy为python库,std_msgs为标准消息库,不管用c还是python,都加进去就行了,当然洁癖严重点的也可以去掉不用的。功能包创建完成后可看到src文件夹下多了功能包文件夹和CMakeLists.txt配置文件。
在功能包文件夹下会生成include、src两个文件夹和CMakeLists.txt、package.xml两个配置文件。src为存放c文件的文件夹。
如下所示,在刚刚的终端输入以下命令即可在功能包的src目录下创建cpp文件:
touch package/src/code.cpp
# 和上文一样,package替换成你当前的功能包文件名称。code也需替换成你创建的c++文件名称。
然后就是编写程序。。。这部分留在后面的文章再记录,准备搞多几份基础的程序框架留着应对各种通信需求(方便copy)。
更改配置文件:
然后就到了配置编译环境,打开同功能包目录下的CMakeLists.txt,该文件便是CMake编译包中常见的配置文件,打开后找到add_executable(即添加可执行文件),打开注释,将刚刚的.cpp文件名称替换进去,然后随便定义一个名称把 ${PROJECT_NAME}_XX 替换掉,作为映射名称。再找到target_link_libraries(即目标链接库),同样打开注释,用刚刚上面改的映射名称替换掉 ${PROJECT_NAME}_XX ,这样一个c文件编译所需的配置就完成了。
首先要在功能包下新建一个存放python文件的文件夹,类似于上述功能包下的src,在刚刚的终端使用如下命令:
cd package
mkdir scripts
cd scripts
touch code.py
chmod +x code.py
# 和上文一样,package替换成你当前的功能包文件名称。code也需替换成你创建的python文件名称。
如上所示,创建了一个scripts文件夹后,在文件夹内创建了一个python文件,然后为这个python文件添加可执行权限。
然后再打开功能包下的CmakeList.txt,修改scripts后的文件名为自己创建的python文件名。可能玩python的同学会觉得奇怪,python不是只用解释器就行吗,为啥也要配置编译依赖文件。其实这个不是为编译而配置的,是为了找到适合该python文件的解释器而配置的,有了这一步就不用担心python2或python3的问题了。
最后再重新回到工作空间首目录,如果你完全按照之前上述命令在终端执行的话,输入以下命令即可回到工作空间(即返回到上一层目录),再使用catkin_make进行编译即可:
按照的是上述 节点文件语言为C++ 的终端命令:
cd ..
catkin_make
按照的是上述 节点文件语言为Python 的终端命令:
cd ../../..
catkin_make
只要代码没问题,那么编译顺利,搭建完成。再回过头编写节点主要内容即可。
每次完成编写完成编译后都要记得修改环境变量,每次编译后按照如下命令执行即可顺利运行节点:
source ./devel/setup.bash
rosrun 功能包名 节点映射名
当然这一切都应该是在master正在运行的情况下才能正常运行的,即在另一个终端已经执行了roscore并保持他的运行。
本人是一名学生,目前正在学习中,本篇文章也算是我的学习笔记,如有错误的话还请指正。