HUSKY A200介绍
赫斯基(Husky)是一款坚固耐用,可在户外使用的无人机(UGV),适用于研究和快速成型应用。本文主要介绍从硬件到软件怎么构造husky a200机器人的导航功能。
说明:本文适合有Linux和ROS一定基础的读者阅读,主要为了阐述整个导航过程的配置都需要做什么,如果读者实际做的过程中遇到了问题,就针对问题百度、google或者优快云去查一下具体的问题出在哪儿,毕竟不可能把每一步遇到的问题都在写在文中。
硬件层面
要实现机器人的导航功能,就需要一系列的硬件,包括机器人的主机、传感器、无线网卡等,整个车搭建完之后如下图所示。

机器人主机有两个选择,一个是husky机器人自带的MINI-ITX主机,另一个选择是NVIDAI公司的jetson tx2;本文使用MINI-ITX主机,改主机的缺点是没有GUI界面,只有一个终端,因此需要利用多机通讯来配置机器人的导航功能;如果你想使用jetson tx2,你可以参照husky官网了教程来进行配置。
链接: husky官方.
要实现导航功能,就必须使用传感器的数据,本次导航的实现使用的传感器有:日本北洋的hokuyo激光雷达、imu_um7、Load MicroStrain 3DM-GX3陀螺仪、机器人的轮式编码器(封装在车中)。
主机:

激光雷达:

注意hokuyo的供电电压是12V,机器人里有12V的供电口,如果没有单独的电源,可以去店订制相应的线给激光雷达供电。
惯性传感器:

无线网卡就使用买机器人时提供的无线网卡,不要用自己的无线网卡,husky可能无法驱动。整个硬件系统组装起来后上文所示。
软件层面
注:该部分的讲解需要读者有一定的Linux命令行以及ROS的基础,关于Linux命令行的基础主要掌握一些对于文件的操作,ROS主要是了解节点、话题、服务等名词的含义以及ROS的通讯机制。ROS的安装以及基本的教程本文不加赘述,可参照ROS官方的教程。
链接: ROS官方教程.
重装系统
首先第一步就是重装MINI-ITX系统,具体的方法在上文husky 的官网连接里都有说明,建议装Ubuntu16或者Ubuntu18这两个版本。这里主要强调几个需要注意的地方:
备份主机:
官方教程有很多备份当前系统的方法,比如做成ISO镜像,里面的方法有的也比较复杂,所以不建议备份整个系统,这里主要需要备份两个文件夹,interfaces文件里面配置了机器人的无线网卡与WIFI的连接(配置完成之后就不用每次都在终端重新输入命令行来配置网络),第二个文件夹里面包含了机器人开机之后会自动启动的ROS节点这两个文件如果不备份的话重装系统之后系统开机将不会有任何的ROS信息(通讯指示灯为红色)。如果需要自定义自己的启动文件这里就必须注意没多一个launch文件,就要在.installed_files文件中加入对应的文件名(顺序也必须对应),不然机器人就无法通讯(通讯指示灯为红色)。网络环境的配置就按照备份文件的配置即可。
文件:
| 位置 | 描述 |
|---|---|
| /etc/network/interfaces | 机器人的网络环境配置 |
| /etc/ros/kinetic/ros.d/*.launch | 机器人开机自启动文件 |
开机自启动文件夹:

配置自启动的launch文件:

网格配置(interfaces文件):
// 文件配置,启动了一个无线网卡,输入需要连接的wifi名字以及wifi密码
auto wlan0
iface wlan0 inet dhcp
wpa-ssid HIT_E304_2.4G
wpa-psk zhinengjiqiren
重装主机
下面的链接里有Ubuntu16的ISO镜像文件,重装的过程主要分成以下几个步骤:
链接: ISO镜像文件.
-
下载镜像文件;
-
使用刻录镜像文件的软件刻录镜像到自己的U盘当中(这个过程和装双系统Ubuntu的过程很相似),楼主使用的是UltraISO,刻录的方法与刻录Ubuntu系统的方法一样,这里不加赘述;

-
开始重装系统,插入U盘,MINI-ITX进行BIOS界面的方法是按F5,进入BIOS界面之后选择自己的U盘,然后一直跟着提示走就行,重装的过程中保证机器人一直在有网的状态下进行(使用网线连接),持续的时间可能会比较久,建议将机器人充满电之后重装;
-
测试机器人的通讯,确保所有的外设都连接在机器人上。给机器人装一个显示器和一个键盘,开机,机器人的用户名是administrator,密码是clearpath。在终端进行下列操作:
连接外围设备:
rosrun husky_bringup install
要测试您的配置,请使用以下命令启动后台服务:
sudo systemctl start ros
沙哑的COMM指示灯应从红色变为绿色;
矫正磁力计,husky将在校准过程中自动旋转。确保拔下所有外部电缆,并且哈士奇在1米半径范围内有无障碍的移动空间。这里必须通过ssh在Husky计算机上远程执行校准脚本(在下文有具体介绍):
rosrun husky_bringup calibrate_compass
至此,机器人硬件部分介绍完毕。
导航配置
机器人软件层面主要介绍,husky多机通讯、远程控制的配置以及机器人导航功能的配置。
husky远程控制
使用ssh工具实现远程控制,使用自己的电脑作为客户端;把机器人当作服务器,打开客户端的Ubuntu终端下载ssh客户端:
sudo apt-get install openssh-client
启动客户端和服务器ssh:
sudo /etc/init.d/ssh start
在客户端终端输入以下命令行进行远程控制:
//ssh 客户端用户名@服务器ip地址
ssh administrator@192.168.1.196
输入服务器密码即可远程控制服务器。
ROS多机通讯
要更改客户端(以下称主机)和服务器(以下称机器人)的网络配置文件。
1.配置主机:
首先你要知道主机的名字和ip地址,查询的方法如下:
//lm-QiTianM5900-D134就是你的主机名字——主机名字
lm@lm-QiTianM5900-D134:~$ hostname
lm-QiTianM5900-D134
//inet 地址:192.168.1.153就是你的ip地址——主机ip
lm@lm-QiTianM5900-D134:~$ ifconfig
enp4s0 Link encap:以太网 硬件地址 f4:4d:30:7a:75:99
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:2279 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2279 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:277296 (277.2 KB) 发送字节:277296 (277.2 KB)
wlx08beac06a35d Link encap:以太网 硬件地址 08:be:ac:06:a3:5d
inet 地址:192.168.1.153 广播:192.168.1.255 掩码:255.255.255.0
inet6 地址: fe80::2ac0:ba1f:487f:a7d0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:100240 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:56889 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:49196840 (49.1 MB) 发送字节:8705596 (8.7 MB)
当然机器人的名字、机器人ip查询方法一致。接下来配置你的主机,打开主机的两个文件并在两个文件分别加入以下语句:
// 打开文件
lm@lm-QiTianM5900-D134:~$ sudo vim ~/.bashrc
//文件末端加入下列行
export ROS_HOSTNAME=主机名字
export ROS_MASTER_URI=http://机器人ip:11311
//打开hosts文件
lm@lm-QiTianM5900-D134:~$ sudo vim /etc/hosts
//文件相应位置添加以下语句
27.0.0.1 localhost
127.0.1.1 lm-QiTianM5900-D134
主机ip 主机名字
机器人ip 机器人名字//这两行是添加进来的
//例如
//192.168.1.153 lm-QiTianM5900-D134
//192.168.1.196 lm.lm lm
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
接下来配置机器人文件:
//打开hosts文件
administrator@lm:~$ sudo vim /etc/hosts
//文件相应位置添加以下语句
127.0.0.1 localhost
127.0.1.1 lm.lm lm
机器人ip 机器人名字
主机ip 主机ip//这两句是添加进来的
//例如
//192.168.1.196 lm.lm lm
//192.168.1.153 lm-QiTianM5900-D134
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
到这里为止,你已经可以用自己的主机控制机器人,还能在自己的主机上查看到机器人运行的一些ROS话题等内容。
导航功能的配置
这里解释一下多机通讯和远程控制的区别,远程控制(ssh)目前只是让你可以在自己的主机上去控制机器人,多机通讯是指主机和机器人之间进行ROS通讯,为什么要进行通讯呢?回到文中开头提到的MINI-ITX主机没有GUI界面只有一个终端,当我们配置好导航功能包之后运行整个程序,这时候能看到机器人终端会有一些代码提示,这不方便我们配置导航的一些参数,所以我们需要使用ROS中一个强大的可视化工具——RVIZ,让机器人的数据包括地图信息等内容显示在可视化的界面中。但是机器人主机的ROS没有RVIZ这个功能,因为它只有终端,所以要让机器人和主机进行通讯,在主机上能得到机器人的ROS信息并使用主机的RVIZ去显示机器人的数据,方便我们配置导航功能。
希望读者在实际操作之前去wiki认真学习以下move_base导航的配置功能,楼主这里贴一个古月居的教程,大概知道整个流程就行:
链接: move_base教程.
为了更好的去实现实物导航功能,可以先去跑一下导航仿真,最好是用源码安装的方法去跑而不是apt install功能包跑。仿真的方法在husky官网中也有介绍,当然官网是用功能包去运行的仿真,读者可以下载源码来运行,这里不加赘述,官网链接在上文:

- 在机器人系统中创建工作空间:
//创建工作环境
mkdir -p ~/husky_kinetic_ws/src
cd ~/husky_kinetic_ws/
//编译工作环境
catkin_make
- 源码安装本次导航所需要使用的算法放在工作空间下:
//注:以下源码都需要切换分支到适合ubuntu16.04 + ROS kinetic的版本,git切换分支的方法不加赘述。
//关于husky机器人一些基本功能的配置,里面包含了仿真的实物需要的一些配置
git clone https://github.com/husky/husky.git
//导航的关键,这个包里面有关于机器人(amcl)定位、规划所需要的源码
git clone https://github.com/ros-planning/navigation.git
//hokuyo的驱动包
git clone https://github.com/ros-drivers/urg_node
//回到工作空间进行编译,相信编译大概率会报错,读者根据报错的信息去下载所需要的软件包即可。
cd ~/husky_kinetic_ws/
catkin_make
- 首先是创建地图(在这个部分读者顺便学习一些雷达驱动的方法),以下链接介绍了从驱动雷达到使用hector_slam算法建图的方法,建图过程中建议使用自己的笔记本手拿着激光建图,不用机器人。当然这篇文章使用的是hokuyo_node来驱动的雷达,上文提到的使用urg_node包来驱动,二者均可。驱动雷达只是为了让计算机能得到雷达的扫描数据也不用对雷达数据进行处理。建图的过程如果你对ROS不是很熟悉,那还是别用slam_gmapping建图,因为这种建图方法需要里程计数据,而hector_slam不用里程计数据。
链接: hector_slam.
建图完之后保存地图即可:
rosrun map_server map_saver -f mymap
- 配置机器人的导航功能,简单来说就是把这些包都串起来即可。
// 写导航配置的功能包
cd ~/husky_kinetic_ws/src/husky_navigation/launch
sudo vim test.launch
//把以下代码放入到该文件中
<launch>
<!-- -->
<arg name="model" />
<arg name="gui" default="False" />
<!-- 启动机器人的urdf描述,机器人本身的静态tf变换都写在这里面 -->
<arg name="robot_namespace" default="/"/>
<arg name="laser_enabled" default="$(optenv HUSKY_LMS1XX_ENABLED false)"/>
<arg name="realsense_enabled" default="$(optenv HUSKY_REALSENSE_ENABLED false)"/>
<arg name="urdf_extras" default="$(optenv HUSKY_URDF_EXTRAS)"/>
<param name="robot_description" command="$(find xacro)/xacro '$(find husky_description)/urdf/husky.urdf.xacro'
--inorder
robot_namespace:=$(arg robot_namespace)
laser_enabled:=$(arg laser_enabled)
realsense_enabled:=$(arg realsense_enabled)
urdf_extras:=$(arg urdf_extras)
" />
<!-- 启动激光雷达,注意一般计算机上的串口是/dev/ttyACM0,但是husky的串口名字有可能是/dev/ttyACM1,如果驱动不上就换一个串口试试 -->
<node name="urg_node" pkg="urg_node" type="urg_node" output="screen">
<param name="serial_port" type="string" value="/dev/ttyACM1" />
<param name="frame_id" type="string" value="base_laser" />
</node>
<!-- 启动激光雷达到机器人自身坐标系的坐标变换 -->
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.3 0.0 0.35 0.0 0.0 0.0 /base_link /base_laser 50" />
<!-- 启动机器人的静态tf变换,这些变换在机器人的urdf文件中已经写过 -->
<node name = "robot_state_publisher" pkg = "robot_state_publisher" type = "state_publisher">
<param name = "publisher_frequency" value = "20.0"/>
</node>
<node name = "joint_state_publisher" pkg = "joint_state_publisher" type = "joint_state_publisher">
<param name = "use_gui" value = "False"/>
<param name = "rate" value = "20.0"/>
</node>
<!-- 该包可能融合传感器数据生成一个新的里程计数据,可用可不用 -->
<!--node pkg = "robot_pose_ekf" type = "robot_pose_ekf" name = "robot_pose_ekf">
<remap from = "robot_pose_ekf/odom_combined" to = "odom_combined"/>
<param name = "freq" value = "10.0"/>
<param name = "sensor_timeout" value = "1.0"/>
<param name = "publish_tf" value = "true"/>
<param name = "odom_used" value = "true"/>
<param name = "imu_used" value = "true"/>
<param name = "vo_used" value = "false"/>
<param name = "output_frame" value = "odom"/>
<param name="use_sim_time" value="false" />
</node-->
<!-- 加载地图,在上面建图完成保存之后会有两个文件 -->
<arg name="map" default="sys_mapping.yaml" />
<node name="map_server" pkg="map_server" type="map_server" args="$(find cbh)/maps/$(arg map)" />
<!-- 注意这里的地图位置自己决定放在哪儿 -->
<!-- 加载一个定位工作,该包通过融合机器人的传感器数据得到机器人odom坐标系到机器人base_link坐标系的坐标变换 -->
<node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization">
<rosparam command="load" file="$(find cbh)/configs/localization.yaml" />
</node>
<!-- 启动move_base包,该包主要完成机器人导航的路径规划部分 -->
<include file="$(find husky_navigation)/launch/move_base.launch" />
<!-- 启动amcl定位功能包 -->
<include file="$(find husky_navigation)/launch/amcl.launch" />
</launch>
到此为止,机器人的导航功能配置就结束了,接下来测试一下你的导航功能包吧。
cd ~/husky_kinetic_ws/
source devel/setup.bash
roslaunch husky_navigation test.launch
如果运行结果没报错,那恭喜你,你的导航功能配置成功了,当然这里说一句,这些都是通过ssh远程控制机器人的终端下实现的,接下来使用主机运行RVIZ。
rosrun rviz rviz
怎么在你的主机配置你的rviz功能呢?下面这个wiki链接教你怎么配置rviz中所需要显示的数据。
链接: RVIZ配置.
本文详细介绍了如何配置HUSKY A200机器人的导航功能,从硬件层面的搭建到软件层面的重装系统和导航配置。主要内容包括HUSKY A200的硬件介绍、Ubuntu系统重装、ROS多机通讯、远程控制以及导航功能的配置。适合具备Linux和ROS基础的读者参考。
32

被折叠的 条评论
为什么被折叠?



