Autoware車両制御トピック
【車両制御トピック】
Autowareの車両制御命令は[/twist_cmd]トピックで配信されます。
また、車両の現在速度が[/current_velocity]トピックで配信されます。
twist_cmd.twist.linear.x
が目標速度(m/s)です。
twist_cmd.twist.angular.z
が目標角速度(rad/s)です。
current_velocity.twist.linear.x
が現在速度(m/s)です。
current_velocity.twist.angular.z
が現在角速度(rad/s)です。
トピック監視
次の関数を実行すると、ROSの値取得が開始します。
デフォルトは10Hzで動作しています。
lib/autowarecar.py
1 2 3 4 5 | def listener(self): rospy.init_node('RoboCarROS', anonymous=True) rospy.Subscriber('/twist_cmd', TwistStamped, self.twist_cmd) rospy.Subscriber('/current_velocity', TwistStamped, self.current_velocity) rospy.spin() |
init_node()にはrospyに登録するユニークな名前のノードを指定します。
rospyは一つのノードしか持つことが出来ません。
lib/autowarecar.py
1 | rospy.init_node('UNIQUE_NODE_NAME', anonymous=True) |
次に、更新を監視するトピック名と、更新時に呼び出す関数を指定します。
lib/autowarecar.py
1 2 | rospy.Subscriber('/twist_cmd', TwistStamped, self.twist_cmd) rospy.Subscriber('/current_velocity', TwistStamped, self.current_velocity) |
最後に、ノードが停止するまでpythonを終了させないようにします。
lib/autowarecar.py
1 | rospy.spin() |
目標値
目標値が更新されると、self.wtist_cmd
で指定した関数が呼び出されます。
目標速度の値はvalues.twist.linear.x
になります。
Autoware1.9.1には後進は無いのですが、速度の値がマイナスになることがあります。
すべてプラスの値として使うようにします。
lib/autowarecar.py
1 2 3 | def twist_cmd(self, values): speed = abs(values.twist.linear.x) omega = values.twist.angular.z |
目標角速度はvalues.twist.angular.z
になります。
ラジコンのサーボ制御は0-180度で制御するように書いてあるので、ラジアンを0-180度に変換して反映します。
lib/autowarecar.py
1 | self.set_angle_rad(omega) |
omegaとサーボの動作角は実際には一致しませんが、config.yamlのsteering_rate
を変更して動きを調整します。
config.yaml
1 | steering_rate: 0.5 # for TT-02 Drift |
速度の値はここでは反映しません。実査の速度にしたいため、ここでは目標速度を保持するだけにします。
現在速度
現在速度が更新されると、self.current_velocity
で指定した関数が呼び出されます。
現在速度と目標速度と比較して、速度を上限に変更します。
lib/autowarecar.py
1 2 3 4 5 6 | def current_velocity(self, values): current_velocity = values.twist.linear.x if current_velocity < self.target_speed: self.speed += 1 elif current_velocity > self.target_speed: self.speed -= 1 |
最大速度は100、後進が無いため最低速度は0になります。
lib/autowarecar.py
1 2 3 4 | if self.speed >= 100: self.speed = 100 elif self.speed <= 0: self.speed = 0 |
急発進を抑えるために、現在速度が遅い場合は、最大速度を25に制限します。
lib/autowarecar.py
1 2 | if self.speed > 25 and current_velocity < 0.1: self.speed = 25 |
速度を反映します。
lib/autowarecar.py
1 | self.set_speed(self.speed) |