断断续续地学习ROS和Moveit做运动规划,前段时间把理论推导整理完,现在来处理代码,发现随处都是坑,在这里记录下来,督促自己,可能的话帮助到他人也是一件好事。
ROS创建单个工作空间
参考官方文档,我们很容易建立自己的工作空间。主要步骤如下:
1创建catkin工作空间
// 新建一个名为catkin_ws的工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
注意工作空间下一定要有一个src文件夹,后面将包放在/src下。
2编译catkin工作空间
// 编译catkin_make工作空间
$ cd ~/catkin_ws/
$ catkin_make
3配置环境变量
// 配置环境变量
$ source ~/catkin_ws/devel/setup.bash
但是上述命令只是在当前终端里面会生效,如果我们新打开一个终端的话,这个环境变量依然会找不到。
所以你也可以参考很多教程上的,写到 .bashrc 中
使用vim或者gedit打开~/.bashrc(隐藏文件,需要Ctrl+H查看)
在最后一行加上
// 配置环境变量
$ source ~/catkin_ws/devel/setup.sh
或者更干脆,直接
// 配置环境变量
$ echo "source ~/catkin_ws/devel/setup.sh" >> ~/.bashrc
不管怎么改,别忘了source一下
$ source ~/.bashrc
这样每次新打开一个终端都能加载环境变量
4查看配置好的环境变量
$ echo $ROS_PACKAGE_PATH
就可以看到刚才配置好的环境变量了。
5*创建包
刚开始git或复制别人的包进行实验就行了,当需要创建自己的包的时候,使用catkin_creat_pkg命令,后面的依赖项一般有std_msgs,rospy,roscpp等等,当然也是可以修改的,在编译包之后出现的package.xml中可以修改。
// 创建包
$ cd ~/catkin_ws/src
$ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
创建包之后就可以写程序了,放在新生成的包中。
5*编译包
创建好包之后就该编译了,如果报错,大概率是环境变量设置有问题,可能是忘了source或者是由于多个工作空间造成的环境变量混乱(后文会讲到)。
// 创建包
$ cd ~/catkin_ws
$ catkin_make
创建多个工作空间
在学习ROS过程中常常会新建工作区来测试代码,由于ROS在不同工作空间下允许存在同名功能包,在使用roslaunch等命令的时候,常常会疑惑到底调用的是哪里的包。
这里有两种办法检查:
查看环境变量
$ echo $ROS_PACKAGE_PATH
使用roscd命令或rospack find
$ roscd <package_name>
$ rospack find <package_name>
通过测试,我们知道ROS是根据环境变量中的先后顺序查找功能包。
但是,在测试过程中我发现了问题
当我在~/.bashrc文件最后增加多个包的setup.sh地址,source后,环境变量并没有按照我预想的变化
比如我有catkin_ws和test_ws两个工作空间,在~/.bashrc后增加了两行:
$ source ~/catkin_ws/devel/setup.sh
$ source ~/test_ws/devel/setup.sh
source后查看环境变量,却并没有显示我增加的两行
查看了ROSwiki和很多博客,发现很多人都出现了这种情况1,比如
根据李太白lx的测试2
这种情况是由于两个工作空间中有同名的包导致的
在ROSwiki中有详细说明3,由于有同名的包,会出现工作区覆盖,造成环境变量意外的“混乱”。
根据ROSwiki上的说明,如果需要使用多个工作区,且多个工作区中有同名的包,建议在~/.bashrc文件去掉所有工作区的source并手动配置setup.sh。
为了安全起见,建议catkin_make前,仅保持一个活动的工作区,检查环境变量是否指向自己需要的那个包。
ps.测试时,我甚至出现过~/.bashrc文件中已清除所有ROS工作区相关环境变量信息,但在查看环境变量时仍出现的情况。当出现环境变量异常时,可以手动清理环境变量
$ unset $ROS_PACKAGE_PATH
这样,所有ROS包相关的环境变量都被清除