ODriveのBotWheel Explorerというキットで遊んでいた時のメモです。
BotWheel Explorerは一通りのマニュアルが用意されていますが、どこに何が記載されているのかわからなくなるため、自分用に内容を整理しました。
注意:ODrive公式ドキュメントとはOS、OS設定、ラズパイ用CAN HATが異なります。そのため、コマンドや出力内容が一部公式ドキュメントと異なります。
- 動作確認環境
- 基礎的な確認
- ODrive S1のLEDステータス
- Pythonスクリプトを使った制御
- ROS2で制御する場合の概要
- ROS2でodrive_nodeを使って制御
- ROS2でodrive_ros2_controlを使って制御
- エラーコード
- リンク
動作確認環境
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で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のショップ説明