JetBot AI Kit 教程八、ROS

1. 前言

如果你从来没有接触过ROS系统,请先参考ROS官方教程熟悉ROS系统,了解各种ROS概念,然后再根据本教程通过ROS操作JetBot小车

2. 前期准备

使用前需要先安装系统,参考:

3. 安装melodic版本ROS

Jetson Nano提供的系统镜像是基于18.04版本Ubuntu系统,支持直接用apt安装ROS.使用下面的指令,按顺序安装,注意安装过程中是否有报错。

  1. # enable all Ubuntu packages:
  2. sudo apt-add-repository universe
  3. sudo apt-add-repository multiverse
  4. sudo apt-add-repository restricted
  5.  
  6. # add ROS repository to apt sources
  7. sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
  8. sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
  9.  
  10. # install ROS Base
  11. sudo apt-get update
  12. sudo apt-get install ros-melodic-ros-base
  13.  
  14. # add ROS paths to environment
  15. sudo sh -c 'echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc'

安装python库

  1. # pip should be installed
  2. $ sudo apt-get install python-pip
  3. # install Adafruit libraries
  4. $ pip install Adafruit-MotorHAT
  5. $ pip install Adafruit-SSD1306

添加i2c到user用户组

  1. sudo usermod -aG i2c $USER

4. 创建catkin工作空间

创建catkin工作空间保存我们的ROS程序包

  1. # create the catkin workspace
  2. mkdir -p ~/workspace/catkin_ws/src
  3. cd ~/workspace/catkin_ws
  4. catkin_make
  5.  
  6. # add catkin_ws path to bashrc
  7. sudo sh -c 'echo "source ~/workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc'

关闭当前终端,重新打开一个新的终端。确认ROS是否安装成功

  1. $ echo $ROS_PACKAGE_PATH
  2. /home/nvidia/workspace/catkin_ws/src:/opt/ros/melodic/share

5. 编译安装jetson-inference

  1. # git and cmake should be installed
  2. sudo apt-get install git cmake
  3.  
  4. # clone the repo and submodules
  5. cd ~/workspace
  6. git clone --recursive https://github.com/dusty-nv/jetson-inference
  7. cd jetson-inference
  8.  
  9. # build from source
  10. mkdir build
  11. cd build
  12. cmake ../
  13. make
  14.  
  15. # install libraries
  16. sudo make install

【注意】由于Jetson nano服务器均在国外,部分资源需要能够上外网才能可以获取,否则可能安装失败。另外需要安装一下库

  1. sudo apt install libqt4-dev libglew-dev

6. 编译安装ros_deep_learning

  1. # install dependencies
  2. sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher
  3.  
  4. # clone the repo
  5. cd ~/workspace/catkin_ws/src
  6. git clone https://github.com/dusty-nv/ros_deep_learning
  7.  
  8. # make ros_deep_learning
  9. cd ../ # cd ~/workspace/catkin_ws
  10. catkin_make
  11.  
  12. # confirm that the package can be found
  13. rospack find ros_deep_learning
  14. /home/nvidia/workspace/catkin_ws/src/ros_deep_learning

7. 编译安装jetbot_ros

  1. # clone the repo
  2. cd ~/workspace/catkin_ws/src
  3. git clone https://github.com/waveshare/jetbot_ros
  4.  
  5. # build the package
  6. cd ../ # cd ~/workspace/catkin_ws
  7. catkin_make
  8.  
  9. # confirm that jetbot_ros package can be found
  10. rospack find jetbot_ros
  11. /home/nvidia/workspace/catkin_ws/src/jetbot_ros

8. 测试jetbot ROS

打开一个新终端,然后运行ros核心节点

  1. roscore

输出信息如下,则ros正常工作


【注意】roscore核心节点必须保持运行状态,否则其他所有的节点都不能工作

运行电机节点

另外再打开一个终端,roscore节点不要关闭。运行如下命令启动jetbot_motors节点

  1. rosrun jetbot_ros jetbot_motors.py

再新建一个终端,输入rosnode list可以查看jetbot_motors节点是否启动。输入rostopic list可以查看jetbot_motor节点监听的话题


【注意】到2019/02/22为止, jotbot-ros只实现cmd_str方法,后续如果有其他更新,可以自行了解

cmd_str 通过发送字符串命令 (left/right/forward/backward/stop)控制jetbot运动。

测试电机命令

打开一个新的终端,运行如下测试命令可以控制jetbot运动

  1. rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "forward"
  2. rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "backward"
  3. rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "left"
  4. rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "right"
  5. rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "stop"

使用OLED显示信息

新建一个终端运行OLED节点

  1. rosrun jetbot_ros jetbot_oled.py

jetbot_oled 监听/jetbot_oled/user_text话题,接受字符信息并显示。运行如下命令显示“HELLO”字符 rostopic pub /jetbot_oled/user_text std_msgs/String --once "HELLO!"

使用键盘控制jetbot移动

新建一个终端运行teleop_key节点

  1. rosrun jetbot_ros teleop_key.py

程序运行后通过键盘输入W、S、D、A四个按键控制jetbot前后左右移动

使用游戏摇杆控制jetbot移动

将游戏手柄的USB接收器插到jetbot 新建一个终端输入以下命令

  1. ls /dev/input

显示如下:


其中的js0就是代表游戏摇杆手柄,输入如下命令测试设备是否正常工作

  1. sudo jstest /dev/input/js0


遥控手柄按下不同的按键,对应的按键值会改变.

【注意】如果运行命令后提示jstest命令找不到则需要运行如下命令安装对应的库。

  1. sudo apt-get install joystick

安装joy包,并启动joy节点。要获得通过ROS发布的摇杆数据,我们需要启动joy节点。

  1. sudo apt-get install ros-melodic-joy
  2. rosrun joy joy_node

显示信息如下:


新建一个终端运行如下命令显示joy节点信息

  1. rostopic echo joy

当按下游戏摇杆按下时,会输出类似如下的信息


其中axes[ ]表示摇杆的数据,buttons[ ]表示按键的数据

此时操作游戏手柄虽然可以显示ros发布的数据,但是要不能遥控jetbot。还需要运行teleop_joy节点,接收joy节点发布的话题信息,转换为/jetbot_motor/ cmd_str话题再发给jetbot_motors节点控制电机运动。新建一个终端运行如下命令启动终端teleop_joy节点。

  1. rosrun jetbot_ros teleop_joy.py

安装游戏手柄的A键,然后控制上下左右方向键既可以控制jetbot移动,松开A键,jetbot则停止。

修改jetbot_ros/scripts/teleop_joy.py程序中 axes[ ]和 buttons[ ] 的值可以设置不同的按键控制。


使用摄像头实时监控

启动jetbot_camera节点,启动jetbot摄像头视频流

  1. rosrun jetbot_ros jetbot_camera

将会发布图像格式为sensor_msgs::Image 的话题 jetbot_camera/raw

运行如下命令显示摄像头图像。

  1. rosrun rqt_image_view rqt_image_view

会显示如下窗口,选择话题为/jetbot_camera/raw


注意:此命令需要在图形界面下运行。可以在电脑端通过虚拟机安装ubuntu系统并安装ROS.

Jetbot 在~/.bashrc 文件最后面添加下面两行语句

  1. export ROS_HOSTNAME=jetbot.local
  2. export ROS_MASTER_URI=http://jetbot.local:11311

Ubuntu 系统在 ~/.bashrc 文件最后面添加下面两行语句

  1. export ROS_HOSTNAME=ubuntu.local
  2. export ROS_MASTER_URI=http://jetbot.local:11311

这样jetbot 和ubuntu虚拟机就可以通过ros节点通讯了,这样就可以在电脑端通过ubuntu虚拟机运行rqt_imge_view命令查看jetbot摄像头的实时图像了。