【ROS2】ODrive BotWheel Explorerを動かすときのメモ

ODriveのBotWheel Explorerというキットで遊んでいた時のメモです。

BotWheel Explorerは一通りのマニュアルが用意されていますが、どこに何が記載されているのかわからなくなるため、自分用に内容を整理しました。

注意:ODrive公式ドキュメントとはOS、OS設定、ラズパイ用CAN HATが異なります。そのため、コマンドや出力内容が一部公式ドキュメントと異なります。

動作確認環境

ODrive BotWheel Explorer (Node IDは左車輪が0、右車輪が1。CAN0のみ利用)
Raspberry Pi 4 Model B
Waveshare 2-Channel Isolated CAN Expansion HAT

Ubuntu 22.04.5 LTS
ROS2 Humble

CAN Expansion HATとの接続


基礎的な確認

ホスト名確認

ホスト名はbotに変えています。

$ cat /etc/hostname
bot


IPアドレス確認

$ ip -4 addr show | grep inet
    inet 127.0.0.1/8 scope host lo
    inet 192.168.2.210/24 brd 192.168.2.255 scope global dynamic noprefixroute wlan0
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0


別のPCからラズパイにSSHアクセスする方法

別のPCのターミナルで次の内容を実行

$ ssh pi@bot


CANの初期化が成功しているかどうか

LinuxでCANの初期化が成功しているかどうかの確認

$ sudo dmesg | grep spi
省略
[    8.667778] mcp251x spi0.0 can0: MCP2515 successfully initialized.
[    8.751669] mcp251x spi0.1 can1: MCP2515 successfully initialized.


CANの動作状況を確認

$ ip link show | grep -E "can0|can1"
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
4: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10


CAN0の詳細な動作状況を確認

$ ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can  promiscuity 0 minmtu 0 maxmtu 0
    can state ERROR-ACTIVE restart-ms 0
          bitrate 250000 sample-point 0.875
          tq 250 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
          mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
          clock 8000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 parentbus spi parentdev spi0.0


CAN0の通信ダンプ

$ candump can0


CANのUP状態、DOWN状態の変更

UP状態からDOWN状態への変更

$ ip link show | grep can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
$ sudo ip link set can0 down
$ ip link show | grep can0
3: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10

DOWN状態からUP状態への変更

$ ip link show | grep can0
3: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
$ sudo ip link set can0 up
$ ip link show | grep can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10


CAN0のビットレート変更

UP状態の場合は、一旦DOWN状態に落とす。

$ sudo ip link set can0 down

ビットレートを変更してUP状態に変更。

$ sudo ip link set can0 up type can bitrate 250000


ODrive S1のLEDステータス

https://docs.odriverobotics.com/v/latest/manual/overview.html

青/青緑色:アイドル状態
緑色(点滅):アクティブ状態
赤(点滅):エラー状態

Pythonスクリプトを使った制御

bot_ctrl.py を ~/work/ODriveResources/botwheel-explorer フォルダに置いている場合

$ cd ~/work/ODriveResources/botwheel-explorer
$ python3 bot_ctrl.py


ROS2で制御する場合の概要

ODriveはROS2を公式にサポートしている。
動作させる方法はodrive_node、odrive_ros2_controlの2種類があり、同時には利用できない。
odrive_nodeは、直接制御したい場合や、エラー内容について調べたりする場合に利用。
odrive_ros2_controlは、ros2_controlで動かしたい場合に使う。開発中と書かれている。

ROS2でodrive_nodeを使って制御

odrive_can_nodeの起動

odrive_can_nodeはCANとNode IDを指定して起動する。

$ ros2 run odrive_can odrive_can_node --ros-args -p interface:=can0 -p node_id:=0
[INFO] [1777640433.845999224] [ODriveCanNode]: node_id: 0
[INFO] [1777640433.846368438] [ODriveCanNode]: interface: can0

上記+ネームスペースを使ったサンプルもある。

$ ros2 launch odrive_can example_launch.yaml
[INFO] [launch]: All log files can be found below /home/pi/.ros/log/2026-05-01-22-29-53-018379-bot-2933
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [odrive_can_node-1]: process started with pid [2934]
[odrive_can_node-1] [INFO] [1777642193.696700959] [odrive_axis0.can_node]: node_id: 0
[odrive_can_node-1] [INFO] [1777642193.697160219] [odrive_axis0.can_node]: interface: can0


topic一覧

ネームスペースを使っていない場合のtopic一覧。

$ ros2 topic list
/control_message
/controller_status
/odrive_status
/parameter_events
/rosout


/odrive_status topicの確認

$ ros2 topic echo --once /odrive_status
bus_voltage: 20.04998016357422
bus_current: 0.0
fet_temperature: 32.76580810546875
motor_temperature: 24.561309814453125
active_errors: 16777216
disarm_reason: 0
---


コマンドの送信

公式ドキュメントのROS2参照。

ROS2でodrive_ros2_controlを使って制御

botwheel_explorer.launch.pyの起動

ワークスペースが ~/ROS2_WS の場合。
起動後にLEDが緑色に点滅すれば、ODrive S1はアクティブ状態。赤色に点滅すればエラー状態。

$ cd ~/ROS2_WS
$ source ./install/setup.sh
$ ros2 launch odrive_botwheel_explorer botwheel_explorer.launch.py

起動時のログ

[INFO] [launch]: All log files can be found below /home/pi/.ros/log/2026-05-01-21-34-02-213746-bot-2767
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [ros2_control_node-1]: process started with pid [2787]
[INFO] [robot_state_publisher-2]: process started with pid [2789]
[INFO] [spawner-3]: process started with pid [2791]
[robot_state_publisher-2] Warning: link 'base_link' material 'orange' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'base_link' material 'orange' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'left_wheel' material 'black' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'left_wheel' material 'black' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'right_wheel' material 'black' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'right_wheel' material 'black' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'caster_frontal_wheel' material 'white' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'caster_frontal_wheel' material 'white' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'caster_rear_wheel' material 'white' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] Warning: link 'caster_rear_wheel' material 'white' undefined.
[robot_state_publisher-2]          at line 84 in ./urdf_parser/src/model.cpp
[robot_state_publisher-2] [WARN] [1777638843.919677011] [kdl_parser]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia.  As a workaround, you can add an extra dummy link to your URDF.
[robot_state_publisher-2] [INFO] [1777638843.919965579] [robot_state_publisher]: got segment base_link
[robot_state_publisher-2] [INFO] [1777638843.920188018] [robot_state_publisher]: got segment caster_frontal_wheel
[robot_state_publisher-2] [INFO] [1777638843.920244610] [robot_state_publisher]: got segment caster_rear_wheel
[robot_state_publisher-2] [INFO] [1777638843.920277794] [robot_state_publisher]: got segment left_wheel
[robot_state_publisher-2] [INFO] [1777638843.920306590] [robot_state_publisher]: got segment right_wheel
[ros2_control_node-1] [WARN] [1777638843.934433708] [controller_manager]: [Deprecated] Passing the robot description parameter directly to the control_manager node is deprecated. Use '~/robot_description' topic from 'robot_state_publisher' instead.
[ros2_control_node-1] [INFO] [1777638843.935774568] [resource_manager]: Loading hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.952425576] [resource_manager]: Initialize hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.953515701] [resource_manager]: Successful initialization of hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.954088133] [resource_manager]: 'configure' hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.984807131] [ODriveHardwareInterface]: Initialized SocketCAN on can0
[ros2_control_node-1] [INFO] [1777638843.984982479] [resource_manager]: Successful 'configure' of hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.985037070] [resource_manager]: 'activate' hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638843.985065866] [ODriveHardwareInterface]: activating ODrives...
[ros2_control_node-1] [INFO] [1777638843.985109847] [ODriveHardwareInterface]: No control mode specified. Setting to idle.
[ros2_control_node-1] [INFO] [1777638843.985788480] [ODriveHardwareInterface]: No control mode specified. Setting to idle.
[ros2_control_node-1] [INFO] [1777638843.985948310] [resource_manager]: Successful 'activate' of hardware 'DiffBot'
[ros2_control_node-1] [INFO] [1777638844.027543233] [controller_manager]: update rate is 10 Hz
[ros2_control_node-1] [INFO] [1777638844.027715194] [controller_manager]: Spawning controller_manager RT thread with scheduler priority: 50
[ros2_control_node-1] [WARN] [1777638844.031857904] [controller_manager]: No real-time kernel detected on this system. See [https://control.ros.org/master/doc/ros2_control/controller_manager/doc/userdoc.html] for details on how to enable realtime scheduling.
[spawner-3] [INFO] [1777638845.379170217] [spawner_joint_state_broadcaster]: waiting for service /controller_manager/list_controllers to become available...
[ros2_control_node-1] [INFO] [1777638847.393917890] [controller_manager]: Loading controller 'joint_state_broadcaster'
[spawner-3] [INFO] [1777638847.441535516] [spawner_joint_state_broadcaster]: Loaded joint_state_broadcaster
[ros2_control_node-1] [INFO] [1777638847.446403706] [controller_manager]: Configuring controller 'joint_state_broadcaster'
[ros2_control_node-1] [INFO] [1777638847.446792459] [joint_state_broadcaster]: 'joints' or 'interfaces' parameter is empty. All available state interfaces will be published
[spawner-3] [INFO] [1777638847.741811329] [spawner_joint_state_broadcaster]: Configured and activated joint_state_broadcaster
[INFO] [spawner-3]: process has finished cleanly [pid 2791]
[INFO] [spawner-4]: process started with pid [2853]
[ros2_control_node-1] [INFO] [1777638849.441789417] [controller_manager]: Loading controller 'botwheel_explorer'
[spawner-4] [INFO] [1777638849.640592590] [spawner_botwheel_explorer]: Loaded botwheel_explorer
[ros2_control_node-1] [INFO] [1777638849.645052193] [controller_manager]: Configuring controller 'botwheel_explorer'
[ros2_control_node-1] [INFO] [1777638849.837785561] [ODriveHardwareInterface]: Setting to velocity control.
[ros2_control_node-1] [INFO] [1777638849.838589810] [ODriveHardwareInterface]: Setting to velocity control.
[spawner-4] [INFO] [1777638849.943169979] [spawner_botwheel_explorer]: Configured and activated botwheel_explorer
[INFO] [spawner-4]: process has finished cleanly [pid 2853]


ros2_controlのインタフェース確認

$ ros2 control list_hardware_interfaces
command interfaces
        left_wheel_joint/effort [available] [unclaimed]
        left_wheel_joint/position [available] [unclaimed]
        left_wheel_joint/velocity [available] [claimed]
        right_wheel_joint/effort [available] [unclaimed]
        right_wheel_joint/position [available] [unclaimed]
        right_wheel_joint/velocity [available] [claimed]
state interfaces
        left_wheel_joint/bus_current
        left_wheel_joint/bus_voltage
        left_wheel_joint/effort
        left_wheel_joint/position
        left_wheel_joint/velocity
        right_wheel_joint/bus_current
        right_wheel_joint/bus_voltage
        right_wheel_joint/effort
        right_wheel_joint/position
        right_wheel_joint/velocity


topic一覧

$ ros2 topic list
/botwheel_explorer/cmd_vel
/botwheel_explorer/odom
/botwheel_explorer/transition_event
/dynamic_joint_states
/joint_state_broadcaster/transition_event
/joint_states
/parameter_events
/robot_description
/rosout
/tf
/tf_static


topicの内容確認

回転角度、速度、トルクを確認。

$ ros2 topic echo --once /joint_states
header:
  stamp:
    sec: 1777634762
    nanosec: 82032794
  frame_id: base_link
name:
- left_wheel_joint
- right_wheel_joint
position:
- 0.13454830911713897
- 0.012776696406404067
velocity:
- 0.0
- 0.0
effort:
- 0.0
- 0.0
---

電圧、電流などの確認

$ ros2 topic echo --once /dynamic_joint_states
header:
  stamp:
    sec: 1777639813
    nanosec: 837424921
  frame_id: base_link
joint_names:
- left_wheel_joint
- right_wheel_joint
interface_values:
- interface_names:
  - effort
  - velocity
  - position
  - bus_voltage
  - bus_current
  values:
  - 0.013445316813886166
  - 0.0
  - -115.26802620211488
  - 20.12079620361328
  - -0.00016757810954004526
- interface_names:
  - effort
  - velocity
  - position
  - bus_voltage
  - bus_current
  values:
  - -0.07475467771291733
  - 0.0
  - 88.97878929369227
  - 20.113943099975586
  - 2.5391578674316406e-05
---


コマンドを使った動作確認

0.2 m/sで前進を30Hzで送信。

$ ros2 topic pub -r 30 /botwheel_explorer/cmd_vel geometry_msgs/msg/TwistStamped "{header: {stamp: now}, twist: {linear: {x: 0.2}, angular: {z: 0.0}}}"

ゆっくり右旋回

$ ros2 topic pub -r 30 /botwheel_explorer/cmd_vel geometry_msgs/msg/TwistStamped "{header: {stamp: now}, twist: {linear: {x: 0}, angular: {z: -0.3}}}"

左右の車輪の間隔を変更したときの設定箇所

ワークスペースが ~/ROS2_WS の場合、次の箇所に定義されている。

$ cat ~/ROS2_WS/src/ros_odrive/odrive_botwheel_explorer/config/diffbot_controllers.yaml | grep wheel_separation
    wheel_separation: 0.134

初期値は 0.419。車輪の中心から中心までの間隔。単位はメートル。

colcon buildしたときの反映先は次のどおり。

$ cat ~/ROS2_WS/install/odrive_botwheel_explorer/share/odrive_botwheel_explorer/config/diffbot_controllers.yaml | grep wheel_separation
    wheel_separation: 0.134


エラーコード

エラーの詳細については、APIリファレンス参照。

16進数 10進数 エラー名
0x00000001 1 INITIALIZING
0x00000002 2 SYSTEM_LEVEL
0x00000004 4 TIMING_ERROR
0x00000008 8 MISSING_ESTIMATE
0x00000010 16 BAD_CONFIG
0x00000020 32 DRV_FAULT
0x00000040 64 MISSING_INPUT
0x00000100 256 DC_BUS_OVER_VOLTAGE
0x00000200 512 DC_BUS_UNDER_VOLTAGE
0x00000400 1024 DC_BUS_OVER_CURRENT
0x00000800 2048 DC_BUS_OVER_REGEN_CURRENT
0x00001000 4096 CURRENT_LIMIT_VIOLATION
0x00002000 8192 MOTOR_OVER_TEMP
0x00004000 16384 INVERTER_OVER_TEMP
0x00008000 32768 VELOCITY_LIMIT_VIOLATION
0x00010000 65536 POSITION_LIMIT_VIOLATION
0x01000000 16777216 WATCHDOG_TIMER_EXPIRED
0x02000000 33554432 ESTOP_REQUESTED
0x04000000 67108864 SPINOUT_DETECTED
0x08000000 134217728 BRAKE_RESISTOR_DISARMED
0x10000000 268435456 THERMISTOR_DISCONNECTED
0x40000000 1073741824 CALIBRATION_ERROR


リンク

BotWheel Explorerのショップ説明、スペック
BotWheel Explorerの公式ドキュメント
BotWheel Explorerのハードウェア組み立てガイド
BotWheel Explorerを動かすためのソースコード
ros_odrive
ros_odrive - ODrive ros2_control プラグイン
ros_odrive - BotWheel Explorer ROS2 Package
ros_odrive - BotWheel Explorer用URDF
APIリファレンス
odrivetool
ODrive BotWheelsのショップ説明
ODrive S1のショップ説明