導航之前,最關鍵的動作是要讓底盤動起來。
支援ROS的底盤大多都有幾個特性:
* 提供專用的底盤Package
* 通常會在底盤運算完odom,由上層轉發到odom(里程計)頻道
* 通常接收cmd_vel頻道的訊息,該頻道訊息為twist格式。
先不論直接接導航的狀況(因為導航會直接把這些訊息吞下去傳送出twist),若我們打算像以前一樣常規控制機器人,就必須知道怎麼送twist訊息--以及這個訊息的意義。
首先我們先觀察twist訊息的格式:
```python
#Vector3 linear
float64 x
float64 y
float64 z
#Vector3 angular
float64 x
float64 y
float64 z
```
可以看出,其中為三軸速度和三軸角速度。放在只需要二維移動的自走車上大致只會使用到3個數值:平面的xy線速度,以及z軸的角速度。
因此我們嘗試撰寫一下基本的twist發送節點:
```python
import rclpy
import time
from rclpy.node import Node
from geometry_msgs.msg import Twist
class move_pub(Node):
def __init__(self):
super().__init__('move_pub')
self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)
self.timer_callback()
def timer_callback(self):
move_type=[(0,0,1),(0,0,-1),(1,0,0),(-1,0,0),(1,0,3)]
for i in move_type:
msg = Twist()
msg.linear.x = float(i[0])
msg.linear.y = float(i[1])
msg.angular.z = float(i[2])
self.publisher_.publish(msg)
time.sleep(1)
if __name__ == '__main__':
rclpy.init()
move_test = move_pub()
move_test.destroy_node()
rclpy.shutdown()
```
這個程式中都是以往節點撰寫看過的老面孔了,比較特殊的就是使用的訊息型別為geometry_msgs的Twist。
而底下的執行部分,我們分別指定了他的xy線速度和z軸角速度,並間隔一秒發出去。程式中指定的五種數值分別代表原地順時針旋轉、逆時針旋轉、前進、後退、向左前方前進五種動作。
我們可以從這個影片中看到細節:
{%youtube EI2oUVw8SFg %}