复现论文需要ubuntu+ros+turtlebot2+hokuyo的配置,这里有一个关于turtlebot的教程:
Learn TurtleBot and ROS
关于 turtlebot 的各种软件包,在这上面:
turtlebot · GitHub
以后可能能用上
然后对于 git clone 速度慢的问题,我全程都是用换镜像网站解决(参考 git clone一个github上的仓库,太慢,经常连接失败,但是github官网流畅访问,为什么? - 知乎):(c——China,npm——Node Package Manager,js——JavaScirpt,c+npm+js,org——organization 这样就很好记了)
#原地址
git clone https://github.com/kubernetes/kubernetes.git
#改为
git clone https://github.com.cnpmjs.org/kubernetes/kubernetes.git
#或者
git clone https://hub.fastgit.org/kubernetes/kubernetes.git
#或者
git clone https://gitclone.com/github.com/kubernetes/kubernetes.git
之前在教程上看到很多比较复杂的安装 cuda、cudnn 的过程,那其实是在主机上安装 cuDNN 、CUDA Toolkit ,而对于深度学习框架使用 GPU 的话,一般只需要在 pytorch 虚拟环境中安装对应版本的 cudatoolkit,cudnn 就可以了。
首先,主机上安装的 CUDA Toolkit 和虚拟环境中装的 cudatoolkit 区别可见此博文:
Pytorch 使用不同版本的 cuda - yhjoker - 博客园
以及这里:
conda安装的cudatoolkit, cudnn与在主机上安装的cuda, cudnn有何关系? - 知乎
下面这些网站都可以不怎么看了,关于pytorch和cuda的问题就看这一个很全:
python - Why `torch.cuda.is_available()` returns False even after installing pytorch with cuda? - Stack Overflow
然后在官网上找相应版本pytorch的命令就行,似乎不需要安装cudnn也行
Previous PyTorch Versions | PyTorch
以下橙字部分可暂时忽略:
然后,在虚拟环境中安装哪个 cudatoolkit 的版本可在官网去查
Previous PyTorch Versions | PyTorch
cudnn 的版本又由 cudatoolkit 的版本确定,可参看:
cuDNN Archive | NVIDIA Developer
对于 pytorch、cuda、nvidia 显卡 之间的各种对应关系可参看这篇博客,很全:
Linux下PyTorch、CUDA Toolkit 及显卡驱动版本对应关系(附详细安装步骤)_v-space的博客-CSDN博客_cuda和pytorch版本对应
至于安装,就只需要在进入虚拟环境后,来句
conda install cudatoolkit=x.x
conda install cudnn=x.x
就 OK 了!不过需要注意的是,OK的前提是cudnn和cudatoolkit版本匹配时,安装pytorch也不是cpuonly版本的,不然就总是用不了GPU。其实注意观察终端输出的信息,里面就有pytorch_cuda_cudnn版本匹配的提示,且可以有多种匹配组合
安装之前最好先把conda默认的软件源换成清华镜像,参考(注意,有些时候换了源仍然安装不了一些pkg,这时可以试试下载那个pkg的更低一点版本):
为Conda添加清华软件源 - 知乎
或
Conda安装pytorch等库时下载速度慢的解决方案(离线下载)_冬泉谷-CSDN博客_conda下载pytorch太慢
turtlebot2 的直接安装只支持到了 ubuntu 16.04 + ros kinetic,下次一定按照论文指定的版本下载,可以省去不少麻烦。搜了一大圈最终按此博客通过下载源码,实现在 melodic 上安装 turtlebot2:
Turtlebot入门教程-安装Turtlebot(ubuntu18.04+Melodic) - 创客智造
安装完没出现问题,但其实缺少一个create_description文件,是配置hokuyo激光雷达后,turtlebot_library.urdf.xacro中要依赖的,这个坑在配置完hokuyo激光雷达后会踩到。
当然,如果安装时遇到“E: 无法定位软件包”的问题,那么原因一般是没有添加ROS的软件源,或者添加了但已经过期了需要重新添加设置密钥,就参考这篇博客,重新添加一次就好了:
Ubuntu18.04+Ros Melodic安装及环境配置+Ros安装常见问题解决方法(亲测安装成功)_CH_monsy的博客-CSDN博客
接下来先配置 hokuyo 激光雷达,全程按此博客操作:
ROS-Melodic在Gazebo仿真环境为Turtlebot添加Hokuyo激光雷达并运行gmapping_qty2898734013的博客-CSDN博客
但有几步略有不同:
a. same
b. 与原文件不同就只是多了个.py,因此没改动
c. same
d. 3D sensor 部分去掉了 kinect ,其他保留
e. same
f. kinect 的部分在这里面倒是暂时没注释掉
g. same
h. same
i. same
接下来运行下面的命令来试一试前面所有操作有问题没:
roslaunch turtlebot_gazebo turtlebot_world.launch
结果缺少 create_description,这是个文件夹,本应该存在 turtlebot2 的工作空间的 src 文件夹中。但我一直找不到,后来发现在 https://github.com/turtlebot 上什么都有,终于找到了(其实还是先在google上用“ros create_description”搜到的,所以要经过初步分析后,用好关键搜索词才能更高效)。把这个 repository 下载到工作空间的 src 中后,这个坑终于爬出来了。
满怀希望的又一次运行:
roslaunch turtlebot_gazebo turtlebot_world.launch
结果报错:
Traceback (most recent call last):
File "/opt/ros/melodic/lib/gazebo_ros/spawn_model", line 239, in
exit_code = sm.run()
File "/opt/ros/melodic/lib/gazebo_ros/spawn_model", line 149, in run
xml_parsed = xml.etree.ElementTree.fromstring(model_xml)
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1311, in XML
parser.feed(text)
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1657, in feed
self._parser.Parse(data, 0)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 29312-29323: ordinal not in range(128)
[spawn_turtlebot_model-4] process has died [pid 29003, exit code 1, cmd /opt/ros/melodic/lib/gazebo_ros/spawn_model -unpause -urdf -param robot_description -model mobile_base __name:=spawn_turtlebot_model __log:=/home/toy/.ros/log/85ca07e2-421d-11ec-bac2-f077c340577c/spawn_turtlebot_model-4.log].
log file: /home/toy/.ros/log/85ca07e2-421d-11ec-bac2-f077c340577c/spawn_turtlebot_model-4*.log
就是在gazebo中无法生成机器人,我当时只看到红字部分一直没搞懂问题,后来终于在这篇博客上得到完美解决:
ROS中使用gazebo_ros的spawn_model时,显示[spawn_model-4] process has died_lzzzzzzm的博客-CSDN博客俄
而我是看到了红字上方的黑字后才发现我的问题跟这篇博客完全一样,才采用了此博客的方法,所以看报错信息也要看全哇。
当在gazebo中生成机器人,并需要指定所在 world 时:
roslaunch turtlebot_gazebo turtlebot_world.launch world_file:=/PATH
需要注意 /PATH 得是绝对的绝对路径!!!
如果是在home路径下,不要用“~”符号,老老实实地打/home/username/,用“~”就会无法加载出你想要的那个地图
在安装了 pytorch 的 conda 虚拟环境中,无法调用 ros 的 pakage ,也就是当我在虚拟环境中运行
python train_sddpg.py --cuda 1 --step 5
时,报错:
Traceback (most recent call last):
File "train_sddpg.py", line 1, in
import rospy
File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py", line 47, in
from std_msgs.msg import Header
File "/opt/ros/melodic/lib/python2.7/dist-packages/std_msgs/msg/__init__.py", line 1, in
from ._Bool import *
File "/opt/ros/melodic/lib/python2.7/dist-packages/std_msgs/msg/_Bool.py", line 6, in
import genpy
File "/opt/ros/melodic/lib/python2.7/dist-packages/genpy/__init__.py", line 34, in
from . message import Message, SerializationError, DeserializationError, MessageException, struct_I
File "/opt/ros/melodic/lib/python2.7/dist-packages/genpy/message.py", line 48, in
import yaml
ModuleNotFoundError: No module named 'yaml'
而在 python 2.7 的环境中运行 import rospy 就不会报错
解决方案:
在 pytorch 虚拟环境中安装 rospkg ,catkin-tools 两个包:
(pytorch)$ pip install catkin-tools
(pytorch)$ pip install rospkg
安装后,虚拟环境中就能正常 import ros 的包了,我也还不知道为什么
解决方法是 python 环境中添加 rospy 路径步骤,步骤:
(参考 为ROS配置Pycharm开发环境_Wentage_Tsai的博客-CSDN博客)
1、File->Settings->Project Interpreter->右边小齿轮Show All->选中正在使用的python
2、点击右边最下面的图标,打开Interpreter Path
3、添加/opt/ros/melodic/lib/python2.7/dist-packages
OK。对于此操作的原理,可以从这篇博客找到解释:
可以从命令行导入Python模块,但不能从PyCharm导入
因此,可以像在bashrc里添加路径一样,在pycharm中添加好依赖包所在的路径即可。
在经过一次 10h+ 的训练后,agent 的表现可以说是一团糟,只学会了向目标物靠近,遇到障碍物则直接撞上去,根本不会闪躲,拿作者提供的训练好的模型就更离谱了,每次只胡乱转一圈然后撞上障碍物就完事。每次测试都以撞上障碍物结束当然不会是巧合,大概率激光雷达出了问题,因此检测不到障碍物,把 subscriber 订阅到的激光雷达数据直接打印在终端会发现,激光雷达检测到的数据始终不会变化,那么原因何在?
实践后,证明原因在于在 gazebo 中使用的 hokuyo 激光雷达是 turtlebot2 工作空间中的,要想在训练算法中正常使用激光雷达,就需要在 gazebo 中使用 sddpg 的 ros 工作空间中的 hokuyo。
但运行程序时是运行的 turtlebot_lidar package 中的 turtlebot_world.launch 文件,为什么会跑去用 turtlebot2 工作空间中的 hokuyo 呢?
因为在运行 turtlebot_world.launch 时
step 1:turtlebot_world.launch 需要去 turtlebot_lidar 包里找到依赖文件 kobuki.launch.xml
step 2:kobuki.launch.xml 需要去 turtlebot_description 包里找到依赖文件 kobuki_hexagons_hokuyo.urdf.xacro
step 3:kobuki_hexagons_hokuyo.urdf.xacro 再接着去找依赖文件,最后会找到 turtlebot_gazebo.urdf.xacro 为止
问题就出在第二步,由于两个工作空间都有 turtlebot_description 包,ROS 系统在寻找 turtlebot_description 包时,就会遵循这样的机制:
(拍自《ROS机器人开发实践》)
因此,就需要保证在 ROS_PACKAGE_PATH 中,sddpg 工作空间的顺序是在 turtlebot 工作空间之前的。我目前的做法是在 ~/.bashrc 文件中,先 source turtlebot 的工作空间再 source sddpg 的工作空间,即这样的顺序:
source /home/toy/turtlebot2-on-melodic/turtlebot_ws/devel/setup.bash
source /home/toy/PycharmProjects/spiking-ddpg-mapless-navigation/ros/catkin_ws/devel/setup.bash
来保证 ROS_PACKAGE_PATH 的顺序符合我的需求。
turtlebot_gazebo.urdf.xacro 中配置了 hokuyo 运行时的参数,而两个 workspace 中的 hokuyo 参数是不一样的,可以将 sddpg 工作空间中的 hokuyo 设置为激光可视化,将 turtlebot 工作空间中的激光不可视,由此判断 turtlebot_world.launch 到底调用了哪个 hokuyo,每次运行 RL 算法前一定要确定是使用了正确工作空间(这次是 sddpg 工作空间)的 hokuyo,可通过在终端先输入:
echo $ROS_PACKAGE_PATH
来检查此终端中的环境变量 ROS_PACKAGE_PATH 里,各工作空间的顺序是否正确
2022.7.27:
上面这种改 ROS_PACKAGE_PATH 的方式不知道为何不管用了,有另一种更直接的方式。直接进入 ~/.bashrc 文件加上:
export ROS_PACKAGE_PATH=/home/toy/PycharmProjects/motion-target-mapless-navigation/ros/catkin_ws/src:/home/toy/turtlebot2-on-melodic/turtlebot_ws/src:/opt/ros/melodic/share
即可重置 ROS_PACKAGE_PATH 。
但此外,真正具体使用某个工作空间时,常常需要对该空间:
source devel/setup.bash
而在 source 之后,ROS_PACKAGE_PATH 就会只剩下该工作空间(如 /home/toy/A/src)和 ROS根目录了,假如我还需要从其他工作空间调包(如:/home/toy/B/src),那么就需要在 /home/toy/A/devel 中找到 _setup_util.py ,在这里:
if not args.local:
# environment at generation time
CMAKE_PREFIX_PATH = r'/opt/ros/melodic'.split(';')
else:
# don't consider any other prefix path than this one
CMAKE_PREFIX_PATH = []
加上 B 工作空间的路径,改成:
if not args.local:
# environment at generation time
CMAKE_PREFIX_PATH = r'/home/toy/B/devel;/opt/ros/melodic'.split(';')
else:
# don't consider any other prefix path than this one
CMAKE_PREFIX_PATH = []
两条路径之间用“ ; ”隔开,然后再在 A 工作空间重新:
source devel/setup.bash
这时 ROS_PACKAGE_PATH 就会是:
export ROS_PACKAGE_PATH=/home/toy/A/src:/home/toy/B/src:/opt/ros/melodic/share
还有一个需要注意的是,不同终端里的 ROS_PACKAGE_PATH 都会可能不尽相同
在运行强化学习算法的代码时,无法 import 自定义的 msg:
from simple_laserscan.msg import SimpleScan
ImportError: No module named simple_laserscan.msg
CMakelist.txt,Package.xml 这些文件都没问题,原因是出在了对 catkin_ws 进行 catkin_make 后,需要再在工作空间:
source devel/setup.bash