0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DynamixelをOpenCRとRasberryPiでキーボード操作するまでのメモ

Posted at

はじめに

DynamixelとOpenCRを使ったロボット制御のメモです。Turtlebot3と類似の構成ですが、モーターや電源が異なります。

LinuxPCとRasberryPiを使っていますが、LinuxPCだけでもOKです。RasberryPiでAruduinoIDEを使えなかったため、LinuxPCでArduinoIDEを使ってOpenCRのファームを書き換えました。逆に言えば、ArduinoIDEに関係ないものは、全てRasberryPiでもできます。

環境

項目 バージョン
Ubuntu 20.04
ROS Noetic
  • LinuxPC (Ubuntu 20.04.6 LTS):主にArduinoIDEの為に使用
  • RasberryPi (Ubuntu 20.04.4 LTS)
  • OpenCR
  • Dynamixel PM42-010-S260-R
  • 24V電源 (GSユアサ12VDCバッテリー*2)

参考

作業手順

接続

OpenCRのRS485のコネクタの左右がPM42-010-S260-Rと接続されています。電源ジャックには24VDCが接続されます。USBはLinuxPC、もしくはRasberryPiに接続されます。

image.png
OpenCR

ROSパッケージをダウンロードする

ROS noeticがすでにインストールされており、catkin_ws 以下で作業する前提です。

$ mkdir ~/catkin_ws/src/dynamixel
$ cd ~/catkin_ws/src/dynamixel

# 主なパッケージ
$ git clone https://github.com/ROBOTIS-GIT/dynamixel-workbench.git
$ git clone https://github.com/ROBOTIS-GIT/dynamixel-workbench-msgs.git

# 依存パッケージ
$ git clone https://github.com/ROBOTIS-GIT/DynamixelSDK.git

Arduino IDE

※ LinuxPC上で作業しました。

Arduino IDE インストール

OpenCRにファームウェアをアップロードするために、ArduinoIDEをダウンロードします。

USBポート設定

$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/99-opencr-cdc.rules
$ sudo cp ./99-opencr-cdc.rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger

コンパイラ設定

$ sudo apt-get install libncurses5-dev:i386

image.png
このような画面になるので、OKして次に進みます。

ArduinoIDE実行

$ arduino

image.png
直近でusb_to_dxlを開いていたため、この画面が出ています。

Arduino IDEへの環境移植

環境設定

上部メニューで [ファイル] → [環境設定] をクリックします。「環境設定」ウィンドウが表示されたら、次のリンクをコピーして「追加のボードマネージャのURL」テキストボックスに貼り付けます。

https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json

image.png

ボードマネージャー経由でボードパッケージをインストール

「ツール」→「ボード」→「ボードマネージャー」をクリックします。OpenCRをインストールします。
image.png

OpenCR Board が [ツール] → [Board] のリストにあるかどうかを確認します。これをクリックして OpenCR Board ソースをインポートします。
image.png

ポート設定

OpenCRとLinuxPCがシリアル接続されている前提です。下記コマンドでttyACM0 として認識していることを確認します。

$ ls /dev/ttyACM0*
/dev/ttyACM0

Arduinoの「ツール」→「ポート」→「/dev/ttyACM0」を選択します。

モードマネージャを削除します。

$ sudo apt-get purge modemmanager

Arduino IDEでOpenCMにusb_to_dxlを書き込む

[ファイル] → [スケッチ例] → [OpenCR] → [10.Etc] → [usb_to_dxl]を開きます。

image.png

マイコンボードに書き込みます。
image.png

接続の確認 (find_dynamixel)

このノードは全てのIDをそれぞれのBaudrate(9600, 57600, 115200, 1000000, 2000000, 3000000, 4000000)ごとにスキャンし、接続しているDynamixelの数を表示します。
以下では、異なるBaudrateで2つのDynamixelが検出されています。

$ rosrun dynamixel_workbench_controllers find_dynamixel /dev/ttyACM0
[ INFO] [1702276278.330805730]: Succeed to init(9600)
[ INFO] [1702276278.330854910]: Wait for scanning...
[ INFO] [1702276300.113791468]: Find 0 Dynamixels
[ INFO] [1702276300.155892835]: Succeed to init(57600)
[ INFO] [1702276300.155936602]: Wait for scanning...
[ INFO] [1702276318.156320385]: Find 1 Dynamixels
[ INFO] [1702276318.156378417]: id : 2, model name : PRO-PLUS-M42P-010-S260-R
[ INFO] [1702276318.213621680]: Succeed to init(115200)
[ INFO] [1702276318.213664241]: Wait for scanning...
[ INFO] [1702276335.871239691]: Find 0 Dynamixels
[ INFO] [1702276335.917334827]: Succeed to init(1000000)
[ INFO] [1702276335.917379935]: Wait for scanning...
[ INFO] [1702276353.212068238]: Find 1 Dynamixels
[ INFO] [1702276353.212111676]: id : 1, model name : PRO-PLUS-M42P-010-S260-R
[ INFO] [1702276353.268963791]: Succeed to init(2000000)
[ INFO] [1702276353.268978956]: Wait for scanning...
[ INFO] [1702276370.574371296]: Find 0 Dynamixels
[ INFO] [1702276370.619668935]: Succeed to init(3000000)
[ INFO] [1702276370.619712521]: Wait for scanning...
[ INFO] [1702276387.919237066]: Find 0 Dynamixels
[ INFO] [1702276387.964325078]: Succeed to init(4000000)
[ INFO] [1702276387.964366980]: Wait for scanning...
[ INFO] [1702276405.260781136]: Find 0 Dynamixels

Baudrateを変更したい場合は「ファイル」→「スケッチ例」→「OpenCR」→「08.DynamixelWorkbench」→「d_BPS_Change」
冒頭を任意のIDやBaudrateに変更します。

	#define BAUDRATE  57600
	#define DXL_ID 2
	#define NEW_BAUDRATE 115200

その後、電源リセット、usb_to_dxlを書き直して、同じBaudrateで認識するようになった。

$ rosrun dynamixel_workbench_controllers find_dynamixel /dev/ttyACM0
[ INFO] [1702353668.641122756]: Succeed to init(9600)
[ INFO] [1702353668.641159667]: Wait for scanning...
[ INFO] [1702353690.424888613]: Find 0 Dynamixels
[ INFO] [1702353690.466194675]: Succeed to init(57600)
[ INFO] [1702353690.466233049]: Wait for scanning...
[ INFO] [1702353708.499108720]: Find 0 Dynamixels
[ INFO] [1702353708.540837247]: Succeed to init(115200)
[ INFO] [1702353708.540853263]: Wait for scanning...
[ INFO] [1702353726.135644295]: Find 2 Dynamixels
[ INFO] [1702353726.135703111]: id : 1, model name : PRO-PLUS-M42P-010-S260-R
[ INFO] [1702353726.135730202]: id : 2, model name : PRO-PLUS-M42P-010-S260-R
[ INFO] [1702353726.207482482]: Succeed to init(1000000)
[ INFO] [1702353726.207547353]: Wait for scanning..

キーボードでDymamixelを動かす

設定ファイルの準備

適当にyamlファイルを作成します。
~\catkin_ws\src\dynamixel\dynamixel-workbench\dynamixel_workbevf nch_controllers\config\my_config.yamlを作成します。
Operating Modeには1 # VELOCITY_CONTROL_MODEを設定します。

Motor1:
  ID: 1
  Return_Delay_Time: 0
  Operating_Mode: 1 #  VELOCITY_CONTROL_MODE
  Profile_Acceleration: 0
  Profile_Velocity: 0
Motor2:
  ID: 2
  Return_Delay_Time: 0
  Operating_Mode: 1 #  VELOCITY_CONTROL_MODE
  Profile_Acceleration: 0
  Profile_Velocity: 0
# static const uint8_t CURRENT_CONTROL_MODE                  = 0;
# static const uint8_t VELOCITY_CONTROL_MODE                 = 1;
# static const uint8_t POSITION_CONTROL_MODE                 = 3;
# static const uint8_t EXTENDED_POSITION_CONTROL_MODE        = 4;
# static const uint8_t CURRENT_BASED_POSITION_CONTROL_MODE   = 5;
# static const uint8_t PWM_CONTROL_MODE                      = 16;
# static const uint8_t TORQUE_CONTROL_MODE                   = 100;
# static const uint8_t MULTI_TURN_MODE                       = 101;

launchファイル~/catkin_ws\src\dynamixel\dynamixel-workbench\dynamixel_workbench_controllers\launch\dynamixel_controllers.launchを編集します。

	<launch>
	  <arg name="usb_port"                default="/dev/ttyACM0"/>
	  <arg name="dxl_baud_rate"           default="115200"/>
	  <arg name="namespace"               default="dynamixel_workbench"/>
	  <arg name="use_moveit"              default="false"/>
	  <arg name="use_joint_state"         default="true"/>
	  <arg name="use_cmd_vel"             default="true"/>
	  <param name="dynamixel_info"          value="$(find dynamixel_workbench_controllers)/config/my_config.yaml"/>
	  <node name="$(arg namespace)" pkg="dynamixel_workbench_controllers" type="dynamixel_workbench_controllers"
	        required="true" output="screen" args="$(arg usb_port) $(arg dxl_baud_rate)">
	    <param name="use_moveit"              value="$(arg use_moveit)"/>
	    <param name="use_joint_states_topic"  value="$(arg use_joint_state)"/>
	    <param name="use_cmd_vel_topic"       value="$(arg use_cmd_vel)"/>
	    <rosparam>
	      publish_period: 0.010
	      dxl_read_period: 0.010
	      dxl_write_period: 0.010
	      mobile_robot_config:                <!--this values will be set when 'use_cmd_vel' is true-->
	        seperation_between_wheels: 0.300  
	        radius_of_wheel: 0.0785           
	    </rosparam>
	  </node>
	</launch>

キーボード操作のPackageのインストールします。

$ sudo apt-get install ros-noetic-teleop-twist-keyboard

参考:キーボードでロボット操作 - teleop_twist_keyboard - クワマイでもできる (hatenablog.com)

キーボード操作

ターミナルでコントローラを実行します。

$ roslaunch dynamixel_workbench_controllers dynamixel_controllers.launch

別のターミナルでトピックリストを確認して、cmd_velが存在することを確認します。

$ rostopic list
/dynamixel_workbench/cmd_vel
/dynamixel_workbench/dynamixel_state
/dynamixel_workbench/joint_states
/dynamixel_workbench/joint_trajectory
/rosout
/rosout_agg
```bash

teleop_twist_keyboard 実行時の引数のcmd_velを上記に設定して、teleop_twist_keyboardを実行します。

```bash
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=/dynamixel_workbench/cmd_vel

キーボード操作しながら、別のターミナルでトピックを監視すると、値が変わっていることがわかります。これはgeometry_msgs::Twist型のメッセージです。

$ rostopic echo /dynamixel_workbench/cmd_vel
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0

以下は2つのターミナルを並べて動作させている様子です。キーボードを操作すると、モータ動作に加えて、Twist型のメッセージの内容が変化していることがわかります。

image.png

さいごに

本記事では差動二輪のロボットをROSで動かすために、まずはキーボードで操作できる環境構築のメモを記載しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?