導航之前,最關鍵的動作是要讓底盤動起來。 支援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 %}