欢迎光临散文网 会员登陆 & 注册

Android & OringinBot (二)- 摇杆控制

2023-03-31 11:28 作者:古月居GYH  | 我要投稿

前提

在上一篇文章中已经编译好了ROS2的Android版本,并成功实现了一个发布订阅的测试程序。现在可以开始使用ROS2的Android版本开发APP来控制OriginBot的运动了。

摇杆控件

这里控件首选当然是摇杆,不过像这种控件一般都不是现成的,属于自定义控件。当然肯定会有Android开发人员写好的,为了节约时间就不搞重复开发了,直接在网上找到一个:github.com/simpafac/vir

控件就长下面这样:

只需要将JoystickView.java添加到自己的项目中调用就可以了。首先在layout目录下的xml文件中加入控件:


在上面的代码中还可以调整摇杆控件的属性,比如颜色、大小、排列等等。其调用方式也和Android上的控件调用方式一致,比如在MainAcitivity.java中调用:

消息与控制

ROS2中用于控制的消息依然是geometry_msgs/msg/Twist,包含两个子消息:Vector3类型的linear和angular,分别表示线速度和角速度。OriginBot属于差速小车,只需要控制X轴的线速度和Z轴的角速度即可。

同时摇杆拥有两个控制变量,分别是推动角度和推动力度,我们假设小车的最大线速度为max_v,最大角速度为max_a,摇杆推动到某点时的角度为angle,力度为strength;则当前小车的线速度和角速度分别为:

这里strength除了个100是因为它做了一个小数点后两位乘100取整数的操作,目的是为了方便直观的调整参数。

将此关系式写入摇杆推动的触发函数里,然后传递给发布者,并用两个TextView显示当前的线速度和角速度:

由于在OriginBot小车上以摄像头的安装位置为前方,所以当前的线速度和角速度需要做一个方向上的调整;通过设定正负值即可调整方向。

这里我们单独写一个控制节点来发布Twist消息:

然后在mainActivity中添加节点,并设定与OriginBot中相同的话题名称:

一般来说为了方便调节控制小车的速度,还需要有设置最大线速度和最大角速度的功能;这里使用两个SeekBar控件来控制;我这里设置默认最大线速度为0.5m/s,最高1m/s;最大角速度为0.3rad/s,最高0.5rad/s;这几个数值可以根据小车的具体情况进行更改设置。如下setMaxVelocity函数实现:

在上面的代码中我还添加了两个Toast提示开始设置和完成设置,如果不需要可以忽略。

编译过程

编译过程中需要注意以下几点:

  • 将上一篇文章中编译好的ROS2相关的jar文件放入app/libs目录,必须包括geometry_msgs_messages.jar文件。

  • 将编译好的ROS2相关的库文件放入app/src/main/jniLibs/arm64-v8a,必须包括geometry_msgs_messages相关库文件。

  • 在app/build.gradle文件中加入:

结果展示

APP的运行界面如下:

推动摇杆后发布/cmd_vel话题,可以在同一网段下的PC端以及OriginBot的终端查看发布的消息:

同时启动OriginBot的底层控制,上下推动摇杆可看到小车前后移动,左右推动摇杆可看到小车旋转,推动摇杆的距离变化可以放慢或加快小车的速度,设置最大线/角速度可以改变速度的调整范围。

在测试过程中,直观上看,手机和小车之间的控制是非常流畅的,和使用蓝牙手柄控制相比没有太大的区别,至此我的目的也达到了。


总结延伸

在这篇文章中,我实现了APP内摇杆控制小车运动,但是那么大的手机界面只用来实现摇杆控制未免太过单调;可以看到我将APP的界面设置为横屏显示,目的就是为了获取OriginBot小车的一些数据显示在空余界面上;那么下一篇文章就来聊聊如何实现这个功能。

Android & OringinBot (二)- 摇杆控制的评论 (共 条)

分享到微博请遵守国家法律