ubunt20.04/ubuntu18.04+ros+uuv_simulator


一、问题导入

1. 问题阐述

       假期离校之前,在使用uuv_simulator进行多机器人仿真的时候,发现三台rov有时候只能启动两台,有时候能启动三台,当时认为是机器性能的原因。回校之后,对ros服务器进行了全方位的升级,本以为会十分流畅的进行仿真,但每次却只能启动两台,且无法启动的那台是随机的。查询tf树发现,无法启动的那台rov,没有挂到世界坐标系下。查看挂tf树的代码发现,该节点通过订阅gazebo反馈的odom话题进行坐标转换从而将rov挂到世界坐标系,而没有启动的那台rovodom话题没有收到来自gazebo的数据。因为对旧服务器数据是直接进行拷贝的,所以理论上是不会有任何问题的,但为了排除一些因素,选择了对ubuntu系统重装。

2. 本文内容

       本文会我以解决此问题的思路展开,当看到这篇文章时,可能会觉得完全没必要进行中间的很多步骤,但在解决问题的当下,并不能一下就找到问题的关键。本文涉及到Ubuntu20.04Ubuntu18.04安装rosuuv_simulator的流程,以及对流程的步骤和一些问题的探索,也算是对网上资料的一些整理。


二、Ubuntu20.04+ros+uuv_simulator

       因为最开始接触ubuntu的时候就是接触的20.04,所以在之前安装ros的时候选择的是ubuntu20.04下的ros-noetic,即使uuv_simulator是在ros-melodic基础上写的且安装更为简单,见下表。所以这次选择重装的时候,也是毫无疑问走之前的路选择了ubuntu20.04。

UbuntuROSUUV_SIMULATOR
18.04melodicapt 安装编译安装
20.04noetic编译安装

1. 安装ros前准备

1.1 ubuntu系统的安装

       ubuntu系统有两种安装方式,一是可以在windows系统下通过VMware新建虚拟机,然后通过镜像在虚拟机安装ubuntu系统,二是通过制作U盘引导盘,在物理机安装ubuntu系统。

方式一:https://blog.csdn.net/weixin_48657700/article/details/106818566
       
方式二:https://blog.csdn.net/qq_51491920/article/details/123668279
       
ubuntu镜像下载:https://cn.ubuntu.com/download/alternative-downloads

1.2 ubuntu显卡驱动的安装

       因为uuv_simulator仿真需要渲染图像,因此ros服务器最好有一块独立显卡,也就需要安装对应显卡驱动,参考链接:ubuntu安装显卡驱动

2. 安装ros

       接下来就是安装ros了,首先附上官网链接:http://wiki.ros.org/noetic/Installation/Ubuntu。按照官网第一步,配置ubuntu仓库,因为安装的是有图形化界面的ubuntu系统,所以只需要点开software,然后打上四个√即可。

2.1 添加ros源

       这一步就是为了告诉apt去哪安装ros这个软件包。在ubuntu20.04,通过在/etc/apt/sources.list.d文件夹下添加*.list文件来添加源,下面这条命令就是做这件事。

sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/ros.gpg] http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

2.2 添加GPG Key

       软件作者在软件发布时,Release 页面通常会同时提供程序文件和签名文件。通常,签名文件是软件作者使用私钥对软件的摘要(digest)进行签名而得来。我们可以在拿到作者的公钥后对签名进行验证。如果验证失败,那么说明下载的软件已经被篡改。这种情况通常发生在有恶意的人下载作者的软件之后,修改软件注入木马,然后重新发布到假的镜像站点;如果你从镜像站点下载了软件却没有对其签名进行验证,使用这种软件就会存在风险。(引用自https://zhuanlan.zhihu.com/p/481900853
       所以在添加源之后,我们还要添加GPG Key来对软件包进行验证以保证软件包的安全性。下面是这两条命令则是添加GPG Key。

sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | gpg --dearmor | sudo tee /usr/share/keyrings/ros.gpg

Note:在对应官网链接的时候,你可能已经注意到了2.1和2.2的两条命令与官网上描述的并不完全相同,这是因为官网上给出的命令在ubuntu20.04已经过时了,不过继续使用也不会有问题,但在之后的版本可能会弃用。贴上相关链接:https://itsfoss.com/apt-key-deprecated/
Note:curl进行下载的时候可能会因为国内地址的原因,导致很难访问raw.githubusercontent.com
解决措施一:通过解析github的域名和缓存DNS解析方法解决,但常常因为github变动ip地址导致失败,参考链接:https://www.cnblogs.com/dechinphy/p/git-access.html
解决措施二:直接翻墙,一劳永逸,之后也会有步骤需要。参考链接:https://zhuanlan.zhihu.com/p/613337016。如果你在其他机器上可以访问raw.githubusercontent.com完全可以在别的机器上进入上述网页复制内容到文件在传给ubuntu。

2.3 安装ros

       配置源和key之后,更新之后即可安装ros了。建议按照如下命令安装ros-noetic-desktop-full因为这样会直接安装与ros对应版本的gazebo。

sudo apt update
sudo apt install ros-noetic-desktop-full

2.4 ros初始化

       首先将初始化ros环境变量的脚本写入.bashrc文件中,命令如下。

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

       安装管理ros工作空间的一些工具及依赖,命令如下。

sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

       使用ros工具前运行如下命令。

sudo rosdep init
rosdep update

Note:rosdep init 运行的时候可能出现错误,原因也是因为rosdep中有很多网址都是github,问题与上面是一样的。解决方法一是翻墙就不多说了,二是安装rosdepc,只是将rosdep中的github地址都换成了国人可以访问到的地址。参考链接:https://mp.weixin.qq.com/s/VGs8oWdhHH6XsHcx21lN4Q

2.5 ros 验证

       到目前为止,ros就安装完成了,可以随便运行个小乌龟啥的进行一下测试,至于类似教程网上太多了,就不贴了。

3. 编译安装uuv_simulator

       之后就是安装uuv_simulator这个ros包了,在ros-noetic上,只能通过编译安装的方式。首先创建工作空间,如下。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

       src文件夹是存放编译源码的文件夹,可以直接将uuv_simulator的源码下载到src,github上已经有修改好的适配ros-noetic的代码,参考链接:https://github.com/arturmiller/uuv_simulator/tree/noetic,下载之后进行编译如下。

cd ~/catkin_ws
catkin_make

Note:编译时内存不足,可能会导致卡死,可以将export ROS_PARALLEL_JOBS=-jn写入.bashrc文件中,用来编译时的逻辑线程数,n为线程数。

       等待编译完成,将环境变量写入.bashrc,之后按照参考链接:https://www.guyuehome.com/7915进行测试。

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source .bashrc

4.此时发生的问题

       已经成功安装好uuv_simulator了,测试也都没有什么问题,但启动之前的三个rov进行仿真的时候还是出现了和之前一样的问题。此时怀疑是更换机器硬件的问题,旧服务器是intel的cpu,而更换这台服务器cpu是amd的。所以决定在intel的笔记本上用虚拟机在重复一遍上述过程,结果还是一样失败了。在最初学习ros时,曾经在笔记本上用虚拟机搭过uuv_simulator,没有遇到问题,再加上发现了apt仓库中的ros在今年2月底的时候更新了一个版本,于是得出了ros版本更新之后导致对uuv_simulator支持出现了问题的结论。因为出问题的是gazebo发布的话题没有数据,尝试更换gazebo的版本。

升级gazebo版本:https://zhuanlan.zhihu.com/p/526057704
       
编译gazebo指定版本:官方链接网上参考链接、还需要编译一个gazebo和ros相连的包,参考链接:https://www.codenong.com/cs106039404/

       成功更换版本后,问题仍然存在,此时决定更换ros版本,按照ros官网的方法编译源码,官网链接。因为之前挂了代理,整个过程中(安装ros管理工具、安装编译工具、用ros管理工具下载源码、用ros管理工具下载依赖、编译)没有遇到什么问题,但ros管理工具会下载最新的源码及依赖,也就是编译安装到的并不是想要版本的ros,而更改版本还要对应更改依赖,整个过程过于繁琐,最终决定换成ros-melodic。


三、Ubuntu18.04+ros+uuv_simulator

       ubuntu18.04安装流程和ubuntu20.04基本没有什么不同,唯一区别是可以通过如下命令安装uuv_simulator。

sudo apt install ros-melodic-uuv-simulator

       当然按照上述编译安装也可以,为了方便源码的管理,我还是选择了编译安装。唯一出现的问题是gazebo常常启动不了,报错:gazebo: symbol lookup error:/usr/lib/x86_64-linux-gnu/libgazebo_common.so.9: undefined symbol: _ZN8ignition10fuel_tools12ClientConfig12SetUserAgentERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE。原因是ignition-math库太老了,需要更新。

sudo apt upgrade libignition-math2

       安装完之后进行测试,之前的问题仍然存在,这次尝试已经足够排除版本更新产生的问题了,思路一下停滞了。在某天在笔记本上再次运行虚拟机的时候突然意识到成功运行uuv_simulator的虚拟机和现在不能成功运行uuv_simulator的虚拟机的差别,之前的虚拟机我给分了四个核,而这次分了八个核。尝试将这次八个核转换为四个核,突然成功运行3个rov,进行了多次尝试发现都能成功运行。


四、问题解决

       根据上述现象进行分析,怀疑可能是八个核导致进程并行运行的时候,本应该在后面运行的进程跑到前面去了,从而出现问题。尝试将rov启动文件按顺序进行分割,先启动世界模型文件,之后一个个启动三台rov,结果显示这种方式甚至只能启动一个rov。想到官网文件也提到类似过程,然后进行对比终于发现了问题。我的启动文件和官网的启动方式,唯一不同的是我使用的是world_ned坐标系,而官网案例默认的是world坐标系,我将启动文件中的参考坐标系换成world,成功启动了三个rov。我使用world_ned作为关键词在github上搜索,发现了其他遇到这种问题的。参考链接1参考链接2。他们都提到了这个问题,但解决措施只是不使用world_ned坐标系,我认为发生这个问题的原因可能是gazebo本身对uuv_simulator提供的这个world_ned坐标系支持不好,导致进程顺序出现了问题。


五、总结

       总的来说这次解决问题进行了很多重复安装更换版本的过程,如果当时一开始就启动顺序去分析,可能能节省不少时间。当时因为突然更换服务器有点措手不及,做了很多冗余的工作。不过也通过整理这篇文章,对学到的内容进行了巩固。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值