Android & OringinBot (二)- 搖桿控制
前提
在上一篇文章中已經(jīng)編譯好了ROS2的Android版本,并成功實現(xiàn)了一個發(fā)布訂閱的測試程序?,F(xiàn)在可以開始使用ROS2的Android版本開發(fā)APP來控制OriginBot的運動了。
搖桿控件
這里控件首選當然是搖桿,不過像這種控件一般都不是現(xiàn)成的,屬于自定義控件。當然肯定會有Android開發(fā)人員寫好的,為了節(jié)約時間就不搞重復開發(fā)了,直接在網(wǎng)上找到一個:https://github.com/simpafac/virtual-joystick-android
控件就長下面這樣:

只需要將JoystickView.java添加到自己的項目中調(diào)用就可以了。首先在layout目錄下的xml文件中加入控件:
在上面的代碼中還可以調(diào)整搖桿控件的屬性,比如顏色、大小、排列等等。其調(diào)用方式也和Android上的控件調(diào)用方式一致,比如在MainAcitivity.java中調(diào)用:
消息與控制
ROS2中用于控制的消息依然是geometry_msgs/msg/Twist,包含兩個子消息:Vector3類型的linear和angular,分別表示線速度和角速度。OriginBot屬于差速小車,只需要控制X軸的線速度和Z軸的角速度即可。
同時搖桿擁有兩個控制變量,分別是推動角度和推動力度,我們假設(shè)小車的最大線速度為max_v,最大角速度為max_a,搖桿推動到某點時的角度為angle,力度為strength;則當前小車的線速度和角速度分別為:
這里strength除了個100是因為它做了一個小數(shù)點后兩位乘100取整數(shù)的操作,目的是為了方便直觀的調(diào)整參數(shù)。
將此關(guān)系式寫入搖桿推動的觸發(fā)函數(shù)里,然后傳遞給發(fā)布者,并用兩個TextView顯示當前的線速度和角速度:
由于在OriginBot小車上以攝像頭的安裝位置為前方,所以當前的線速度和角速度需要做一個方向上的調(diào)整;通過設(shè)定正負值即可調(diào)整方向。
這里我們單獨寫一個控制節(jié)點來發(fā)布Twist消息:
然后在mainActivity中添加節(jié)點,并設(shè)定與OriginBot中相同的話題名稱:
一般來說為了方便調(diào)節(jié)控制小車的速度,還需要有設(shè)置最大線速度和最大角速度的功能;這里使用兩個SeekBar控件來控制;我這里設(shè)置默認最大線速度為0.5m/s,最高1m/s;最大角速度為0.3rad/s,最高0.5rad/s;這幾個數(shù)值可以根據(jù)小車的具體情況進行更改設(shè)置。如下setMaxVelocity函數(shù)實現(xiàn):
在上面的代碼中我還添加了兩個Toast提示開始設(shè)置和完成設(shè)置,如果不需要可以忽略。
編譯過程
編譯過程中需要注意以下幾點:
將上一篇文章中編譯好的ROS2相關(guān)的jar文件放入app/libs目錄,必須包括geometry_msgs_messages.jar文件。
將編譯好的ROS2相關(guān)的庫文件放入app/src/main/jniLibs/arm64-v8a,必須包括geometry_msgs_messages相關(guān)庫文件。
在app/build.gradle文件中加入:
結(jié)果展示
APP的運行界面如下:

推動搖桿后發(fā)布/cmd_vel話題,可以在同一網(wǎng)段下的PC端以及OriginBot的終端查看發(fā)布的消息:

同時啟動OriginBot的底層控制,上下推動搖桿可看到小車前后移動,左右推動搖桿可看到小車旋轉(zhuǎn),推動搖桿的距離變化可以放慢或加快小車的速度,設(shè)置最大線/角速度可以改變速度的調(diào)整范圍。
在測試過程中,直觀上看,手機和小車之間的控制是非常流暢的,和使用藍牙手柄控制相比沒有太大的區(qū)別,至此我的目的也達到了。
總結(jié)延伸
在這篇文章中,我實現(xiàn)了APP內(nèi)搖桿控制小車運動,但是那么大的手機界面只用來實現(xiàn)搖桿控制未免太過單調(diào);可以看到我將APP的界面設(shè)置為橫屏顯示,目的就是為了獲取OriginBot小車的一些數(shù)據(jù)顯示在空余界面上;那么下一篇文章就來聊聊如何實現(xiàn)這個功能。