COBOTTAで書字する

FontBcapCobottaWriter は、KanjiVG由来の配置済みストロークをCOBOTTAの絶対P座標へ変換し、b-CAPで書字します。

基本例

from pathlib import Path

from glyph_motion.lib.font_bcap_cobotta_writer import (
    FontBcapCobottaWriter,
    FontBcapCobottaWriterConfig,
)

config = FontBcapCobottaWriterConfig(
    kanjivg_directory=Path("kanjivg/kanji"),
    host="10.170.10.53",
    port=5007,
    workspace_width=200.0,
    workspace_height=100.0,
    cell_width=8.0,
    cell_height=8.0,
    character_height=7.0,
    curve_division=16,
    pen_lift_mm=1.0,
    robot_x_sign=1.0,
    robot_y_sign=1.0,
    robot_swap_xy=False,
    writing_direction="horizontal",
    line_direction="left_to_right",
    drawing_speed=35,
    travel_speed=40,
    pen_speed=20,
    accel=100,
    decel=100,
)

writer = FontBcapCobottaWriter(config=config)

try:
    if not writer.connect():
        raise RuntimeError("COBOTTAへ接続できない。")
    if not writer.reset_error():
        raise RuntimeError("エラー解除に失敗した。")
    if not writer.take_arm():
        raise RuntimeError("アーム権限取得に失敗した。")
    if not writer.motor_on():
        raise RuntimeError("モータ投入に失敗した。")
    if not writer.set_accel():
        raise RuntimeError("加速度設定に失敗した。")
    if not writer.set_decel():
        raise RuntimeError("減速度設定に失敗した。")

    if not writer.write(
        text="島根大学",
        start_height_mm=1.0,
        return_to_start=True,
    ):
        raise RuntimeError("書字に失敗した。")
finally:
    writer.emergency_lift_pen()
    writer.give_arm()
    writer.disconnect()

書字面の決定

write() 呼び出し時の現在Z座標から start_height_mm を引いた位置が書字面です。

surface_z = start_pose_z - start_height_mm
pen_up_z  = surface_z + pen_lift_mm

開始姿勢が書字面上、すなわち start_height_mm == 0.0 の場合は、その場でペンを上げてから最初の筆画始点へ移動します。開始姿勢が既に書字面より高い場合は、その高さを維持して最初の始点へ移動します。

絶対座標変換

最初の write() の開始姿勢が文書全体の原点として保存されます。文字座標は必要に応じてXYを交換し、各軸の符号を適用した後、原点へ加算されます。姿勢成分は開始姿勢を維持します。

継続書字と改行

同じwriterで複数回 write() を呼ぶと、論理カーソルを保持して前回の続きから書けます。

writer.write("島根", return_to_start=True)
writer.write("大学", return_to_start=True, new_line=False)
writer.write("材料", return_to_start=True, new_line=True)

return_to_start は物理的に呼び出し開始姿勢へ戻るかだけを制御します。次回の論理書字位置は維持されます。

横書き時の改行方向は horizontal_new_line_direction、縦書き時の改列方向は vertical_new_line_direction で指定します。未指定の場合は、反転設定から自動決定されます。

失敗時の退避

emergency_lift_pen() は、書字中に保持した予定ペン上げZへ同期移動します。現在位置が既にそれより高い場合は、ペンを下げないよう現在Zを維持します。

他のロボットへの移植

この章は COBOTTA 用の実装例です。文字処理は機種に依存しません。詳しくは他のロボットでの利用を参照してください。