一、问题:
安装完ros后,需要执行sudo rosdep init
,但是在没有全局科学上网的前提下,执行sudo rosdep init
势必会报错:
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
导致无法进行下一步rosdep update
,其他改试图对墙做事情的方法时效性差,而且往往都是玄学。。。
二、方案(适用于: kinetic, melodic, noetic):
1.新建脚本文件set_rosdep.sh
包含以下内容
#! /usr/bin/env bash
L_USER=${USER}
if [ ${#} -ne 0 ]; then
echo -e "\nUsage: \033[1;31mbash ${0}\033[0m\n" ; exit 1
fi
function for_kinetic() {
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/kinetic\/rosdistro/g' /opt/ros/kinetic/rosdistro/rosdep/sources.list.d/20-default.list
sudo cp /opt/ros/kinetic/rosdistro/rosdep/sources.list.d/20-default.list /etc/ros/rosdep/sources.list.d/
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/kinetic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/kinetic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/kinetic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
sudo sed -i "s/https:\/\/raw.githubusercontent.com\/ros\/rosdistro/file:\/\/\/opt\/ros\/kinetic\/rosdistro/g" /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
sudo sed -i "s/master\/releases\/fuerte.yaml/releases\/fuerte.yaml/g" /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
}
function for_melodic() {
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/melodic\/rosdistro/g' /opt/ros/melodic/rosdistro/rosdep/sources.list.d/20-default.list
sudo cp /opt/ros/melodic/rosdistro/rosdep/sources.list.d/20-default.list /etc/ros/rosdep/sources.list.d/
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/melodic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/melodic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/melodic\/rosdistro/g' /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
sudo sed -i "s/https:\/\/raw.githubusercontent.com\/ros\/rosdistro/file:\/\/\/opt\/ros\/melodic\/rosdistro/g" /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
sudo sed -i "s/master\/releases\/fuerte.yaml/releases\/fuerte.yaml/g" /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
}
function for_noetic() {
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /opt/ros/noetic/rosdistro/rosdep/sources.list.d/20-default.list
sudo cp /opt/ros/noetic/rosdistro/rosdep/sources.list.d/20-default.list /etc/ros/rosdep/sources.list.d/
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdep2/sources_list.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdistro/__init__.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdep2/rep3.py
sudo sed -i "s/https:\/\/raw.githubusercontent.com\/ros\/rosdistro/file:\/\/\/opt\/ros\/noetic\/rosdistro/g" /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
sudo sed -i "s/master\/releases\/fuerte.yaml/releases\/fuerte.yaml/g" /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
}
if [ -d "/etc/ros/rosdep/sources.list.d" ] ; then
echo -e "exist /etc/ros/rosdep/sources.list.d !"
else
sudo mkdir "/etc/ros/rosdep/sources.list.d" -p
fi
if [ -d "/opt/ros/kinetic" ] ; then
echo -e "\n\033[1;32m>>> ROS:kinetic + PYTHON:python2.7 <<<\033[0m\n"
if [ -d "/opt/ros/kinetic/rosdistro" ] ; then sudo rm -rf /opt/ros/kinetic/rosdistro ; fi
sudo git clone https://gitee.com/ohhuo/rosdistro.git /opt/ros/kinetic/rosdistro
if [ ${?} -ne 0 ]; then
echo -e "\033[0;33m\nWORNING: git clone from gitee failed !\033[1m" ;
sudo git clone https://github.com/ros/rosdistro.git /opt/ros/kinetic/rosdistro ;
if [ ${?} -ne 0 ]; then echo -e "\033[0;31m\nERROR: git clone from github and gitee failed !\033[1m" ; exit 1 ; fi
fi
for_kinetic
elif [ -d "/opt/ros/melodic" ] ; then
echo -e "\n\033[1;32m>>> ROS:melodic + PYTHON:python2.7 <<<\033[0m\n"
if [ -d "/opt/ros/melodic/rosdistro" ] ; then sudo rm -rf /opt/ros/melodic/rosdistro ; fi
sudo git clone https://gitee.com/ohhuo/rosdistro.git /opt/ros/melodic/rosdistro
if [ ${?} -ne 0 ]; then
echo -e "\033[0;33m\nWORNING: git clone from gitee failed !\033[1m" ;
sudo git clone https://github.com/ros/rosdistro.git /opt/ros/melodic/rosdistro ;
if [ ${?} -ne 0 ]; then echo -e "\033[0;31m\nERROR: git clone from github and gitee failed !\033[1m" ; exit 1 ; fi
fi
for_melodic
elif [ -d "/opt/ros/noetic" ] ; then
echo -e "\n\033[1;32m>>> ROS:noetic + PYTHON:python3 <<<\033[0m\n"
if [ -d "/opt/ros/noetic/rosdistro" ] ; then sudo rm -rf /opt/ros/noetic/rosdistro ; fi
sudo git clone https://gitee.com/ohhuo/rosdistro.git /opt/ros/noetic/rosdistro
if [ ${?} -ne 0 ]; then
echo -e "\033[0;33m\nWORNING: git clone from gitee failed !\033[1m" ;
sudo git clone https://github.com/ros/rosdistro.git /opt/ros/noetic/rosdistro ;
if [ ${?} -ne 0 ]; then echo -e "\033[0;31m\nERROR: git clone from github and gitee failed !\033[1m" ; exit 1 ; fi
fi
for_noetic
else
echo -e "\n\033[1;31mERROR: ROS does not exist !\033[0m\n" ; exit 1
fi
sudo rosdep init
sudo -u ${L_USER} rosdep update
if [ ${?} -eq 0 ]; then
echo -e "\n\033[1;32m>>> Successfully execute [rosdep init] & [rosdep update] <<< \033[0m\n~by streamwill" ; exit 0
else
echo -e "\033[0;31m\nFailed to execute [rosdep init] & [rosdep update] !\033[1m" ; exit 1
fi
2.运行脚本set_rosdep.sh
bash set_rosdep.sh
NOTE:
- 确保电脑联网,且已经安装git,或者执行
sudo apt install git
安装;- 适配ROS版本: kinetic , melodic , noetic,脚本自动选择,无需手动处理;
- 程序运行期间需要输入root密码;
- 如果从github上clone多次总是失败,可以更换脚本中的clone源为:
https://gitee.com/ohhuo/rosdistro.git
。
3.完成init
和update
😃 一行命令,直接运行,简单快捷 😃
三、以下为针对20.04和noetic的详细步骤,可以跳过
1. 下载rosdistro
到本地
- 下载方式1: 度娘rosdistro,取货码: jhkn
- 下载方式2:
git clone https://github.com/ros/rosdistro.git
- 必须保证文件夹名为
rosdistro
,且必须在当前用户目录下,即~
,形如~/rosdistro
。(只为保证后续直接复制命令执行)
2. 复制rosdistro
文件夹到ros安装路径
- 复制文件夹
rosdistro/
到路径/opt/ros/noetic
:
sudo cp ~/rosdistro/ /opt/ros/noetic/ -r
3.修改20-default.list
文件
- 修改
/opt/ros/noetic/rosdistro/rosdep/sources.list.d/20-default.list
文件
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /opt/ros/noetic/rosdistro/rosdep/sources.list.d/20-default.list
4. 修改四个.py
文件
- 文件一:
/usr/lib/python3/dist-packages/rosdep2/sources_list.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdep2/sources_list.py
- 文件二:
/usr/lib/python3/dist-packages/rosdistro/__init__.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdistro/__init__.py
- 文件三:
/usr/lib/python3/dist-packages/rosdep2/rep3.py
sudo sed -i 's/https:\/\/raw.githubusercontent.com\/ros\/rosdistro\/master/file:\/\/\/opt\/ros\/noetic\/rosdistro/g' /usr/lib/python3/dist-packages/rosdep2/rep3.py
- 文件四:
/usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
sudo sed -i "s/https:\/\/raw.githubusercontent.com\/ros\/rosdistro/file:\/\/\/opt\/ros\/noetic\/rosdistro/g" /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
sudo sed -i "s/master\/releases\/fuerte.yaml/releases\/fuerte.yaml/g" /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
5.终端执行命令进行初始化和更新
sudo rosdep init
rosdep update
Successfully executed ‘rosdep update’
REF
[1].Ubuntu20.04 rosdep update失败解决方法
[2].rosdep update失败的解决方法