昨日在ROS学习过程,在第一章安装ROS-Academy-for-Beginners这一步便遇到了一个棘手的问题。本篇日志记录遇到的问题、相应的解决的方法以及一些感悟。
问题描述
在创建好该项目的工作空间,克隆该项目后,在安装依赖这一步遇到了问题。
输入:
lz@lz-virtual-machine:~/test1$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic
输出:
lz@lz-virtual-machine:~/test1$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
robot_sim_demo: Cannot locate rosdep definition for [yocs_cmd_vel_mux]
navigation_sim_demo: Cannot locate rosdep definition for [joint_state_controller]
slam_sim_demo: Cannot locate rosdep definition for [joint_state_controller]
解决过程
Step1. 方法一:网上方法,无法解决。
搜索网上的一些解决办法,问题仍然无法解决
lz@lz-virtual-machine:~/test1$ rosdep install --from-paths ~/catkin_ws/src/ROS-Academy-for-Beginners --ignore-src
还尝试了其他命令,仍然提示cannot locate rosdep definition for [xxxxxx]
因此放弃该方法,使用其他方法。
Step2: 方法二:使用git clone下载源码
该方法是没有必要并且非常复杂的方法。当时用了一下午的时间手动克隆项目的依赖包的源代码包,由于依赖包的源码非常多,当时在对依赖包编译的过程中,出现了一些报错,报错内容如下:
可见错误提示是一些有关语法和编译器的错误。出现这些问题的原因就是此时编译要从这些庞大的依赖包源码进行编译,此时的问题就变得非常复杂了,因为你得知道这些源码包是使用了什么版本的编译器进行的编译,此时就需要对编译环境进行针对性的设置,问题将变得令人头疼。
Step3:方法三:用apt-install方法安装依赖包
先使用catkin_make指令编译一下源码包,看缺少什么依赖项
-- +++ processing catkin package: 'msgs_demo'
-- ==> add_subdirectory(ROS-Academy-for-Beginners/msgs_demo)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- Generating .msg files for action msgs_demo/AutoDocking /home/lz/test1/src/ROS-Academy-for-Beginners/msgs_demo/action/AutoDocking.action
-- Generating .msg files for action msgs_demo/AddTwoInts /home/lz/test1/src/ROS-Academy-for-Beginners/msgs_demo/action/AddTwoInts.action
-- Generating .msg files for action msgs_demo/GetMap /home/lz/test1/src/ROS-Academy-for-Beginners/msgs_demo/action/GetMap.action
-- Generating .msg files for action msgs_demo/MoveBase /home/lz/test1/src/ROS-Academy-for-Beginners/msgs_demo/action/MoveBase.action
-- msgs_demo: 42 messages, 9 services
-- +++ processing catkin package: 'navigation_sim_demo'
-- ==> add_subdirectory(ROS-Academy-for-Beginners/navigation_sim_demo)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
CMake Warning at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package):
Could not find a package configuration file provided by "gmapping" with any
of the following names:
gmappingConfig.cmake
gmapping-config.cmake
Add the installation prefix of "gmapping" to CMAKE_PREFIX_PATH or set
"gmapping_DIR" to a directory containing one of the above files. If
"gmapping" provides a separate development package or SDK, be sure it has
been installed.
Call Stack (most recent call first):
ROS-Academy-for-Beginners/navigation_sim_demo/CMakeLists.txt:3 (find_package)
-- Could not find the required component 'gmapping'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
可以看到,编译器提示缺少gmapping依赖包,同时可以看到编译到navigation_sim_demo软件包时,出现了缺少依赖包的问题。
可以打开navigation_sim_demo软件包,打开Cmakelist.txt,看该项目的依赖项。
> find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
controller_manager
gazebo_ros
move_base
map_server
amcl
gmapping
dwa_local_planner
)
命令行输入以下shell指令
sudo apt-get install ros-kinetic-gmapping
catkin_make
sudo apt-get install ros-kinetic-slam-karto
catkin_make
使用apt-get install的好处在于 使用apt-get 安装程序X时,apt会自动寻找当前安装文件的依赖项A,B,然后先去安装A和B,再安装X。如果在安装A时,又遇到缺少它的依赖项Aa,Bb的情况,则先去安装他们以此类推。用户不需要解决复杂的依赖嵌套问题,由软件完成。但应注意,使用此方法下载的是二进制包