ROS安装可参考官方文档:
https://wiki.ros.org/melodic/Installation/Ubuntu
因为ros版本需要与Ubuntu的版本对应,如本机是Ubuntu 18.04需要安装Melodic,
Setup your computer to accept software from packages.ros.org.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt install ros-melodic-desktop-full
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
Up to now you have installed what you need to run the core ROS packages. To create and manage your own ROS workspaces, there are various tools and requirements that are distributed separately. For example, rosinstall is a frequently used command-line tool that enables you to easily download many source trees for ROS packages with one command.
To install this tool and other dependencies for building ROS packages, run:
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
Before you can use many ROS tools, you will need to initialize rosdep. rosdep enables you to easily install system dependencies for source you want to compile and is required to run some core components in ROS. If you have not yet installed rosdep, do so as follows.
sudo apt install python-rosdep
但是由于被墙,以下命令无法是使用
sudo rosdep init
rosdep update
解决方案参考
ROS安装过程中如何解决 rosdep update 命令出现错误 - 知乎
总结一下就是
- 改用手机热点(玄学无用,切勿当真)
- 改hosts文件附加 www.rawgithubusercontent.com 的IP地址(随着墙墙的壮大,能用的IP越来越少了)
- 用 .github 代替 .rawgithub(本质无差)
- 修改 TIMEOUT 值(此法治标不治本。它有点用,但不完全有用,建议还是使用下文的必杀招)
作者采用代理方法,如下:
1 打开包含资源下载函数的文件:
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
2. 添加代理:
url="https://ghproxy.com/"+url
下面是代码修改的位置
3. 修改/usr/lib/python2.7/dist-packages/rosdistro/__init__.py文件中的DEFAULT_INDEX_URL
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
DEFAULT_INDEX_URL = 'https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'
4. 修改其余(4个)文件中的地址,在地址 https://raw.githubusercontent.com/... 前添加https://ghproxy.com/
//行数不一定一一对应,以实际网址所在位置为准,基本上就在附近
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
//修改第36行的地址
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py 72行
//修改第72行
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
//修改第39行
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py
//修改第68行、119行
5. 解决 Hit 第五个地址的报错
$ sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
//在第204行添加如下代码(即在该函数块下的第一行处)
gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url
//注意,原网址中代理地址的双引号是中文,直接粘贴复制会报字符识别错误
6. 再次运行
sudo rosdep init
rosdep update
7.验证安装是否成功:
首先输入 roscore
。
然后再打开一个终端(快捷键: Ctrl+Shift+T ),输入 rosrun turtlesim turtlesim_node
。系统会弹出一个窗口,窗口的中间有一只海龟。
然后再打开一个终端(快捷键: Ctrl+Shift+T ),输入rosrun turtlesim turtle_teleop_key
。这时按照窗口中的提示就可以驱动小海龟进行运动了。
如果上述命令都可以运行,证明ROS已经安装成功啦。
1)打开终端,在根目录下创建文件夹catkin_ws
。
cd ~
mkdir catkin_ws
2) 进入catkin_ws
文件夹,并在里面建立新的src
文件夹。
cd catkin_ws
mkdir src
3)进入src
文件夹,并把当前文件夹初始化为workspace
属性的文件夹。
此时,如果/home/你的用户名/catkin_ws/src
文件夹下出现了CMakeLists
文件,说明工作空间生成成功。
4)接下来对工作空间进行编译,打开一个新终端,进入catkin_ws
文件夹。
cd catkin_ws
开始编译。
catkin_make
编译成功后/home/你的用户名/catkin_ws
下会出现devel
和build
文件。
5)产生install
文件夹。
catkin_make install
6)创建功能包。(功能包是存放源码的最小单元)
cd src
catkin_create_pkg test_pkg std_msgs rospy roscpp
此时会产生一个test_pkg
文件夹,这是安装包的名字。
● 然后对功能包进行编译。
cd catkin_ws
catkin_make
7)设置环境变量,打开一个新终端。
sudo gedit ~/.bashrc
● 在打开的.bashrc
文件的末尾加一行,保存后并退出
source ~/catkin_ws/devel/setup.bash
● 刷新一下环境变量。
cd catkin_ws
source devel/setup.bash
至此便完成了工作空间和功能包的创建,之后便可以在功能包中写程序并运行了。
(1)下载一个中科院软件所的仿真环境。
github网址:https://github.com/DroidAITech/ROS-Academy-for-Beginners
要是网速慢也可网盘自取
链接:https://pan.baidu.com/s/1B8NRfcKIysgkMhAlHDb6Ow
提取码:1017
在该软件包中,包含了以下功能包:
软件包 | 内容 |
---|---|
robot_sim_demo | 机器人仿真程序,大部分示例会用到这个软件包 |
topic_demo | topic通信,自定义msg,包括C++和python两个版本实现 |
service_demo | service通信,自定义srv,分别以C++和python两种语言实现 |
action_demo | action通信,自定义action,C++和python两种语言实现 |
param_demo | param操作,分别以C++和python两种语言实现 |
msgs_demo | 演示msg、srv、action文件的格式规范 |
tf_demo | tf相关API操作演示,tf示例包括C++和python两个版本 |
name_demo | 演示全局命名空间和局部命名空间下参数的提取 |
tf_follower | 制作mybot机器人 实现mybot跟随xbot的功能 |
urdf_demo | 创建机器人urdf模型,在RViz中显示 |
navigation_sim_demo | 导航演示工具包,包括AMCL, Odometry Navigation等演示 |
slam_sim_demo | 同步定位与建图演示,包括Gmapping, Karto, Hector等SLAM演示 |
ros_academy_for_beginners | Metapacakge示例,依赖了本仓库所有的pacakge |
robot_orbslam2_demo | ORB_SLAM2的演示 |
下载好后,将上述zip文件解压缩后放至/home/你的用户名/catkin_ws/src
文件目录下。
(2) 安装依赖项:(上文已经解决被墙的问题,否则此步会无法安装完所需的依赖)
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro=melodic -y
(3)检查gazebo
版本,该仿真环境要求gazebo
的版本在7.0以上。
gazebo -v
如果gazebo
版本低于7.0,则需要进行手动升级,依次执行如下命令即可。
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
sudo apt-get update
sudo apt-get install gazebo7
(4)编译工作空间。
cd ~/catkin_ws
catkin_make
刷新环境变量。
source ~/catkin_ws/devel/setup.bash
rospack profile
或
source ~/catkin_ws/devel/setup.bash (如果在~/.bashrc文件的末尾添加了source ~/catkin_ws/devel/setup.bash,则此步骤可以省略。)
先安装配置ORB-SLAM2
所必要的一些工具(已经安装的忽略)
sudo apt-get update
sudo apt-get install cmake gcc g++ git
(1)普通模式
● 运行如下命令,对其进行编译(注意在src文件夹中打开终端)
cd ORB_SLAM2
chmod +x build.sh
./build.sh
● 进行测试,验证是否安装成功。
下载数据集,Computer Vision Group - Dataset Download,下载第一个fr1/xyz即可。由于是国外数据集,需要挂梯子,否则下载很慢。也可自取,
链接:https://pan.baidu.com/s/1Li7ci0AkJzGWZspxQ19yvw
提取码:1017
下载好后,进入/home/你的用户名/catkin_ws/src/ORB_SLAM2文件夹创建一个文件夹:data,将下载好的数据集压缩包提取到data文件夹下面,然后在ORB_SLAM2文件夹下打开一个终端:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ./data/rgbd_dataset_freiburg1_xyz
可以跑通数据集,则证明安装成功。
(2)ROS模式
为了能够在线实时地运行ORB-SLAM2,需要借助ROS。SLAM在ROS下跑和非ROS下跑的区别:可以把ROS理解成在Linux系统下集成了许多好用的第三方和多进程编程的一个库集。在ROS下跑SLAM可以使用ROS的许多成熟的方法库。不在ROS下跑,很多进程间通信、同步、回调之类的就需要自己去设计。
● 将包含Examples/ROS/ORB_SLAM2的路径添加到ROS_PACKAGE_PATH环境变量中。打开.bashrc文件并在最后添加以下行。
● 将包含Examples/ROS/ORB_SLAM2
的路径添加到ROS_PACKAGE_PATH
环境变量中。打开.bashrc
文件并在最后添加以下行
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
保存后并退出,刷新环境变量。
source ~/.bashrc
● 此仿真环境下,发布的相机图像的话题为/camera/depth/image_raw和/camera/rgb/image_raw,所以我们slam接受话题的数据时名称要一致。打开/home/xxy/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ ros_rgbd.cc进行修改。位置大概在68行左右,修改成如下所示:
message_filters::Subscriber rgb_sub(nh, "/camera/rgb/image_raw", 1);
message_filters::Subscriber depth_sub(nh, "camera/depth/image_raw", 1);
● 编译ROS
下的ORB-SLAM2
在ORB_SLAM2
文件夹下打开终端:
chmod +x build_ros.sh
./build_ros.sh
这里编译的时候可能会有一些错误,如:
Building ROS nodes
./build_ros.sh: line 2: $'\r': command not found
./build_ros.sh: line 3: cd: $'Examples/ROS/ORB_SLAM2\r': No such file or directory
mkdir: cannot create directory ‘build\r’: File exists
这是由于文件格式不对导致,解决方案是
dos2unix build.sh
dos2unix build_ros.sh
详细的解释下文会有提及
如果出现:
/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/RGBD.dir/build.make:192: recipe for target '/home/ghj/ROS_SIM/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/RGBD' failed
locate寻找boost_system boost_filesystem ,找到boost_system.so和 boost_filesystem.so然后复制到orb-slam2的lib目录下
参考:
Undefined reference to symbol '_ZN5boost6system15system_categoryEv' · Issue #494 · raulmur/ORB_SLAM2 · GitHub
出现错误:
error: ‘usleep’ was not declared in this scope
usleep(mT*1000);
这个算是比较常见的问题了,解决方案是:
在以下文件中加入#include
src中
LocaMapping.cc
Tracking.cc
System.cc
LoopClosing.cc
Viewer.ccExamples/Monocular中
mono_euroc.cc
mono_kitti.cc
mono_tum.ccExamples/RGB-D中
rgbd_tum.cc/Examples/Stereo中
stereo_kitti.cc
stereo_euroc.ccExamples/ROS/ORB_SLAM2/src/AR
ViewerAR.cc
运行仿真时,建议关闭虚拟机的加速3D图形,否则运行会卡顿。
(1)roscore
是节点和程序的集合,这些节点和程序是基于ROS
的系统所必需的。运行roscore
,使ROS
节点建立通信。
打开一个新终端,输入:
roscore
(2)打开仿真环境。打开一个新终端,输入:
roslaunch robot_sim_demo robot_spawn.launch
可能会出现
roslaunch: command not found
此时需要安装
sudo apt-get install rosbash
然后再运行
roslaunch robot_sim_demo robot_spawn.launch
这里可能存在一个问题,有些版本的ROS可能出现
Warning [parser.cc:950] XML Element[mu], child of element[link] not defined in SDF. Ignoring[mu]. You may have an incorrect SDF file, or an sdformat version that doesn't support this element.
Warning [parser.cc:950] XML Element[mu], child of element[link] not defined in SDF. Ignoring[mu]. You may have an incorrect SDF file, or an sdformat version that doesn't support this element.
Warning [parser.cc:950] XML Element[mu], child of element[link] not defined in SDF. Ignoring[mu]. You may have an incorrect SDF file, or an sdformat version that doesn't support this element.
Warning [parser.cc:950] XML Element[mu], child of element[link] not defined in SDF. Ignoring[mu]. You may have an incorrect SDF file, or an sdformat version that doesn't support this element.
Warning [parser.cc:950] XML Element[mu], child of element[link] not defined in SDF. Ignoring[mu]. You may have an incorrect SDF file, or an sdformat version that doesn't support this element.
导致界面没有模型,解决的方案有两种,一是更改sdf文件的格式,还有一种比较彻底的方法是换ROS版本(这个是melodic,kinetic需要切换分支)
GitHub - DroidAITech/ROS-Academy-for-Beginners at melodic
(3)运行键盘控制节点。打开另一个终端,输入:
rosrun robot_sim_demo robot_keyboard_teleop.py
通过i,j,k等控制小车移动,q/z加减速等。
此时出现 /usr/bin/env: ‘python\r’: No such file or directory
大致是由于这个python文件是在windows上写的,然后我在ubuntu上run就出现这个问题,主要是换行符导致的。
在windows下,用两个连续的符号进行换行: ‘\r’和’\n’ ,其中 ‘\r’为回车符,’\n’为换行符
在ubuntu下,用一个符号进行换行:’\n’
所以直接使用这种在windows上写的python代码就会出问题,而且这些符号是隐藏的,想查看,还要打开显示选项,并且每一行都有,改起来相当费劲。
解决方案是安装一个工具:
先下载,然后对需要调整格式的python文件使用就可以了,如下:
sudo apt-get install dos2unix
dos2unix abc.py(如上文提到的./src/ROS-Academy-for-Beginners/robot_sim_demo/scripts/robot_keyboard_teleop.py)
然后再rosrun这个python文件就不会报错了! 非常好用,亲测可行。
(4)运行orbslam2,打开一个新终端,输入:
这里需要注意的是我们需要用到ROS文件里面的相机参数文件Zdzn.yaml而不是ORB文件里面的相机参数。
rosrun ORB_SLAM2 RGBD /home/ghj/ROS_SIM/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/ghj/ROS_SIM/src/ROS-Academy-for-Beginners-melodic/orbslam2_demo/param/Zdzn.yaml
此时通过按键控制机器人移动,即可进行定位与建图工作!
总结,需要四个命令,四个窗口:
roscore
roslaunch robot_sim_demo robot_spawn.launchrosrun robot_sim_demo robot_keyboard_teleop.py
rosrun ORB_SLAM2 RGBD /home/ghj/ROS_SIM/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/ghj/ROS_SIM/src/ROS-Academy-for-Beginners-melodic/orbslam2_demo/param/Zdzn.yaml
非正常退出gazebo,运行roslaunch robot_sim_demo robot_spawn.launch会出现
运行roslaunch gazebo_ros empty_world.launch指令,出现process has died的报错[gazebo-1] process has died [pid 397, exit code 255, cmd /opt/ros/melodic/lib/gazebo_ros/gzserver -e ode worlds/empty.world __name:=gazebo __log:=/home/jiqiang/.ros/log/366747d8-0841-11ed-adde-1c1bb54aa7d6/gazebo-1.log].
log file: /home/zgjldx/.ros/log/366747d8-0841-11ed-adde-1c1bb54aa7d6/gazebo-1*.log
解决方法是杀掉对应的进程
killall gzserver
killall gzclient
再运行roslauch即可
rosrun robot_sim_demo robot_keyboard_teleop.py
此外
rostopic list
可以查看查看机器人发布的所有的话题,其中/camera/depth/image_raw和/camera/rgb/image_raw即为深度和rab的图像话题。(与我们上文改的一致)
rosrun image_view image_view image:=/camera/depth/image_raw
rosrun image_view image_view image:=/camera/rgb/image_raw
上述两个命令可以查询机器人所采集到的图像:
下图是orbslam程序运行的日志
场景地图
实时帧图
其中SLAM_MODE表示当前模式,KFs:1表示地图中总关键帧总数为1,MPs:1006表示地图中的地图点总数为1006,Matches:807表示成功陪陪的特征点总数为807
生成的轨迹图(蓝色表示关键帧,红色代表参考地图点,其实就是tracking里面的local mappoints,黑色点表示所有地图点,红色点属于黑色点的一部分,绿色的线表示共视关系)
链接:https://pan.baidu.com/s/1khI-JtKhf7ZASvp9_0PY5w
提取码:xew2