SLAM小车系统配置与软件安装过程

WH-Robot2 SLAM小车系统配置与软件安装过程

---边城量子(wechat:shihezichen), 2018.09.09

  1. 概述
  • 背景:
  1. 出于成本考虑,只购买了维航科技的小车底盘(含STM32F1板和底盘、电机、电机驱动板、摄像头等),其他的零件重用自己原来的(如树莓派、激光雷达);
  • 目标:
  1. 目的1:在此底盘之上,组装一辆SLAM小车,能够进行基本建图和导航,为以后研究做好硬件基础;
    1. 子目标1: 安装好WH-Robot2所需的树莓派、PC机软件系统,使得PC和树莓派之间可以正常进行通信;
    2. 子目标2: 在树莓派上安装相关的SLAM开源组件并调试通过;
  2. 目标2: 将www.wh-robot.com上的零散的教程串接起来, 形成一个场景化的安装教程,同时做少量增强,也避免后来者再走这些弯路;

 

  • 前提条件:
  1. 硬件--小车底盘: 小车底盘和电源灯都已经组装完毕(具体底盘的组装教程参见维航网站,硬件安装没啥可讲的,按照网站上的做就是了,有问题可以咨询维航的技术服务人员)
  2. 硬件--其他硬件: 树莓派、树莓派所需的屏幕和键盘(或超级终端代替)、SD卡(16G)、读卡器;
  3. 在windows上安装好ubuntu 16.04 的虚拟机;
  4. 技能要求: 会在linux下使用vi修改文件;
  • IP规划:  
  1. 树莓派和PC两者规划信息如下, 其中PC的Ubuntu已经安装好, 树莓派的待安装:

设备

操作系统

ROS角色

IP

hostname

树莓派

Ubuntu Mate 16.04 for ARM

Node

192.168.2.104

mbees-desktop

PC

Ubuntu for X86

Master

192.168.2.201

rosmaster

备注:可以是运行在Windows上的虚拟机,也可以是独立的Ubuntu;

PC

Windows

NA

 

备注:仅仅作为操作发起机器,从这台机器发起各项安装指令

* 以下将使用树莓派和PC分别指代上述两台设备树莓派Ubuntu 和PC Ubuntu;

* 各自的IP地址规划可能不同, 可根据自己网络规划改成相应的值,注意部分步骤里面也要把IP替换为自己的值;

 

  • 完整过程:  
  1. 安装小车底盘
  2. 安装树莓派到小车地盘上
  3. 安装激光雷达到小车底盘上
  4. 树莓派软件
  5. PC Ubuntu软件
  6. WHBOT2小车配置与软件安装(SLAM建图与导航)

 以下步骤从第(4)开始讲起,前面的硬件组装需要参考网站或自行咨询维航技术人员解决。

 

  1. 在windows机器上,下载树莓派所用的ubuntu image和烧录软件

对应教程:  [WHBOT2]共享资料下载:   http://www.wh-robot.com/whb/?p=876

备注: 以下过程对上述教程步骤有所补充

 

  • 下载软件:    
  1. 烧录镜像到树莓派的SD卡的软件, 运行子啊windows上,
  2. win32 Disk Imager
  • 下载image:  
  1. 树莓派所需的Ubuntu Mate系统的镜像
  2. whrobot-lubuntu-16.04.2-desktop-armhf-raspberry-pi.img
  • 下载ros包源码:
  1. 运行于树莓派上的ubuntu上的ROS包;
  2. whbot2.tar.gz  (此文件需要购买产品后向维航服务人员索取)

 

  1. 为树莓派安装ubuntu操作系统

####对应教程:  “[ROS]树莓派教程一:安装UBUNTU系统 :   http://www.wh-robot.com/whb/?p=876

备注: 以下过程对上述教程步骤有所补充

 

  • 烧录SD卡
  1. 使用win32 Disk Imager将镜像写入SD卡; 具体参见上述教程即可。
  2. 备注:此处安装的是ubuntu mate for ARM版本。
  • 配置SD卡上的config.txt, 便于液晶屏显示树莓派分辨率( hdmi_mode那块的参数需要根据各自液晶屏修改 )

#hdmi_drive=1 DVI模式 (没声音)

#hdmi_drive=2 HDMI模式 (如果支持并已启用将有声音输出)

hdmi_drive=2

#hdmi_group 设置HDMI类型

#hdmi_group=1   CEA

#hdmi_group=2   DMT

hdmi_group=2   DMT

#hdmi_mode 设置在CEA或DMT格式下的屏幕分辨率, 根据各自屏幕调整

hdmi_mode=87

hdmi_cvt 1024 600 60 6 0 0 0

#使能硬件接口,这样就可以使能树莓派的I2C、SPI接口了。

dtparam=i2c_arm=on

dtparam=i2s=on

dtparam=spi=on

#超频选项

#默认为700MHz,如果要超频到800MHz

#arm_freq=800

gpu_mem=128

start_x=1

enable_uart=1

dtoverlay=w1-gpio

  • 启动树莓派
  1. 将SD卡插入树莓派, 启动树莓派,可以看到树莓派界面

 

  1. 配置树莓派

对应教程:  “[ROS]树莓派教程二:SSH配置”:   http://www.wh-robot.com/whb/?p=653

备注: 以下过程对上述教程步骤有所补充

 

备注:首次树莓派连接WIFI成功后如果获取不到IP地址,可再重启一次

 

 

  • 树莓派SSH和APT配置:

注意: 由于此时树莓派ssh server不一定可用, 需要使用屏幕+键盘接入树莓派进行以下配置; 或者windows用cmd, 树莓派用超级终端;

按照网页教程配置即可

 

  • 配置树莓派apt源:
  1. 备份apt源

sudo cp  /etc/apt/sources.list  /etc/apt/sources.list.bak

  1. 替换 /etc/apt/sources.list内容为如下内容:

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted

 

  1. 保存退出, 然后执行更新  

sudo  apt update

  1. 修改 /etc/rc.local, 配置自启动ssh服务:

在文件的exit语句前加入如下语句

service ssh start

 

  1. 树莓派上安装ROS

对应教程:  [ROS]树莓派教程三、安装ROS系统(ROS-KINETIC) :   http://www.wh-robot.com/whb/?p=657

备注: 以下过程与上述教程步骤完全一致

注:  以下过程可以通过SSH客户端远程登录到树莓派执行.

 

  • 添加ROS源:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

sudo apt-get  update

  • 安装ROS:

sudo apt-get  install ros-kinetic-desktop-full

sudo  rosdep  init

rosdep  update

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

source  ~/.bashrc

sudo  apt-get  install  python-rosinstall

注:如果由于网络原因执行超时, 则多执行几遍

 

  1. 在树莓派上创建ROS工作空间并编译wh-robot2源码

对应教程:  [WHBOT2]教程一:代码编译:   http://www.wh-robot.com/whb/?p=738

备注: 以下过程对上述教程步骤有所补充

注:  以下过程可以通过SSH客户端远程登录到树莓派执行.

 

  • 关闭树莓派图形界面

执行如下命令关闭树莓派图形界面:

sudo /etc/init.d/lightdm  stop

* 避免编译wh-robot2源码时挂死. 等编译完毕后, 再开启.

 

  • 解压缩与编译源码

把源码包(whbot2.tar.gz)上传到树莓派home目录, 然后开始编译

cd ~/

tar -zxvf  whbot2.tar.gz

mv whbot2/ros_ws  ~/

cd  ~/ros_ws

catkin_make

大概几分钟就可以编译好了

备注:如果编译过程中出现如下错误:

virtual memory exhausted: Cannot allocate memory

说明是扩展区大小不够,  出错处理如下步骤所示;

 

  • 出错处理

 

  1. 查看swap大小

使用free -m 命令查看, 可以发现swap已经为零

$ free -m

                 total        used        free        shared      buff/cache   available

mem:            862          64         525          12         271         730

swap:             0           0           0

  1. 扩大swap

执行如下命令为树莓派挂接一个512M的swap区

sudo dd if=/dev/zero of=/swapfile1 bs=1024 count=524288

sudo mkswap /swapfile1

sudo chown root:root /swapfile1

sudo chmod 0600 /swapfile1

sudo swapon /swapfile1

sudo vi /etc/fstab

 

添加以下内容到fstab文件尾

/swapfile1 swap swap defaults 0 0

再查看是否有swap空间

$ free -m

              total        used        free      shared  buff/cache   available

mem:         862          25         729        2      106         779

swap:         511          0          0

此时再执行catkine_make编译,一般就能成功了。

 

  • 把ROS工作空间内容加入到用户环境变量

source  ~/ros_ws/devel/setup.bash

echo source  ~/ros_ws/devel/setup.bash >>  ~/.bashrc

 

  1. 在树莓派上安装串口驱动, 修改波特率

对应教程:  [WHBOT2]教程三:串口驱动安装:   http://www.wh-robot.com/whb/?p=743

对应教程:  [WHBOT2]教程四:通信波特率修改:   http://www.wh-robot.com/whb/?p=750

备注: 以下过程对上述教程步骤有所补充

 

  • 查看雷达设备信息

修改设备文件,  保证可以始终使用某个固定别名访问某台设备, 不依赖于设备插入顺序。

插入雷达设备到USB, 查看设备信息:

lsusb

得到的信息有一行(不同雷达显示内容稍有不同):

Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Bus 001 Device 004: ID 6901:1224

Bus 001 Device 006: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

雷达对应的那一行(第3行)中的ID为10c4:ea60,分别代表vendor和product

串口对应的那一行(第1行)中的ID为 067b:2303, 分别代表vendor和product。

本例中会最终生成三个别名:/dev/whbot, /dev/rplidar, /dev/ydlidar

/dev/whbot:通过串口,连接的是下层STM32的控制板,名为whbot;

/dev/rplidar: 通过USB口连接rpliader雷达;

/dev/ydlidar: 通过USB口连接ydlidar雷达;

 

  • 建立/dev/whbot设备文件

树莓派通过USB2TTL连接STM32单板,其中USB在树莓派这侧,通过RX,TX,GND三根线与STM32单板的TX,RX,GND相连(注意TX/RX交叉)。

这一步是为USB2TTL建立一个别名(设备文件),为/dev/whbot,以便于未来树莓派上的程序使用别名访问USB2TTL(本例中使用的是/dev/whbot来访问),从而与STM32通信;

在文件  /etc/udev/rules.d/99-com.rules 最后面添加USB2TTL的定义(注意vendor和product要与上面的串口的信息对应上,本例中为067b和2303):

KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0777",  SYMLINK+="whbot"

这样就给10c4:ea60设备设了一个别名/dev/whbot, 程序中可以使用这个别名访问设备, 而不论设备是在ttyUSB0或ttyUSB1;

 

  • 串口驱动安装

执行:

rosrun whbot setup.sh

这个操作本质上是想/etc/udev/rules.d目录下拷贝whbot.rules、rplidar.rules、ydlidar.rules文件;

待成功后,插入雷达设备, 重启树莓派, 然后执行如下命令查看所有串口驱动和雷达驱动:

ls  /dev/ttyAMA*

ls  /dev/whbot  -l

ls  /dev/rplidar  -l

ls  /dev/ydlidar  -l

应该看到分别有指向:

lrwxrwxrwx 1 root root 7 8月   4 18:22 /dev/rplidar -> ttyUSB1

lrwxrwxrwx 1 root root 7 8月   4 18:22 /dev/ydlidar -> ttyUSB1

lrwxrwxrwx 1 root root 7 8月   4 19:42 /dev/whbot -> ttyUSB0

备注:由此可知,在当前树莓派上,ttyUSB1是连接雷达的, ttyUSB0是连接STM32板的;

 

 

  • 修改波特率

修改文件:

vi  ~/ros_ws/src/whbot_bringup/params/base_params.yaml

修改为如下值:

buadrate: 115200

 

 

  1. 树莓派上修改主机名为mbees-desktop

主机名统一了,后续指代时不会出现混乱, 也比较能够与网站的教程一致。执行:

sudo vi /etc/hostname

把内容改为:

mbees-desktop

保存退出, 然后执行:

sudo vi  /etc/hosts

将其中的主机名改为 mbees-desktop,如下:

127.0.1.1       mbees-desktop

保存退出,重启树莓派。

 

 

截止为此, 树莓派的配置完成了, 下面修改ubuntu上的配置。

启动ubuntu虚拟机, 然后登录。

 

  1. 修改PC上的Ubuntu源

修改 /etc/apt/sources.list内容为如下内容:

# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted

deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted

deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties

deb http://mirrors.aliyun.com/ubuntu/ xenial universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse

deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties

deb http://archive.canonical.com/ubuntu xenial partner

deb-src http://archive.canonical.com/ubuntu xenial partner

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted

deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties

deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

 

  1. 在ubuntu上安装ROS

过程同前面的 --- 树莓派上安装ROS;

 

  1. 在ubuntu上编译whbot2源代码

对应教程:  [WHBOT2]教程七:虚拟机UBUNTU编译WHBOT2源代码:   http://www.wh-robot.com/whb/?p=817

过程同前面的 -- 在树莓派上创建ROS工作空间并编译wh-robot2源码

 

  1. 树莓派和ubuntu的多机通信配置

对应教程:  [ROS]ROS多机的通信配置:   http://www.wh-robot.com/whb/?p=615

备注: 以下过程对上述教程步骤有所补充

 

  • 假设树莓派和ubuntu两者信息如下:

设备

操作系统

ROS角色

IP

hostname

树莓派

Ubuntu Mate 16.04 for ARM

Node

192.168.2.104

mbees-desktop

PC

Ubuntu for X86

Master

192.168.2.201

rosmaster

 

  • 在树莓派上修改:
  1. /etchostname

修改/etc/hostname 文件, 内容改为: mbees-desktop

 

  1. /etc/hosts

在/etc/hosts 文件, 添加/修改为:   

127.0.0.1      mbees-desktop

192.168.2.104  mbees-desktop

192.168.2.201  rosmaster

 

  1. .bashrc

在~/.bashrc 文件中添加两行:

export ROS_HOSTNAME=mbees-desktop

export ROS_MASTER_URI=http://rosmaster:11311

然后重启

 

  • 在PC Ubuntu上修改:
  1. /etchostname

修改/etc/hostname 文件, 内容改为 rosmaster

 

  1. /etc/hosts

在/etc/hosts 文件, 修改/添加为:

127.0.0.1      rosmaster

192.168.2.104  mbees-desktop

192.168.2.201  rosmaster

 

  1. .bashrc

在~/.bashrc  文件, 添加两行:

export ROS_HOSTNAME=rosmaster

export ROS_MASTER_URI=http://rosmaster:11311

然后重启

 

  • 在PC Ubuntu上启动roscore

source  ~/.bashrc

roscore

 

  • 在树莓派的GUI的终端命令行启动turtlesim

备注:此步骤需要树莓派的GUI以便于显示弹出的窗口。

也可以用支持X-Win的终端登录软件例如MoboXTerm来从windows远程登录树莓派执行,它会在windows端弹出窗口。

source  ~/.bashrc

rosrun turtelsim turtlesim_node

可以在弹出的对话框上看到小乌龟

 

  • 在PC Ubuntu机器上上启动turtle_teloop_key

在PC Ubuntu机器上的另外一个终端窗口中执行(可以是远程SSH):

source  ~/.bashrc

rosrun turtlesim turtle_teleop_key

当出现语句:

$ rosrun turtlesim  turtle_teleop_key

Reading from keyboard

---------------------------

Use arrow keys to move the turtle.

 

就可以使用键盘上下左右键控制乌龟运动;

 

 

  1. 底层底盘单板(维航标准控制板)的连线

对应教程:  [WHBOT2]教程十:配置WHBOT2控制参数:   http://www.wh-robot.com/whb/?p=884

注:教程中有如何连接电源线, 如何连接电机的说明。

 

 

  1. 连接树莓派单板与底层底盘单板(维航标准控制板)

 

 

 

依据下图二, STM32串口部分排布,从右向左分别是 TX1,  RX1,  5V,  GND

 

    

 

  1. 配置whbot2的控制参数

 

对应教程:  [WHBOT2]教程十:配置WHBOT2控制参数:   http://www.wh-robot.com/whb/?p=828

备注: 以下过程与上述教程步骤完全一致

 

  • 在树莓派上执行

roslaunchwhbot_bringup bringup.launch

若执行正常,会出现:

 

其中可以看到, 树莓派尝试通过 /dev/whbot 端口连接STM32板(main board)

而且当前的RobotParameters值也被打印出来了;

 

  • 在PC ubuntu的图形化的终端命令行执行
  1. 启动键盘控制程序

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行。 也可以使用MoboXTerm来远程登录到PC Ubuntu来执行。

rosrun  rqt_reconfigure  rqt_reconfigure

在弹出的对话框中, 调节whbot_driver的各项参数, 改为如下值:

 

* 修改完毕后, 在空白处单击即可完成配置下发

注:

wheel_diameter: 轮子直径

wheel_track: 轴距

encode_resolution: 编码数(总数)

 

  1. 控制whbot2小车运动

对应教程:  [WHBOT2]教程十二:WHBOT2运动控制:   http://www.wh-robot.com/whb/?p=899

备注: 以下过程与上述教程步骤完全一致

 

  • 在PC Ubuntu上启动rosmaster

如果rosmaster没有启动则执行如下语句,如果已经启动直接进入下一步

roscore

  • 在树莓派上启动whbot小车程序

如果whbot_bringup没有执行则执行如下语句,如果已经启动直接进入下一步

roslaunch  whbot_bringup bringup.launch

  • 在树莓派上启动键盘控制程序

roslaunch whbot keyboard_teleop.launch

 

此时会出现如下界面:

 

按i前进, 按,后退等等

注意:如果出现了如下错误,提示 teleop_twist_keyboard.py的line 2出错,参照如下方式解决。

 

  1. 出错解决

 

可以修改 ~/ros_ws/src/whbot/scripts/teleop_twist_keyboard.py

前两行原来为:

#!/usr/bin/env python

import roslib; roslib.load_manifest('teleop_twist_keyboard')

改为:

#!/usr/bin/env python

import roslib

#roslib.load_manifest('teleop_twist_keyboard')

 

然后保存, 重新编译

cd ~/ros_ws

catkin_make  

待编译成功后,再重新执行

 

  1. WHBOT2里程校准

对应教程:  WHBOT2]教程十三:WHBOT2里程校准:   http://www.wh-robot.com/whb/?p=901

备注: 以下过程与上述教程步骤完全一致

 

  • 在PC Ubuntu上启动rosmaster

如果rosmaster没有启动则执行如下语句,如果已经启动直接进入下一步

roscore

  • 在树莓派上启动whbot小车程序

如果whbot_bringup没有执行则执行如下语句,如果已经启动直接进入下一步

roslaunch  whbot_bringup bringup.launch

  • 在PC Ubuntu上运行里程校准程序(也可以在树莓派上运行):

rosrun whbot calibrate_linear.py

屏幕会显示如下语句:

[INFO] [1535203599.788825]: Bring up rqt_reconfigure to control the test.

  • 在PC Ubuntu上运行rqt_reconfigure界面:

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行。 也可以使用MoboXTerm来远程登录到PC Ubuntu来执行。

rosrun  rqt_reconfigure  rqt_reconfigure

出现如下界面:

test_distance: 测试距离

speed:速度

tolerance:误差

odom_linear_scale_correction: 比例参数, 开始时可先设置为1

 

补充说明:

机器人最底层左右各有两个M3的孔,可加装4个螺丝,来作为路程的定位指示; 然后在地上画一米的直线,然后让其中一个螺丝对准0刻度,勾选上图中的“start_test”,开始运行小车,待停止后检查定位螺丝是否到达所需的距离,如果没有就需要对参数进行调整

 

如果无法走到相应的距离,因减小odom_linear_scale_correction,改为 真实距离/测试距离。

例如测试距离0.5米,只走了0.495米,则比例调整为0.495/0.5 = 0.99;

 

  1. WHBOT2旋转角度校准

对应教程:  WHBOT2]教程十四:WHBOT2旋转角度校准:   http://www.wh-robot.com/whb/?p=905

备注: 以下过程与上述教程步骤完全一致

 

  • 在PC Ubuntu上启动rosmaster

如果rosmaster没有启动则执行如下语句,如果已经启动直接进入下一步

roscore

  • 在树莓派上启动whbot小车程序

如果whbot_bringup没有执行则执行如下语句,如果已经启动直接进入下一步

roslaunch  whbot_bringup bringup.launch

  • 在PC Ubuntu上运行里程校准程序(也可以在树莓派上运行):

rosrun whbot calibrate_angular.py

屏幕会显示如下语句:

[INFO] [1535206051.359211]: Bring up rqt_reconfigure to control the test.

  • 在PC Ubuntu上运行rqt_reconfigure界面:

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行。 也可以使用MoboXTerm来远程登录到PC Ubuntu来执行。

rosrun  rqt_reconfigure  rqt_reconfigure

出现如下界面:

test_angle: 测试角度

speed:速度

tolerance:误差

odom_linear_scale_correction: 比例参数, 开始时可先设置为1

 

 

补充说明:

机器人最底层左右各有两个M3的孔,可加装4个螺丝,来作为路程的定位指示; 然后在地上画一米的直线,然后让其中一个螺丝对准0刻度,勾选上图中的“start_test”,开始运行小车,待停止后检查定位螺丝是否回到原来的这条线(因为旋转了360°),如果没有就需要对参数进行调整。

 

  1. 将自己的雷达驱动package融入到WHBOT2 的ROS工程中

由于没有使用whbot附带的雷达,因此需要把自己雷达的驱动融入到whbot的工程中。 以下操作在树莓派上操作,因为是树莓派访问雷达;

  • 把自己的雷达驱动包放入到whbot2中

在ros_ws目录下,拷贝如雷达的驱动的package,名为iiiroboticslidar2_ros,拷贝之后如下图:

 

进入目录显示:

 

备注:这一步操作,是给whbot2工程新增了一个package,根据其中package.xml的描述,这个package的 名字为iiiroboticslidar2。

 

  • 在whbot2的bringup中新增雷达的launch文件

将iiiroboticslidar2_ros/launch下的雷达启动文件3iroboticslidar2.launch拷贝到whbot_bringup/launch下:

cd  ~/ros_ws/src

cp  iiiroboticslidar2_ros/launch/3iroboticslidar2.launch  whbot_bringup/launch/

备注:这一步操作,是让whbot2的whbot_bringup具有启动节点iiiroboticslidar2的能力,具体可以参考3iroboticslidar.launch的内容。

 

打开3iroboticslidar2.launch文件,让其中的dev指向别名,把

  ttyUSB0"/>

  laser"/>

改为:

  ort"         type="string" value="/dev/rplidar"/>

laser_link"/>

备注:为什么这里可以直接使用/dev/rplidar,因为经过lsusb查看,我自己的雷达的vendor和product和whbot中的rplidar完全一样; 如果不一样,则需要的“7. 安装树莓派窗口驱动,修改波特率”那个步骤,为自己的雷达专门建立一个别名和rule文件,在rule文件中写入自己的vendor和product;然后在本步骤的launch文件中填写自己的/dev下的别名;

备注:laser_link是whbot所需frame_id的value(可参见它自己的rdlidar.launch的定义);

备注:在此树莓派上,/dev/rplidar指向/dev/ttyUSB1,外部接的是雷达:

$ ls -al /dev/rplidar

lrwxrwxrwx 1 root root 7 9月   9 17:42 /dev/rplidar -> ttyUSB1

 

  • 修改whbot2的bringup中的robot.launch文件

cd  ~/ros_ws/src/whbot_bringup/launch/

vi  robot.launch

把如下内容:

改为:

 

备注:这一步操作,是让robot.launch中新增一个雷达的选项,robot.launch具体启动哪款雷达,是根据环境变量WHBOT_LIDAR来决定的;如其中的下句所示:

当然也可以在上面这句把变量${arg lidar}.launch写死为某个具体的雷达的launch文件。

 

  • 重新编译whbot2工程

因为加入了新的package, iiiroboticslidar2,而且把这个package对应的node节点的launch也加入到了robot.launch中,因此需要重新编译工程,使得这部分新增代码生效:

cd ~/ros_ws

catkin_make

执行后,会列出此时的工程所包含的所有的packages:

 

 

  1. 补充缺少的ROS Kinect Packages
  • 在树莓派所在ubuntu上安装kinect Packages:

执行如下语句(如果已经安装可以跳过):

sudo apt install  ros-kinetic-move-base

sudo apt install  ros-kinetic-slam-gmapping

sudo apt install  ros-kinetic-map-server

sudo apt install  ros-kinetic-image-view

备注: move-base用于导航基础包,map-server是建图时的基础包,image-view是摄像头显示时需要的基础包;

备注:可以使用apt-cache search ros-kinetic 搜索kinetic的可用的包, 例如:

apt-cache search ros-kinetic | grep map-server

查找所有map-server的可用的包。

 

  1. WHBOT2利用ROS建图

对应教程:  WHBOT2]教程十五:WHBOT2利用ROS建图:   http://www.wh-robot.com/whb/?p=912

备注: 以下过程与上述教程步骤稍有修改;

ROS驱动中提供了cmd_vel的订阅以及odom的发布。

  • 在PC Ubuntu上启动rosmaster

如果rosmaster没有启动则执行如下语句,如果已经启动直接进入下一步

roscore

  • 在树莓派上启动whbot_navigation程序

如果如下语句没有执行则执行如下语句,如果已经启动直接进入下一步

export WHBOT_LIDAR=3iroboticslidar2

export WHBOT_MODEL=whbot2

roslaunch whbot_navigation gmapping.launch

  • 在PC Ubuntu上启动view程序

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行。 也可以使用MoboXTerm来远程登录到PC Ubuntu来执行。

roslaunch whbot_navigation  view_nav.launch

执行后显示如下图形界面:

 

 

 

  1. WHBOT2利用建好地图导航

对应教程:  WHBOT2]教程十六:WHBOT2利用建好地图导航:   http://www.wh-robot.com/whb/?p=908

备注: 以下过程与上述教程步骤完全一致

  • 在PC Ubuntu上启动rosmaster

如果rosmaster没有启动则执行如下语句,如果已经启动直接进入下一步

roscore

  • 在树莓派上启动whbot_navigation程序

如果如下语句没有执行则执行如下语句,如果已经启动直接进入下一步

export WHBOT_LIDAR=3iroboticslidar2

export WHBOT_MODEL=whbot2

roslaunch whbot_navigation nav.launch map_name:=whbot2_lab.yaml

  • 在PC Ubuntu上启动view程序

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行。 也可以使用MoboXTerm来远程登录到PC Ubuntu来执行。

roslaunch whbot_navigation  view_nav.launch

执行后显示图形界面,在图形界面上选择机器人的目标,选择好之后,放开鼠标,就可以看到机器人开始导航了,导航效果主要是看你上一步所建立的地图,如果建图较好,则导航效果还是不错的:

 

 

 

 

 

  1. WHBOT2视频见识

对应教程:  WHBOT2]教程十七:WHBOT2视频显示:   http://www.wh-robot.com/whb/?p=915

备注: 以下过程与上述教程步骤完全一致

 

视频有如下应用方面:

  1. 视频监控:
  2. 图像识别:比如加入opencv + tensorflow
  3. 图像建图:

 

  • 在树莓派上安装摄像头驱动USB Camera
  1. 进入ros工作区(假定为~/ros_ws),新建usb_cam目录,并在其下新建src目录:

cd ~/ros_ws

mkdir  -p usb_cam/src

  1. 下载github上的usb_cam源码

cd usb_cam/src

git clone https://github.com/bosch-ros-pkg/usb_cam.git

  1. 编译whbot工程

cd ~/ros_ws

catkin_make

source ~/ros_ws/devel/setup.bash

  1. 测试是否配置完毕

roscd  usb_cam  

  1. 运行usb_cam

由于有图形化窗口, 因此以下语句需要在树莓派的图形界面的终端命令行中执行:

rosrun  usb_cam  usb_cam_node

此时只能看到摄像头打开而不会看到图像; 如果想看当前图像,可以使用如下语句:

rosrun  image_view  image_view  image:=/usb_cam/image_raw

其中/usb_cam/image_raw是usb_cam默认发布图像的topic;如果一切顺利,则可以看到当前摄像头实时视频窗口:

 

 

  1. 使用自定义launch文件设置摄像头

usb_cam的默认launch文件在如下目录

~/ros_ws/usb_cam/src/usb_cam/launch/usb_cam-test.launch

如果想自定义一个launch文件,可以复制并编辑它:

其中video_device value=dev/video0 />代表第一个摄像头,可以改为其他摄像头;修改好之后运行这个文件usb_cam.launch:

roslaunch usb_cam  usb_cam.launch

 

  • 在PC Ubuntu上启动rosmaster

roscore

  • 在树莓派上启动视频监控程序

roslaunch usb_cam  usb_cam.launch

  • 在PC Ubuntu运行

由于有图形化窗口, 因此以下语句需要在PC Ubuntu的图形界面的终端命令行中执行:

roslaunch  whbot_navigation  view_nav.launch

可以看到启动了rviz界面,为其添加视频窗口:

 

添加成功后,设置Topic为 /usb_cam/image_raw

 

这时候就可以在rviz窗口看到视频了。

 

 

  1. 结语

至此,整个SLAM小车就完全调通了;验证过程中使用gmapping的开源库。

 

从仅仅熟悉树莓派GPIO编程和Linux开发开始,到逐步接触激光雷达、差速底盘、ROS、SLAM库并把整个过程调通,中间学习到了很多技能和知识点,谨以此文作为纪录,也希望其他类似的人员可以少走弯路。

 

接下来的任务,就是钻研真正具有技术含量的地方----深度理解SLAM所涉及的数学原理和开源库的实现过程。

 

感谢维航技术人员的耐心解答,最后,也祝维航科技能越办越好!

 

 

你可能感兴趣的:(树莓派,ROS,智能车,SLAM,SLAM,树莓派,ROS,GMAPPING)