Skip to content

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)