1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 深度学习框架(Pytorch)+ 机器人(ROS):ROS melodic 上安装 Turtlebot2 —>

深度学习框架(Pytorch)+ 机器人(ROS):ROS melodic 上安装 Turtlebot2 —>

时间:2019-01-25 02:39:25

相关推荐

深度学习框架(Pytorch)+ 机器人(ROS):ROS melodic 上安装 Turtlebot2 —>

复现论文需要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 /kubernetes/kubernetes.git#改为git clone /kubernetes/kubernetes.git#或者git clone /kubernetes/kubernetes.git#或者git clone //kubernetes/kubernetes.git

坑一:cuda 与 cudnn 的安装

之前在教程上看到很多比较复杂的安装 cuda、cudnn 的过程,那其实是在主机上安装 cuDNN 、CUDA Toolkit ,而对于深度学习框架使用 GPU 的话,一般只需要在 pytorch 虚拟环境中安装对应版本的 cudatoolkit,cudnn 就可以了。

首先,主机上安装的 CUDA Toolkit 和虚拟环境中装的 cudatoolkit 区别可见此博文:

Pytorch 使用不同版本的 cuda - yhjoker - 博客园

以及这里:

conda安装的cudatoolkit, cudnn与在主机上安装的cuda, cudnn有何关系? - 知乎

然后,在虚拟环境中安装哪个 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.xconda install cudnn=x.x

就 OK 了!不过需要注意的是,OK的前提是cudnn和cudatoolkit版本匹配时,安装pytorch也不是cpuonly版本的,不然就总是用不了GPU。其实注意观察终端输出的信息,里面就有pytorch_cuda_cudnn版本匹配的提示,且可以有多种匹配组合

安装之前最好先把conda默认的软件源换成清华镜像,参考(注意,有些时候换了源仍然安装不了一些pkg,这时可以试试下载那个pkg的更低一点版本):

为Conda添加清华软件源 - 知乎

Conda安装pytorch等库时下载速度慢的解决方案(离线下载)_冬泉谷-CSDN博客_conda下载pytorch太慢

坑二:turtlebot2 暂不支持在 melodic 上直接安装

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

坑三:缺少 create_description

接下来运行下面的命令来试一试前面所有操作有问题没:

roslaunch turtlebot_gazebo turtlebot_world.launch

结果缺少 create_description,这是个文件夹,本应该存在 turtlebot2 的工作空间的 src 文件夹中。但我一直找不到,后来发现在/turtlebot 上什么都有,终于找到了(其实还是先在google上用“ros create_description”搜到的,所以要经过初步分析后,用好关键搜索词才能更高效)。把这个 repository 下载到工作空间的 src 中后,这个坑终于爬出来了。

坑四:python2 到 python3的编码问题

满怀希望的又一次运行:

roslaunch turtlebot_gazebo turtlebot_world.launch

结果报错:

Traceback (most recent call last):

File "/opt/ros/melodic/lib/gazebo_ros/spawn_model", line 239, in <module>

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_file的细节坑

当在gazebo中生成机器人,并需要指定所在 world 时:

roslaunch turtlebot_gazebo turtlebot_world.launch world_file:=/PATH

需要注意 /PATH 得是绝对的绝对路径!!!

如果是在home路径下,不要用“~”符号,老老实实地打/home/username/,用“~”就会无法加载出你想要的那个地图

坑六:在 DL(pytorch,tf)环境中运行 ROS

在安装了 pytorch 的 conda 虚拟环境中,无法调用 ros 的 pakage ,也就是当我在虚拟环境中运行

python train_sddpg.py --cuda 1 --step 5

时,报错:

Traceback (most recent call last):

File "train_sddpg.py", line 1, in <module>

import rospy

File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py", line 47, in <module>

from std_msgs.msg import Header

File "/opt/ros/melodic/lib/python2.7/dist-packages/std_msgs/msg/__init__.py", line 1, in <module>

from ._Bool import *

File "/opt/ros/melodic/lib/python2.7/dist-packages/std_msgs/msg/_Bool.py", line 6, in <module>

import genpy

File "/opt/ros/melodic/lib/python2.7/dist-packages/genpy/__init__.py", line 34, in <module>

from . message import Message, SerializationError, DeserializationError, MessageException, struct_I

File "/opt/ros/melodic/lib/python2.7/dist-packages/genpy/message.py", line 48, in <module>

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 的包了,我也还不知道为什么

坑七:Terminal 中能调用 rospy,但 pycharm 无法导入 rospy

解决方法是 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中添加好依赖包所在的路径即可。

坑八:在运行算法时,turtlebot 激光雷达检测不到障碍物

在经过一次 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.bashsource /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 里,各工作空间的顺序是否正确

.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 timeCMAKE_PREFIX_PATH = r'/opt/ros/melodic'.split(';')else:# don't consider any other prefix path than this oneCMAKE_PREFIX_PATH = []

加上 B 工作空间的路径,改成:

if not args.local:# environment at generation timeCMAKE_PREFIX_PATH = r'/home/toy/B/devel;/opt/ros/melodic'.split(';')else:# don't consider any other prefix path than this oneCMAKE_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 数据类型

在运行强化学习算法的代码时,无法 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

深度学习框架(Pytorch)+ 机器人(ROS):ROS melodic 上安装 Turtlebot2 —> 安装 hokuyo 激光雷达 —> Python 3 的虚拟环境中调用 ROS 填坑记录

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。