Closed13

TECH: ROSパッケージ作りたくないがROS通信したい

toitoy8toitoy8

WSLメモ

  • WSL2 install

https://docs.microsoft.com/ja-jp/windows/wsl/install
WSLのときこんなに簡単だったっけ?

  • WSLにROSをインストール

https://qiita.com/rkoyama1623/items/de467c6b954a6df638c8
xserver入れないとrviz、gazeboが見えないとのこと。

toitoy8toitoy8

WSLのインストール

とりあえず、WSLのインストールはpowershellで以下コマンド

wsl --install

注意事項にも書いてあるけど、上記でインストールできない場合は、下記でディストリビューションを指定してインストールする。

wsl --install -d <DistroName>

インストール可能なディストリビューション名は以下から取得する。

wsl --list --online

最初からやり直すには

一度入れたWSLをアンインストールするにはWindowsの設定→アプリ→アプリと機能から該当するディストリビューションを選択しアンインストールする
同じディストリビューションをまっさらな状態にしたいときは、同じようにアプリと機能の該当ディストリビューションから詳細オプションをクリックし、リセット

WSLなどへのリモート接続のVScode拡張機能

VSCodeを使っているならRemote Development拡張機能をインストールをするのが便利
(ssh通信もVSCodeからできるようになるし、ssh.confに設定残して置けるのでそういう意味でも便利)
インストール後は左のバーからリモートエクスプローラのタブが出る
WSL Targetsからディストリビューションを選べば、WSLにログインができる

WSLの初期設定

ここからはWSLでの作業

sudo apt update
sudo apt install x11-apps -y 

2行目はX Window Systemと通信するためのクライアントアプリのインストール

~/.bashrcに以下を記述

# rvizとx serverの通信設定
export LIBGL_ALWAYS_INDIRECT=""
# gazeboとx serverの通信設定
export GAZEBO_IP=127.0.0.1
# wslがx serverを見つけられるようにするための設定
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

最後はresolv.confに書いてあるnameserverのIPアドレスをDISPLAY環境変数に設定するよ、ということ
↓こちらのかたの解説が役に立った
https://qiita.com/baibai25/items/5841b0592727893d960f

最後にbashの更新

source ~/.bashrc 

X Window systemサーバの構築

WindowsでVcXsrvをインストールする
https://sourceforge.net/projects/vcxsrv/

  1. 「スタート」からxlaunch.exeを起動。
  2. multiple windowを選択し, 次へ。
  3. start no client を選択し, 次へ.
  4. Additional parameters for VcXsrv という入力フォームに 「-ac -nowgl」と入力し、次へ。
  5. Save configurationを押下して、設定ファイルをどこかに保存。
  6. 完了を押下して、VcXsrvを起動。

※4は超重要
これがないとXserverにrviz、gazeboが映らない
Windows + Rでファイル名を指定して実行にshell:startupと打ち込み、開いたフォルダにVcxsrvを起動したときに作られた設定ファイルを配置する
→これで起動時にXserverの設定がされる

以下でXserverの動作確認

xeyes

漫画チックな目が出たらOK

toitoy8toitoy8

ROS1

roscore

ROS1の起動の仕方
ターミナル開き、ROS masterを起動する

roscore

rviz, gazebo

別のターミナル開いて

rviz

gazebo

で起動確認してみる
https://hackmd.io/@tonnsama/ros_gazebo_installation

turtlesim

turtlesimパッケージのturtlesim_nodeの起動

rosrun turtlesim turtlesim_node

キーボードの矢印キーで制御できるturtle_teleop_keyの起動

rosrun turtlesim turtle_teleop_key

turtlesimの画面上をアクティブにし、キーボード矢印を押す

toitoy8toitoy8

ROS2

rviz, gazebo

rvizはrvizからrviz2

rviz2

gazeboは最初のROS2パッケージに含まれてないぽいのでaptでインストールする必要がある

sudo apt install ros-foxy-gazebo-ros-pkgs

それから以下コマンドで起動(こっちは変わらない)

gazebo

turtlesim

ROS1と同様turtlesimパッケージのturtlesim_nodeの起動
rosrunコマンドはros2 run

ros2 run turtlesim turtlesim_node 

turtle_teleop_keyでキーボード制御できるノードの起動

ros2 run turtlesim turtle_teleop_key
toitoy8toitoy8

rosbridge, roslibpyメモ

ROS1はこれでいけそう。
https://symfoware.blog.fc2.com/blog-entry-2288.html

ROS2も同様にturtlesimの亀さんを動かすことを目標に
https://demura.net/robot/ros2/20678.html

toitoy8toitoy8

ROS1

たぶんこれはこのままでいける

$ sudo apt-get install ros-melodic-rosbridge-suite

起動は以下
roslaunchでroscoreも立ち上がる

$ roslaunch rosbridge_server rosbridge_websocket.launch

pipでroslibpyのインストール

$ pip install roslibpy
pipない場合

以下でインストール

$ sudo apt install python-pip

pythonから亀を動かすサンプルコード

とりあえず、pythonコードは丸パクリ
python -> rosbridge -> ros

sample.py
# -*- coding:utf8 -*-
import time
from roslibpy import Message, Ros, Topic
def main():
    
    # roscoreを実行しているサーバーへ接続
    ros_client = Ros('192.168.1.104', 9090)
    # Publishするtopicを指定
    publisher = Topic(ros_client, '/turtle1/cmd_vel', 'geometry_msgs/Twist')
    def start_sending():
        while True:
            if not ros_client.is_connected:
                break
            
            # 送信するTwistメッセージの内容
            publisher.publish(Message({
                'linear': {
                    'x': 2.0,
                    'y': 0,
                    'z': 0
                },
                'angular': {
                    'x': 0,
                    'y': 0,
                    'z': 1.8
                }
            }))
            time.sleep(0.1)
        publisher.unadvertise()
    # Publish開始
    ros_client.on_ready(start_sending, run_in_thread=True)
    ros_client.run_forever()
if __name__ == '__main__':
    main()

turtlesim_nodeの起動をして、

rosrun turtlesim turtlesim_node

sample.pyの起動

python sample.py

亀が動くはず

toitoy8toitoy8

ROS2で普通にできた。
ROS1でもたぶんできるのでしょう。

このスクラップは2022/05/14にクローズされました