JetBot ROS AI Kit 教程四、配置多机通讯和添加串口

来自Waveshare Wiki
跳转至: 导航搜索

JetBot ROS AI Kit 新手教程目录

前言

  • 在配置多机通讯前需要理解下面三个系统:
    • PC主机:一般为我们常用的电脑,系统一般为Windows系统,主要用来SSH远程登录jetson nano启动机器人控制节点。
    • Ubuntu虚拟机:在我们的PC主机上采用VMware软件安装的Ubuntu系统虚拟机,主要实现ROS图形化显示,远程控制机器人,更加直观方便。
    • jetson nano机器人:这个就是我们的小车,采用jetson nano主控,也为ubuntu系统,主要为实现机器人摄像头,激光雷达,底盘控制等各种节点。
  • jetson nano机器人安装ROS机器人系统,设置为主机。Ubuntu虚拟机也安装ROS机器人系统内,设置为从机。
  • 【注意:我们需要确保上面三个系统连接同一个局域网,IP地址为同一网段,否则不能正常通讯】
  • 【注意:之后的教程中默认虚拟机指的为Ubunntu虚拟机,机器人指jetson nano机器人】

步骤1、设置变量实现多机通讯

  • 在之前的教程中,我们已经支持机器人和虚拟机的IP地址和主机名称,如果不清楚可以运行如下命令查看
ifconfig        #获取虚拟机ip地址
hostname        #获取虚拟机主机名
  • 使用我们的镜像则机器人主机名为nano-4gb-jp45,虚拟机主机名为ubuntu
  • 我们需要分别给机器人和虚拟机添加环境变量,将机器人设置为主机。虚拟机设置为从机。使用我们的镜像已经此设置,不需要再添加。
    • ROS_MASTER_URI 变为指向ROS主机,独立运行roscore主节点。
    • ROS_HOSTNAME 变量为当前ROS主机名称

【注意:添加文本后需要运行source ~/.bashrc 或者新开终端环境变量才能生效】

机器人

  • 在~/.bashrc 文件末尾添加如下文本,如果实际hostname为其他名称则替换nano-4gb-jp45
export ROS_MASTER_URI=http://nano-4gb-jp45:11311    #将机器人设置为主机
export ROS_HOSTNAME=nano-4gb-jp45

虚拟机

在~/.bashrc 文件末尾添加如下文本,ROS_MASTER_URI 设置指向机器人作为主机,ROS_HOSTNAME设置为虚拟机hostname

export ROS_MASTER_URI=http://nano-4gb-jp45:11311   #指向机器人主机
export ROS_HOSTNAME=ubuntu

步骤3、配置hosts文件,指明IP地址

  • 正常情况下,添加环境变量后ROS应该是可以正常联机通讯的了,如果局域网内有多个设备名称一样的,有可能出现不能正常连接或者可以正常查看话题但是不能接收话题信息等问题。此时需要添加hosts指定地址。
  • 我们需要分别给机器人和虚拟机添加honst文件设置

机器人

  • 在机器人上打开终端输入以下命令,将Ubuntu虚拟机的ip地址和主机名添加到jetson nano的 /etc/hosts 文件中,密码是:jetbot
  • 【 编辑器可用nano ,也可以使用vim,根据个人习惯选择文本编辑器】
sudo nano /etc/hosts    
  • 如下图所示,将127.0.1.1 nano-4gb-jp45.localdimain nano-4gb-jp45下面的那行修改为ubuntu虚拟机的ip和hostname【如果这行被注释掉了需要取消注释】
Jetbot Image05.png
Jetbot image06.png
  • 如果 nano 命令无法执行,请输入以下命令安装nano编辑器 ,安装完之后可以再次执行命令:sudo nano /etc/hosts
sudo apt install nano     #安装nano编辑器   
  • 修改后,按Ctrl+x,退出y, 回车,保存变更并退出

虚拟机

  • 在虚拟机上打开终端输入以下命令,打开/etc/hosts 文件中添加机器人IP地址
sudo nano /etc/hosts    
  • 如下图所示,将 127.0.1.1 ubuntu下面那行要改为jetson nano的ip和hostname,如果这行被注释掉了需要取消注释。
Jetbot image04.png
  • 修改后,按Ctrl+s保存,按Ctrl+c退出,点击Yes并回车


步骤5、检验ROS多机通讯

  • SSH连接机器人打开终端,输入以下命令启动机器人主节点
roscore      #启动机器人主节点  
Jetbot image09.png
  • 打开Ubuntu虚拟机终端,在终端输入以下命令
rostopic list   
  • 如下正常显示这两个节点大概率是可以正常联机通讯了。
Jetbot image001.png
  • 保持机器人主节点正常运行,然后按“Ctrl + Alt +t”重新打开一个终端并输入以下命令进行登录
ssh jetbot@jetbot_ip     #这里jetbot_ip是你的小车ip地址
Jetbot3.png
  • 输入以下命令启动机器人底盘节点
roslaunch jetbot_pro jetbot.launch     #启动机器人底盘节点  
Jetbot image10.png

【下述 roslaunch 命令也会自动启动主节点,但这里单独启动主节点是为了一直都保持与虚拟机连接,否则关闭底盘节点时会自动关闭主节点,从而导致虚拟机失联】

步骤6、打开Ubuntu虚拟机终端,检验多机通讯连接正常

  • 打开Ubuntu虚拟机终端,在终端输入以下命令
rostopic list   
  • 运行代码后若出现下图所示内容,则说明多机通讯成功;若无法连接,则重新检查上面步骤中ip和hostname是否填错或者是否连接同一WiFi
Jetbot image11.png
  • 其中:
    • /cmd_vel 为机器人控制机器人运动速度话题
    • /imu 为机器人IMU话题
    • /motor/* 四个话题表示左右电机的实际编码速度和设置速度
    • /odom 为机器人编码里程计
    • /odom_combined 为机器人融合里程计,由编码里程计融合IMU数据所得。

步骤4、添加串口用户组

  • 在jetson nano 中输入命令 ls /dev ,查看驱动板是否正常连接jetbot ,是否有发现ttyACM0,ttyACM1设备【其中ttyACM0 用于与主板通讯,ttyACM1用于与雷达通讯】
 ls /dev    
Jetbot image07.png
  • 输入以下命令,添加串口用户组,否则没有权限操作串口
 ls -l /dev/ttyACM*            #查看串口用户组为 dialout
 id -Gn                        #查看当前用户所在的用户组,第一个为当前用户
 sudo adduser jetbot dialout   #将当前用户加入到串口所在的用户组dialout
Jetbot image08.png
  • 输入命令 sudo reboot 进行重启,密码是jetbot【注意:重启之后才可使上述添加命令生效,且当没有串口权限时,开机后机器人底盘节点会一直报错】
sudo reboot    #重启jetson nano   
  • 重启之后,等待两次蜂鸣器提示后,按“R”重新登录,输入密码:jetbot。