视觉导航实机(二):Turtlebot4和ROS2环境配置

 

书接上回。这里介绍Turtlebot4的基本使用,并安装好ROS2环境去使用它。

深度学习环境安装

先优化一下ubuntu的界面,看着很丑。先把屏幕缩放比例改成150%,然后安装gnome-tweaks,这样可以多设置很多东西。安装vscode,Linux下的VSCode顶部是白色的,有些丑,可以在设置里把它去掉。还有关闭软件自动更新。

在pc上先安装vim、git、gcc,然后安装conda:

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh --user-agent="Mozilla"

下载之后,用sh运行进行安装。然后安装NVIDIA驱动,运行下面这个命令就可以了:

sudo ubuntu-drivers autoinstall

安装成功后,重启电脑,正常来说就可以使用nvidia-smi命令了。之后安装cuda,由于前面安装了驱动,所以安装cuda的时候要把安装驱动不勾选。安装完成后程序安装在/usr/local/cuda-11.8。也可以前面不安装驱动,在这一步安装。最后创建conda环境,安装pytorch等库。

Turtlebot4的基本使用

官方教程:https://turtlebot.github.io/turtlebot4-user-manual/setup/basic.html

  • Turtlebot4有两个部分,一个是Create3(底座),一个是树莓派4。
  • 底座上有3个按钮,中间的大按钮是关机按钮,按钮1按下去之后小车会自动回到dock,按钮2没试过。
  • 传感器最主要的有一个激光雷达和一个深度相机(深度相机默认是关闭深度的,只有RGB)。
  • 显示屏旁边4个按钮,确认、返回、向上、向下(这个显示器没多大用处)。
  • 显示屏上方有5个指示灯,表示状态。经过设置,如果一切正常,5个灯都应该亮起来。

开机关机

  • 开机:放在充电桩上开机(这种开机方式真奇葩,居然不是按电源键开机)。开机需要比较长的时间,需要几分钟,发出声音才算开机,在这之前电池电量会显示0。然后灯环变成黄绿色,最后又变成白色(如果是红色表示电量低),这个时候显示器的电池才不是0,电池的LED灯也才会亮(红色表示电量低)。

  • 关机:把机器从充电桩拿下来,按中间的电源按钮,直到光环闪烁3下并发出声音,然后整个机器就关机了。如果电源电量低,拿下充电桩光环会发红光。

树莓派连接wifi

Turtlebot4安装了ROS2(Humble版本),ROS2通过网络实现不同设备之间的通信,这要求自己的电脑(后面用pc代指)、树莓派、底盘(Create3)连上同一个网络,这里记录树莓派和底盘需要怎么连接wifi。

方法1

步骤1:turtlebot一开始自己有个wifi,名字就是Turtlebot4,先在电脑上连上这个wifi,密码是:Turtlebot4,注意第一个大写。然后在pc上ssh连接到这个wifi来对小车进行操作:

ssh ubuntu@10.42.0.1
# 密码是:turtlebot4,第一个小写

步骤2:用步骤1连上小车,进入终端,让小车连上和电脑相同的wifi。wifi必须是单独的5G频段或2.4G频段,别用混合频段,会出问题。然后用turtlebot4-setup命令进入wifi设置界面,根据提示输入wifi名字和密码。模式要选择client,千万别选access point模式,我被坑了好久。Access point就是树莓派自己发出Turtlebot4这个wifi。选完后,点击save,然后选择apply,选择yes,之后树莓派就会重启,重启之后使用ip addr查看是否被分配了ip。连接成功的话就可以在turtlebot的显示屏上看到ip地址,之后就可以在同一个网络下在pc上用ssh连上树莓派ssh ubuntu@ip

方法2

用网线把pc和树莓派连起来,然后把电脑有线网卡的ip设为192.168.185.5,然后ssh ubuntu@192.168.185.3连上小车。然后也是用turtlebot4-setup连接wifi。这里解释一下这个几个ip,默认情况下Create3的有线网卡IP是192.168.186.3,而树莓派是192.168.185.3,一个是186,一个是185。子网掩码是255.255.255.0,所以只要保证pc的有线ip也设为192.168.185.xxx就可以跟树莓派通信了,官方教程用的是192.168.185.5,建议还是按官方的来。

方法3

用内六角螺丝刀,把tb4顶部拆了,可以看到里面的树莓派。用mini hdmi的线把树莓派连接显示器,用type-c线插上电源,用usb连接键盘,这样就可以直接在终端操作了。最后还是用turtlebot4-setup连wifi。这种方法是最直接的,前面两种都是通过网络操作,如果连不上就很难解决。

Create3连接wifi

同时按住tb4的中间大按钮两边的2个小按钮,一直按住,直到灯环发蓝光,这个时候Create3会发布一个wifi,名字是Create开头的。然后电脑连接到Create-XXXX网络(XXXX是数组,不同设备不一样),然后在浏览器上访问192.168.10.1来访问Create3,里面有UI界面,填写wifi账号密码就能连接了。wifi必须是单独的2.4G频段,否则会出问题。

安装ROS2

ROS2介绍

ROS2提供了不同机器之间的通信功能。每个机器上有很多节点(Node),每个节点可以在网络内发布话题(Topic),同一个网络内的机器上的节点都可以选择是否订阅这个话题。Turtlebot4会默认发布一些话题,如果网络设置正常,在pc上应该能用命令看到小车发布在网络里的话题:

# node相关命令
ros2 node list  # 查看所有节点
ros2 node info /xxx  # 看这个节点的信息,主要是看它订阅和发布了哪些话题

# topic相关命令
ros2 topic list  # 查看网络中的topic
ros2 topic echo /ip  # 查看/ip这个话题
ros2 topic info /ip  # 查看/ip这个话题的信息

节点和话题用文件路径的方式进行命名,并且支持不同的命名空间,命名空间相同的机器之间才能通信,这个遵照tb4默认的设定就可以了(默认命名空间是空的)。还有个ROS_DOMAIN_ID的环境变量也要相同才能通信,默认是0。

利用这些话题可以查看小车的硬件状态,比如可以用ros2 topic echo /battery_state查看电池状态。利用ROS2,我们可以自己写C++或者python实现node,来发布和订阅消息,控制小车材料。简而言之,机器之间通过网络内共享的话题进行通信,同一网络内的电脑和机器人可以以很简单地方式进行通信,这个设计还是很巧妙的。

ROS2安装

树莓派上已经装好了ROS2,所以只用在PC上安装。PC上的ROS2版本应该和树莓派上的一致,可以在树莓派上用printenv ROS_DISTRO查看树莓派上的ROS2版本,看是galactic还是humble。先设置apt的源,使之能下载ros2:

# 注意先要保证系统语言是英文的,编码是utf-8
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl  # 好像加个-y就会出问题,有点诡异
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt upgrade  # 这个也是必须的
# 这些命令一个都不要少

然后用apt安装:

sudo apt install ros-humble-desktop
sudo apt install ros-dev-tools

安装完后,在~/.bashrc里加上:

# Replace ".bash" with your shell if you're not using bash
# Possible values are: setup.bash, setup.sh, setup.zsh
source /opt/ros/humble/setup.bash

如果没问题的话,新开一个终端,就可以使用ros2命令了。测试是否安装成功可以在两个终端运行以下两个命令:

ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener

如果listener显示听到的talker的数字,说明ros2安装成功。打开小车后,在电脑上用ros2 topic list应该能看到小车发布的这些话题:

/battery_state
/cliff_intensity
/cmd_audio
/cmd_lightring
/cmd_vel
/color/preview/image
/diagnostics
/diagnostics_agg
/diagnostics_toplevel_state
/dock_status
/function_calls
/hazard_detection
/hmi/buttons
/hmi/display
/hmi/display/message
/hmi/led
/imu
/interface_buttons
/ip/ir_intensity
/ir_opcode
/joint_states
/joy
/joy/set_feedback
/kidnap_status
/mobility_monitor
/transition_event
/mouse
/odom
/parameter_events
/robot_description
/robot_state/transition_event
/rosout
/scan
/slip_status
/static_transform/transition_eventstereo/depth
/stop_status
/tf
/tf_static
/wheel_status
/wheel_ticks
/wheel_vels

ROS2的使用教程就不记了,可以看官方文档,或者问GPT。

安装Turtlebot4软件包

turtlebot4自带一些软件可以建图、导航之类的,ROS2也提供了一些可视化工具。下面是安装命令,如果前面安装ROS2没遇到问题,这个也应该没问题:

sudo apt update && sudo apt install ros-humble-turtlebot4-desktop

sudo apt update
sudo apt install ros-humble-turtlebot4-description \
ros-humble-turtlebot4-msgs \
ros-humble-turtlebot4-navigation \
ros-humble-turtlebot4-node
# 我用的VPN下载的,有时候不稳定下载失败,多试几次就好了

这里介绍一下软件包:

  • ros-humble-turtlebot4-description:这个包里有tb4的URDF文件,URDF文件是用来描述机器人的文件,包括机器人的三维模型。
  • ros-humble-turtlebot4-msgs:定义了一些ros2的消息格式
  • ros-humble-turtlebot4-node:实现了一些ros2的节点
  • ros-humble-turtlebot4-navigation:包括一些导航的工具,比如一些SLAM工具,一些预定的导航功能

测试环境配置

用键盘控制小车来测试环境是否正常。电脑上运行:

ros2 run teleop_twist_keyboard teleop_twist_keyboard  # teleop指teleoperation,远程操作

运行之后会显示怎么控制,用ijl这4个按键控制,按了之后,小车应该会旋转或移动。注意小车是不能连续后退的,只能前进或旋转。

Discovery Server配置

前面介绍了PC、树莓派、Create3之间怎么通过wifi通信。但是小车总是要到没有wifi的地方去的,校园网又连不上。所以我选择有线连接pc、树莓派、Create3。树莓派和Create3之间已经用有线连接了,但是默认是通过wifi通信的,需要设置一下变成Discovery Server模式才是有线通信,并且这种模式下如果要用wifi连接,也只需要树莓派连wifi,Create3会通过有线与树莓派通信,不需要再设置wifi了。

配置

设置create3

用前面说的方法按住两个按钮,在网页上对Create3设置,设置参考Create3官方。注意里面的ROS2 Namespace要改。有时候设置过了,但是namespace会变成/not_use,很奇怪。

设置树莓派

turtlebot4-setup里面设置,把Discovery Server设为True,然后save和apply,之后树莓派就重启了。

设置pc

Turtlebot4的卖家提供了一个discover_server.zip文件,把它解压,然后运行./configure_discovery.sh,输入小车的ip就可以了。如果想通过wifi连接,就输入wifi网络下的小车ip;如果想通过有线连接,就输入192.168.285.3。这个的功能是获取小车的ip,把ip写入相关的配置文件,并在pc上设置相关的路由,保证往Create3发送的信息会被路由到树莓派。

遇到的问题

  • 如果小车屏幕上显示了IP,但是电池电量显示为0

    说明小车连上了wifi,但是没连上create3。可以通过ros2 topic echo /battery_state来验证是否连上create3,没有输出信息说明没有连上。如果说已经给create3设置了discovery server模式,但是还是没连上,可能是namespace的问题,需要去Create3的设置界面再看看。

  • 可以看到树莓派发布的话题,但是看不到Create3发布的话题,比如/battery_state

    正常来说不应该出现这个问题,因为路由在前面./configure_discovery.sh就已经配置了。

    Create3和树莓派通过usb连接,ip地址分别是192.168.186.2和192.168.186.3。树莓派和pc通过网线连接,ip地址分别是192.168.185.3和192.168.185.5。Create3和pc之间没有网络连接,导致pc发送的信息Create3无法接收到。解决办法是配置路由:

      sudo ip route add 192.168.186.0/24 via 192.168.185.3
    

    路由配置每次断网之后就没了,所以每次重新联网都要重新配,比如重新开机就要重新设置一次。或者在Ubuntu的有线网设置里面去设置路由,这个每次会自动添加的。

  • PC和树莓派的有线网每个几十秒就会断开

    这个问题折磨了我好久。先查看网络日志:

      journalctl -u NetworkManager -b
    

    在pc上和树莓派上都看看,发现是树莓派的问题,有一行报错了,reason ‘ip-config-unvailable’。在网上搜了一下,参考这个https://askubuntu.com/questions/1508670/ip-config-unavailable-dhcp-error-from-networkmanager解决了,只需要把树莓派上的/etc/NetworkManager/NetworkManager.conf删了。