引言
这次我们要实现的功能是用 g29 方向盘远程控制 Donkey Car 小车运动。
整个系统包括小车平台和 PC 端两部分:
- 小车平台上的设置
- 安装 raspbian 操作系统
- 安装 ROS
- 安装 Donkey Car 相关的 ROS package
- PC 端的设置
- 安装 ROS
- 编写程序提取 g29 方向盘控制命令并发布到 ROS topic 上
基于以上两个平台,设置它们之间的 ROS 通讯,就可以实现远程控制。
下边是具体操作步骤。
小车平台上的安装
虽然可以 ssh 到小车上进行远程设置,但是还是强烈推荐连接上显示器、鼠标、键盘,将 raspberry pi 板子当作一个普通的电脑主机使用,操作起来要方便很多。
以下的安装步骤都是假设已经给 raspberry pi 外接了显示器、鼠标和键盘。我们用的是 raspberry pi 3B+ 。
安装 raspbian 操作系统
第一步是将 sd 卡创建成一个系统启动盘。步骤如下:
- 下载 raspbian 操作系统镜像
目前 raspberry pi 官网提供了最新的 raspbian 版本 buster 。但是出于兼容性方面的考虑,我们选择用不那么新的 stretch 版本。
下载地址 http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2019-04-09/
只需要下载那个 1.9 G 的压缩文件即可。 - 创建启动盘
官网提供了非常详细的安装说明。也可以参考这里,通过命令行的形式烧录和备份镜像文件。如果不习惯用命令行方式,推荐用 Etcher 。 - 最后的安装
有了 sd 卡启动盘,插到 raspberry pi 板子上。通电启动就会进入系统安装界面,跟普通的 ubuntu 系统安装流程类似,不再赘述。
从 sd 卡启动是树莓派的标配,不过也可以从 USB 盘启动。基本方法也是通过 Etcher 将系统镜像文件写入 USB 盘。具体操作可以参考这里。对于最新版的树莓派 3B+,启动的时候只需要 USB 盘,对于旧版的树莓派,还需要 sd 卡做一下引导。
用 USB 做系统盘的好处是存储容量可能比 sd 卡大一些,缺点是暴露在外边,不小心碰到了就可能直接关机了。
安装 ROS
在 raspbian 上安装 ROS 跟 ubuntu 有点区别。raspbian 系统中没有现成的已编译好的 ROS debian package,所以不能简单地用 apt install ros-kinetic-desktop-full 之类的命令安装。我们有两个选择:
- 从源码编译
- 直接用别人分享的 raspbian + ROS 镜像文件
这里我用了源码编译的方式。具体流程如官网所示. 这里不再赘述。
在安装过程中有几个问题需要注意
- 注意 raspbian 的版本,不同的版本安装命令有些区别。我们用的是 stretch 版本。
- 在最后进行如下编译时
sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic
默认编译参数是 -j4 。我们在编译时系统完全卡死。尽管 raspberry pi 板子是 quad-core 的,但整体计算能力还是比较低。为了避免编译死机,可以添加参数-j2
,如果还死机,用-j1
,最终的编译命令为sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 # 或 -j1
- 设置完这一步就可以结束了
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
后边的步骤不需要。
根据我们的经验,整个源码安装过程至少 3 个小时 (用了参数 -j1)。
安装 Donkey Car 相关的 ROS package
本项目用到的 package 都在这里。实际上我们只需要其中两个 package: donkey_car
和 ros-i2cpwmboard
。
只要前一步的 ROS 编译过程没有问题,后边在使用 ROS 时跟普通 ubuntu 上是完全一样的。
基本步骤是创建一个 workspace,把上述两个 package 放进去, catkin_make 编译一下,就可以了。
在编译 ros-i2cpwmboard
时如果出现如下错误
‘i2c_smbus_write_byte_data’ was not declared in this scop
则需要额外安装一个 i2c 工具包
sudo apt-get install libi2c-dev
以上所有流程结束之后可以测试一下:
roslaunch donkey_car keyboard_demo.launch
通过 rqt_graph 可以看到一个 topic /cmd_vel
,此时只要向该 topic 发送控制命令,就可以驱动小车移动了。可以在命令行用rostopic pub
命令向 /cmd_vel
发送数据测试一下。
这里可能有个问题,运行上述 roslaunch 命令之后,在没有任何 topic 信息输入的情况下,车轮的角度可能会偏向一边,而不是朝向正前方。这是因为 donkey_car/src/low_level_control.py
这个文件中设置的参数跟实际小车不太匹配。这个文件中默认 center_value 的 pwm 值为 333,我们的小车设置为 300 时车轮才会朝前。具体搜索 pwm 值的过程可以参考这里。
下一步我们就在 PC 端将 g29 方向盘的操作发布到该 topic 上。
PC 端安装
安装 ROS
PC 端的 ROS 安装比较中规中矩,按照官网步骤安装即可。对于我们这个项目,安装 desktop 就足够了,不需要 desktop-full。当然,安装 desktop-full 肯定也是没有问题的。
转换 g29 操作指令到 ros topic
我们这里用 Node.js 与 g29 通讯,Node.js 既可以提取 g29 的操作输入 (方向盘转角、踏板),也可以反向控制 g29 方向盘。关于反向控制的部分,可以参考我们之前的文章。
下面我们要基于 Node.js 编写 ROS node 文件 g29_pub.js
,实现 g29 控制命令的提取:
#!/usr/bin/env node
'use strict';
const rosnodejs = require('rosnodejs');
const g = require('logitech-g29');
const Twist = rosnodejs.require('geometry_msgs').msg.Twist;
const options = {
autocenter: true,
debug: false,
range: 900
}
const wheel = {
currentPos: 0,
moveToPos: 0,
moved: true
}
var connected = false;
// once g29 is connected, run this function
g.connect(options, function() {
connected = true;
g.forceFriction(0.4);
})
function g29_pub_node() {
rosnodejs.initNode('/g29_pub')
.then((rosNode) => {
if (!connected)
return;
var pub = rosNode.advertise('/cmd_vel', Twist);
const msg = new Twist();
g.on('wheel-turn', function(val){
msg.angular.z = -(val-50.0)/50.0; # 可以按照实际需要,将 g29 转角转换成小车的转角
pub.publish(msg);
})
g.on('pedals-gas', function(val){
msg.linear.x = val * 5; # 可根据需要修改
pub.publish(msg);
})
g.on('pedals-brake', function(val){
msg.linear.x = val * - 5; # 可根据需要修改
pub.publish(msg);
})
})
}
if (require.main === module) {
// Invoke Main Function
g29_pub_node();
}
上述命令创建了名了 g29_pub_node
的 ROS node,可以将 g29 的操作转化成 /cmd_vel
上的命令。
Donkey Car 与 PC 的连接
有了以上两个平台,现在需要配置 ROS 环境,实现两个平台之间的通讯。假设现在两个平台连接到同一局域网里,互相能 ping 通。
我们选择在 PC 端运行 ROS master, 小车远程连到 PC。
- PC 平台:
在~/.bashrc
文件末尾添加如下变量定义:export ROS_IP=<PC IP addrss>
然后重开 terminal ,启动 ROS,运行刚才编写的g29_pub.js
文件。这样就设置好了 g29 方向盘到/cmd_vel
这一部分的连接。可以通过rostopic echo /cmd_vel
查看一下方向盘转动时是否有数据输出。 - 小车平台
类似地,要在~/.bashrc
文件末尾添加如下变量定义:export ROS_IP=<donkey car IP addrss> export ROS_MASTER_URI=http://<PC IP address>:11311
这里不仅要设置本地 IP,还要设置要远程连接的 ROS master 的 IP。设置好以上内容之后,运行如下命令:roslaunch donkey_car keyboard_demo.launch
这就设置好了从/cmv_vel
到小车这一部分的连接。
如果一切顺利,应该可以通过 g29 方向盘远程控制 Donkey Car 运行了。