###はじめに
2020年末の連休中にROS1
(melodic
)の開発環境をwsl(1)
+VS Code
に整理しました。開発環境の利用テストを兼ねて、昨年作成したプチロボ用ダミーコードの修正作業を実施しましたので、コミュニティーの皆様への新年のご挨拶(!?)もかねてアップデート版のコードを忘備録としてアップします。
・当初の制作記事、共立エレショップのプチロボサポートサイトのリンク
https://qiita.com/ivvakanni/items/8b5c00b37abe983d9ac1
###利用環境
・Windows 10 Home
・Wsl1/ubuntu18.04
・WondeRoid Motion Maker Ver3.1.1
・WR-2R4 USBアダプタ X 2 (Buffalo:USBハブ経由)
Windows PCにUSBハブを経由してWR-2R4 USBアダプタ
2 個をプチロボの付属ケーブル(4線)
で接続し、一つのアダプタは Wondows 10 の通信COMポートをMotion Maker
ソフトから、もう一つのアダプタを wsl 上の ubuntu で tty(ttyS3
)を使用して接続して、このプログラムの動作を半二重通信でテストしています。
この方法の良いところは、デバイスの抜き差しが一つのポートで済むことです。また、二つのアダプタが散逸するのも防止できるので一石二鳥です。ちなみに、私は、WR-2R4用の無線モジュール
も持っているので、将来的には、無線使用時のコマンドにも対応させてみたいです。
もちろん、Windows PC 側でデバイスを認識させれば、市販の安いUSB/シリアル変換アダプタでも動きます。ただし、wsl2 だとCOMポートがつながらない
というような記事が散見されたので、真偽は確認していませんが、一応、wsl1を使用しています。
Windows PowerShell
からのコマンドは以下の通り。
C:\> wsl --set-version Ubuntu-18.04 1
###主な変更点
・後からのメンテナンスの利便性のためにコメントを随所に入れた。
・コマンド5以外の返信に対応した。
/***********************************************************************************************************
* WR-XX Dummy for Linux ver. 0.2.2
* Author : Lian Ivvakanni (01-03-2021)
* License: Dual BSD/GPL (with absolutely no warranty.)
* Purpose: send return message to Wonder Roid Motion Maker V3.1.1
***********************************************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/* change this definition for the correct port */
#define MODEM_DEVICE "/dev/ttyS3"
#define BAUD_RATE B38400
/* command item number */
#define M 8
/* buffer size */
#define N 32
#define HEADER 0xFFFFFFFD
#define FOOTER 0xFFFFFFFE
int main(int argc, char *argv[])
{
int fd, i, j, k, len;
struct termios tio;
char s[N], sprn[N], buf[N], ret[M][N];
/* Command 5: A/D status dummy data */
char dum_5[] = {0xFD,0x0F,0x15,0x46,0x46,0x46,0x46,0x46,\
0x46,0x46,0x46,0x46,0x46,0x00,0xFE};
/* set return data */
for (i = 0; i <= 7; i++)
ret[i][2] = i + 0x10;
/* clear structure for port settings */
memset(&tio, 0, sizeof(tio));
/*
BAUDRATE: 38400 bps
CS8 : 8bit,no parity,1 stopbit (8n1)
CLOCAL : local connection, no modem contol
CREAD : enable receiving characters
*/
tio.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD;
/* Open modem device for reading and writing */
fd = open(MODEM_DEVICE, O_RDWR);
if (fd < 0) {perror(MODEM_DEVICE); exit(-1);}
printf("Device Opened...\n");
/* clean the modem line and activate the settings for the port */
tcflush(fd, TCIFLUSH);
ioctl(fd, TCSETS, &tio);
while(1){
/* clear buffer memory */
memset(buf, '\0', N);
/* open device to read */
len = read(fd,buf, sizeof(buf));
if(len < 0) printf("Device Read Error...\n");
/* find header */
if(buf[0] != HEADER)
continue;
/* check command data size */
if(buf[buf[1] - 1] != FOOTER)
continue;
/* optional: set buffer to string */
for (i = 0; i < buf[1]; i++){
sprintf(s, "%02X ", buf[i]);
strcat(sprn,s);
}
printf("Rec: %s: %d\r\n", sprn, i);
memset(sprn, '\0', sizeof(sprn));
/* find command and send its return, if any */
if(buf[2] == 0x00)
write(fd, ret[0], 4);
if(buf[2] == 0x02)
write(fd, ret[2], 4);
if(buf[2] == 0x03)
write(fd, ret[3], 4);
if(buf[2] == 0x05)
write(fd, dum_5, 15);
len = 0;
}
close(fd);
return 0;
}
###おわりに
2020年は、ARM11
上での動作環境にこだわりすぎて実質的なROS
の学習が思うように進みませんでした。そこで、そうした反省を踏まえ、ROSのGUI環境がwslで動くことを知ったこともあり今年前半はROS1
に関しては、開発学習環境をwsl1
(ubuntu 18.04
) 上のMelodic
に固定してみます。そして、少し落ち着いたら、夏前までにはROS2
にもチャレンジしてみたいですね。
ちなみに、wsl を使用することで、旧型の ubuntu 搭載PC は奥にしまい机が広く使えるようになったのがうれしいです。ROS専用サーバもRaspberry pi 2 にubuntu18.04を入れて導入しましたので、非常に簡単にできました。
それでは、改めまして、コミュニティーのみなさまの興味深く役立つ記事を楽しみにしておりますので、本年もどうぞよろしくお願いいたします。