JetBot AI Kit 教程八、ROS

来自丢石头百科

JetBot AI Kit 教程目录

1. 前言

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

2. 前期准备

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

3. 安装melodic版本ROS

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

# enable all Ubuntu packages:
sudo apt-add-repository universe
sudo apt-add-repository multiverse
sudo apt-add-repository restricted

# add ROS repository to apt sources
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://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

# install ROS Base
sudo apt-get update
sudo apt-get install ros-melodic-ros-base

# add ROS paths to environment
sudo sh -c 'echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc'

添加i2c到user用户组

sudo usermod -aG i2c $USER

4. 创建catkin工作空间

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

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

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

# create the catkin workspace
mkdir -p ~/workspace/catkin_ws/src
cd ~/workspace/catkin_ws
catkin_make

# add catkin_ws path to bashrc
sudo sh -c 'echo "source ~/workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc'

5. 编译安装jetson-inference

# git and cmake should be installed
sudo apt-get install git cmake

# clone the repo and submodules
cd ~/workspace
git clone -b onnx https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init

# build from source
mkdir build
cd build
cmake ../
make

# install libraries
sudo make install

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

sudo apt install libqt4-dev libglew-dev

6. 编译安装ros_deep_learning

# install dependencies
sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher

# clone the repo
cd ~/workspace/catkin_ws/src
git clone https://github.com/dusty-nv/ros_deep_learning

# make ros_deep_learning
cd ../    # cd ~/workspace/catkin_ws
catkin_make

# confirm that the package can be found
rospack find ros_deep_learning
/home/nvidia/workspace/catkin_ws/src/ros_deep_learning

7. 编译安装jetbot_ros

# clone the repo
cd ~/workspace/catkin_ws/src
git clone https://github.com/waveshare/jetbot_ros

# build the package
cd ../    # cd ~/workspace/catkin_ws
catkin_make

# confirm that jetbot_ros package can be found
rospack find jetbot_ros
/home/nvidia/workspace/catkin_ws/src/jetbot_ros

8. 测试jetbot ROS

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

roscore

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

JetBot AI Kit Manual 35.jpg

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

运行电机节点

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

rosrun jetbot_ros jetbot_motors.py

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

JetBot AI Kit Manual 36.jpg

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

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

测试电机命令

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

rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "forward"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "backward"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "left"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "right"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "stop"

使用OLED显示信息

新建一个终端运行OLED节点

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节点

rosrun jetbot_ros teleop_key.py

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

使用游戏摇杆控制jetbot移动

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

ls /dev/input

显示如下:

JetBot AI Kit Manual 37.jpg

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

sudo jstest /dev/input/js0
JetBot AI Kit Manual 38.jpg

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

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

sudo apt-get install joystick

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

sudo apt-get install ros-melodic-joy
rosrun joy joy_node

显示信息如下:

JetBot AI Kit Manual 39.jpg

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

rosrun echo joy

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

JetBot AI Kit Manual 40.jpg

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

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

rosrun jetbot_ros teleop_joy.py

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

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

JetBot AI Kit Manual 41.jpg

使用摄像头实时监控

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

rosrun jetbot_ros jetbot_camera

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

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

rqt_imge_view

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

JetBot AI Kit Manual 42.jpg

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

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

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

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

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

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