Franka Emika Panda 開発環境構築

原典
https://opensource-robotics.tokyo.jp/?p=4294
https://opensource-robotics.tokyo.jp/?p=4362

## Windowsを設定
- ubuntuに200GBを割り当てる
ドライブCのボリュームの縮小、204800MBをubuntu用のボリュームとする
- Win11でローカルアカウント作成の場合
```
ネットワークに接続しない状態で起動
「国または地域はこれでよろしいですか？」の画面で「Shift＋F10」
C:\Windows\System32>cd oobe
C:\Windows\System32>bypassnro.cmd
```

## PCのBIOSを設定

### Lenovo Yoga
```
[Security]-[Secure Boot]=[Disabled]
```
### EPSON Endeavor

```
Main --------------------------------
Port Configuration
Configure Port As [AHCI]
Security --------------------------------
Hard Disk Protection [Disabled]
Secure Boot [Disabled]
Boot --------------------------------
Boot Setting Configuration ----------------
Screen Logo [Enabled]
Beep Sound [Disabled]
UEFI Boot [Enabled]
UEFI IPv4 PXE [Enabled]
UEFI IPv6 PXE [Enabled]
Boot Option Priority ----------------
Boot Option #1 [UEFI CD/DVD]
            #2 [UEFI Removable Device]
            #3 [UEFI USB Hard Drive]
            #4 [UEFI Hard Drive:ubuntu (P1:Micron_1300_MTFDDAK512TDL)]
            #5 [UEFI Network:UEFI:PXE IPv4 Intel(R) Ethernet Connection (11) I219-V]
            #6 [CD/DVD: HL-DT-ST DVDROM GHCON]
            #7 [Removable Device]
            #8 [USB Hard Drive]
            #9 [Hard Drive:Micron_1300_MTFDDAK512TDL]
            #10 [Network]
UEFI Hard Drive Priorities ----------------
Boot Option #1 [ubuntu (P1:Micron_1300_MTFDDAK512TDL)]
            #2 [Windows Boot Manager (P1:Micron_1300_MTFDDAK512TDL)]
UEFI Network Device BBS Priorities ----------------
Boot Option #1 [UEFI: PXE IPv4 Intel(R) Ethernet Connection (11) I219-V]
            #2 [UEFI: PXE IPv6 Intel(R) Ethernet Connection (11) I219-V]
CD/DVD ROM Drive Priorities ----------------
Boot Option #1 [P5: HL-DT-ST DVDROM GHCON]
Hard Drive Priorities ----------------
Boot Option #1 [P1: Micron_1300_MTFDDAK512TDL]
```

### MOUSE Computer
```
[Security]-[Secure Boot]=[Disabled]
[Boot]-[UEFI NVME Drive BBS Priorities]=[Boot option #1]=[ubuntu]
```

### DELL Vostro 3020 Small Desktop
Windowsの起動ディスクを作成しておく。後でWindowsをクリーンインストールする。
```
[Boot Configuration]-[Enable Secure Boot]=[OFF]
[Storage]-[SATA/NVMe Operation]=[AHCI/NVMe]
```
StorageをRAIDからAHCIにするとWindowsが起動できなくなるので、起動ディスクで再インストールする。

### その他BIOS設定
link
https://qiita.com/carpenders/items/f86b783061a84a28a92a


## ハードウェア構成
### EPSON Endeavor
内蔵Ethernet Intel I219-V
https://www.intel.com/content/www/us/en/download/14611/15817/intel-network-adapter-driver-for-pcie-intel-gigabit-ethernet-network-connections-under-linux.html

ビルドとインストール
```
$ tar xf e1000e-3.8.4.tar.gz
$ cd e1000e-3.8.4/src/
$ vi nvm.c
s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        return 0; /* この関数を無処理にする */
} 
$ sudo make install
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e
$ dmesg | grep -i e1000
[  470.573246] e1000e: loading out-of-tree module taints kernel.
[  470.573502] e1000e: module verification failed: signature and/or required key missing - tainting kernel
[  470.577509] e1000e: Intel(R) PRO/1000 Network Driver - 3.8.4-NAPI
[  470.577510] e1000e: Copyright(c) 1999 - 2020 Intel Corporation.
[  470.577996] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[  471.023527] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
[  471.114089] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) d8:97:ba:39:15:e2
[  471.114091] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
[  471.114280] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
[  471.117633] e1000e 0000:00:1f.6 eno1: renamed from eth0
[  556.332827] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
$ sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200 | grep rtt
rtt min/avg/max/mdev = 0.099/0.131/0.219/0.015 ms
```
https://qiita.com/matsuo7005/items/b0037b6450d752378316

### DELL Vostro 3020 Small Desktop
内蔵Ethernet RTL8111KD
```
$ dmesg | grep eth[0-9]
[    2.681181] r8169 0000:02:00.0 eth0: RTL8168h/8111h, cc:96:e5:42:8d:f4, XID 541, IRQ 137
[    2.681183] r8169 0000:02:00.0 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]
[    2.681774] r8169 0000:02:00.0 enp2s0: renamed from eth0
$ lspci
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 1b)
```
内蔵WLAN PCIe Realtek 8821CE
```
sudo apt -y install dkms
git clone https://github.com/tomaspinho/rtl8821ce.git
cd rtl8821ce
インストール
sudo ./install-driver.sh
ドライバ削除
sudo ./remove-driver.sh
```
```
$ dmesg | grep 8821
[    5.747323] 8821ce: loading out-of-tree module taints kernel.
[    5.747841] 8821ce: module verification failed: signature and/or required key missing - tainting kernel
[    5.810238] rtl8821ce 0000:03:00.0: enabling device (0000 -> 0003)
[    6.691129] rtl8821ce 0000:03:00.0 wlp3s0: renamed from wlan0
$ lspci
03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8821CE 802.11ac PCIe Wireless Network Adapter
```
https://qiita.com/PHOO/items/d77a9de94ca1662516e8
### PCIe拡張カード
TP-LINK TG-3468 RTL8168
```
$ dmesg|grep eth[0-9]
[    2.681268] r8169 0000:01:00.0 eth0: RTL8168h/8111h, 6c:5a:b0:5a:9e:a3, XID 541, IRQ 128
[    2.681270] r8169 0000:01:00.0 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]
[    2.737331] r8169 0000:01:00.0 enp1s0: renamed from eth0
$ lspci
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8161 (rev 15)
```
TOPTEK Intel82576
```
$ dmesg | grep eth[0-9]
[    2.882133] igb 0000:01:00.0: added PHC on eth0
[    2.882135] igb 0000:01:00.0: eth0: (PCIe:2.5Gb/s:Width x1) 1c:fd:08:7c:63:fc
[    2.882138] igb 0000:01:00.0: eth0: PBA No: Unknown
[    3.138194] igb 0000:01:00.1: added PHC on eth1
[    3.138195] igb 0000:01:00.1: eth1: (PCIe:2.5Gb/s:Width x1) 1c:fd:08:7c:63:fd
[    3.138205] igb 0000:01:00.1: eth1: PBA No: Unknown
[    3.139880] igb 0000:01:00.1 enp1s0f1: renamed from eth1
[    3.168087] igb 0000:01:00.0 enp1s0f0: renamed from eth0
$ lspci
01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
```
### USB-WLAN
TP-LINK AC600 Archer T2U Plus
ラズベリーパイの場合はインストールの前にREADME.mdを読み「For Raspberry (RPI)」の項目に対応する
```
sudo apt -y install dkms
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
インストール
sudo make dkms_install
ドライバ削除
sudo make dkms_remove
```
```
[  277.392532] usb 1-1: new high-speed USB device number 6 using xhci_hcd
[  277.413864] usb 1-1: New USB device found, idVendor=2357, idProduct=0120, bcdDevice= 2.00
[  277.413871] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  277.413873] usb 1-1: Product: 802.11ac WLAN Adapter
[  277.413876] usb 1-1: Manufacturer: Realtek
[  277.413877] usb 1-1: SerialNumber: 00e04c000001
[  277.884240] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[  277.885797] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[  277.900780] 88XXau: loading out-of-tree module taints kernel.
[  277.901231] 88XXau: module verification failed: signature and/or required key missing - tainting kernel
[  277.967845] usb 1-1: 88XXau 78:8c:b5:f7:3f:1a hw_info[107]
[  277.969690] usbcore: registered new interface driver rtl88XXau
[  278.000958] rtl88XXau 1-1:1.0 wlx788cb5f73f1a: renamed from wlan0
[  278.353419] IPv6: ADDRCONF(NETDEV_CHANGE): wlx788cb5f73f1a: link becomes ready
[  281.964070] IPv6: ADDRCONF(NETDEV_CHANGE): wlx788cb5f73f1a: link becomes ready
```
TP-LINK AC1300 Archer T3U Plus
```
sudo apt -y install dkms
git clone https://github.com/morrownr/88x2bu-20210702.git
cd 88x2bu-20210702
インストール
sudo ./install-driver.sh
ドライバ削除
sudo ./remove-driver.sh
```
```
[  371.241337] usb 1-1: new high-speed USB device number 7 using xhci_hcd
[  371.262524] usb 1-1: New USB device found, idVendor=2357, idProduct=0138, bcdDevice= 2.10
[  371.262530] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  371.262533] usb 1-1: Product: 802.11ac NIC
[  371.262535] usb 1-1: Manufacturer: Realtek
[  371.262537] usb 1-1: SerialNumber: 123456
[  371.968815] usbcore: registered new interface driver rtl88x2bu
[  371.991344] rtl88x2bu 1-1:1.0 wlxf0a7318d2eca: renamed from wlan0
[  372.697255] IPv6: ADDRCONF(NETDEV_CHANGE): wlxf0a7318d2eca: link becomes ready
[  377.495440] IPv6: ADDRCONF(NETDEV_CHANGE): wlxf0a7318d2eca: link becomes ready
```
https://tech.nosuz.jp/post/2021-09/ubuntu_wifi/
## Ubuntuをインストール
必要なファイルを収集
en https://ftp.kddilabs.jp/Linux/packages/ubuntu/releases-cd/
ja https://ftp.kddilabs.jp/Linux/packages/ubuntu-jp/release-cd/releases/
Rufus 3.14 https://rufus.ie/ja/

### Ubuntuインストーラで画面が切れたら
ALT + F7
https://qiita.com/baggio/items/06e4132e5e0693c4b7ce

### PC共通
- キーボードレイアウト  
  [日本語]-[日本語] サフィックス無しの選択肢
- アップデートと他のソフトウェア  
  あらかじめどのアプリケーションをインストールしますか？  
  [通常のインストール]  
  その他のオプション  
  [Ubuntuのインストール中にアップデートをダウンロードする]
- インストールの種類  
  コンピュータにはWindowsBootManagerがインストールされています。どのようにしますか？  
  [それ以外]

### Lenovo Yoga
- [インストールの種類]=[それ以外]
  /dev/nvme0n1p4 ext4 / フォーマットする 209715MB

### EPSON Endeavor
- [インストールの種類]=[それ以外]
  /dev/sda4 ext4 / フォーマットする 209715MB
- ホスト名命名規則  
  frankaepson1,frankaepson2,...

## Ubuntuを設定

### Ubuntuコマンドインストール
```
sudo apt update
sudo apt -y upgrade
sudo apt -y install vim openssh-server
```
```
# LD_LIBRARY_PATHにros-melodic,ros-noetic用ライブラリを追加するために
$ sudo vi /etc/ld.so.conf # 以下を追加
/opt/ros/melodic/lib
/opt/ros/noetic/lib/x86_64-linux-gnu
$ sudo ldconfig
```
他のコマンド
https://qiita.com/carpenders/items/69dd6b37a29dd36547ca

### Ubuntuを削除
link
https://qiita.com/carpenders/items/966e9e1c5780377e4590

### Hyper-V WSL2
link
https://qiita.com/carpenders/items/b4af879718946d7dd102

## リアルタイムカーネルを作成

手順は以下
https://frankaemika.github.io/docs/installation_linux.html#setting-up-the-real-time-kernel
```
sudo apt-get -y install build-essential bc curl ca-certificates gnupg2 libssl-dev
sudo apt-get -y install lsb-release libelf-dev bison flex dwarves zstd libncurses-dev

# For Ubuntu 18.04 tested with the kernel version 5.4.19:
# ubuntu-ja-18.04.3-desktop-amd64.iso : 5.4.0-150-generic
curl -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.xz
# For Ubuntu 20.04 tested with the kernel version 5.9.1:
# ubuntu-ja-20.04.1-desktop-amd64.iso : 5.4.0-42-generic 5.15.0-89-generic
curl -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.xz
# 22.04以降は公式には未対応の様子
# ubuntu-ja-22.04-desktop-amd64.iso : 6.2.0-36-generic Minisforumで起動不可
# ubuntu-ja-22.04-desktop-amd64.iso : 5.15.0-25-generic Minisforumで起動可能
curl -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.15.2.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.15/older/patch-5.15.2-rt18.patch.xz

xz -d *.xz
tar xf linux-*.tar
cd linux-*/
patch -p1 < ../patch-*.patch
cp -v /boot/config-$(uname -r) .config
make olddefconfig
make menuconfig
# General Setup > Preemption Model > Fully Preemptible Kernel (Real-Time)
# Cryptographic API > Certificates for signature checking > Provide system-wide ring of trusted keys > Additional X.509 keys for default system keyring で「空欄」を設定
# 変更したらSAVEを忘れずに
make -j$(nproc) deb-pkg
sudo dpkg -i ../linux-headers-*.deb ../linux-image-*.deb
```
5.9.1-rt20の場合
「残念ながら、Ubuntu20.04で内部エラーが発生しました。」を表示
## grubを設定

#### 起動カーネル切り替え
```
$ grep Ubuntu /boot/grub/grub.cfg
$ sudo vi /etc/default/grub
GRUB_DEFAULT=0
$ sudo update-grub
$ sudo reboot
```
Ubuntu18.04の例
```
# 標準カーネル起動なら
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.15.0-213-generic"
# リアルタイムカーネル起動なら
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.19-rt10"
```
Ubuntu20.04の例
```
# 標準カーネル起動なら
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-89-generic"
# リアルタイムカーネル起動なら
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.9.1-rt20"
```
Windowsの例
```
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"
```
起動コンソールメッセージを表示
```
GRUB_CMDLINE_LINUX_DEFAULT=""
```
前回起動したOS既定にする場合
```
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
```
link
https://blog.masu-mi.me/post/2020/12/05/switch-kernel-with-grub2/
https://qiita.com/saito_now/items/acacf3f5830fdfb90283
https://shinespark.hatenablog.com/entry/2020/03/30/090000

#### 画面サイズ設定
```
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
$ sudo update-grub
$ sudo reboot
```
1600x900の例
```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1600x900"
```

## リアルタイムカーネルを起動
Ubuntu18.04の例
```
$ uname -a
Linux frankaepson1 5.4.19-rt10 #1 SMP PREEMPT_RT Mon Nov 1 18:08:49 JST 2021 x86_64 x86_64 x86_64 GNU/Linux
```

Ubuntu20.04の例
```
$ uname -a
Linux franka-dell1 5.9.1-rt20 #1 SMP PREEMPT_RT Fri Nov 24 17:01:39 JST 2023 x86_64 x86_64 x86_64 GNU/Linux
```
## ROSバイナリをインストール
https://wiki.ros.org/Distributions
https://en.wikipedia.org/wiki/Ubuntu_version_history
### Melodicの場合 Ubuntu18.04 (Bionic)
http://wiki.ros.org/melodic/Installation/Ubuntu
Desktop-Full Install: (Recommended) これを選択
```
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt -y install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt -y install ros-melodic-desktop-full
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt -y install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo rosdep init
rosdep update
```
### Noeticの場合 Ubuntu 20.04 (Focal)
https://wiki.ros.org/noetic/Installation/Ubuntu
Desktop-Full Install: (Recommended) これを選択
```
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt -y install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt -y install ros-noetic-desktop-full
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt -y install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
sudo rosdep init
rosdep update
```

参照
https://robot.isc.chubu.ac.jp/?p=1447
http://joe.ash.jp/program/ros/setup/install_ros_melodic.htm
https://choreonoid.org/ja/manuals/latest/ros/install-ros.html

## Franka Control Interfaceをインストール
原典
https://frankaemika.github.io/docs/installation_linux.html
Melodicの場合
```
sudo apt -y install ros-melodic-libfranka ros-melodic-franka-ros
```
Noeticの場合
```
sudo apt -y install ros-noetic-libfranka ros-noetic-franka-ros
```
### libfrankaをソースファイルからビルドする場合
```
sudo apt -y install git gcc g++ make
sudo apt -y install build-essential cmake git libpoco-dev libeigen3-dev
git clone --recursive https://github.com/frankaemika/libfranka
cd libfranka
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF ..
cmake --build .
```

## グループ名を設定
```
$ sudo addgroup franka_grp
グループ 'franka_grp' (GID 1001) を追加しています...
完了。
$ sudo usermod -a -G franka_grp $(whoami)
$ sudo vi /etc/security/limits.conf
@franka_grp soft rtprio 99
@franka_grp soft priority 99
@franka_grp soft memlock 102400
@franka_grp hard rtprio 99
@franka_grp hard priority 99
@franka_grp hard memlock 102400
```

## ロボットコントローラと通信して動作

通信性能を確認

```
$ sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200

[1631854233.491256] 1208 bytes from 172.16.0.2: icmp_seq=9997 ttl=64 time=0.130 ms
[1631854233.492258] 1208 bytes from 172.16.0.2: icmp_seq=9998 ttl=64 time=0.128 ms
[1631854233.493251] 1208 bytes from 172.16.0.2: icmp_seq=9999 ttl=64 time=0.128 ms
[1631854233.494248] 1208 bytes from 172.16.0.2: icmp_seq=10000 ttl=64 time=0.126 ms

--- 172.16.0.2 ping statistics ---
10000 packets transmitted, 10000 received, 0% packet loss, time 9999ms
rtt min/avg/max/mdev = 0.083/0.133/0.527/0.016 ms
$ sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200 | grep rtt
rtt min/avg/max/mdev = 0.078/0.133/0.201/0.012 ms
$ sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200 | grep rtt
rtt min/avg/max/mdev = 0.092/0.133/0.290/0.010 ms
$ sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200 | grep rtt
rtt min/avg/max/mdev = 0.091/0.133/0.210/0.015 ms
```

# 参考資料

### Ubuntuメモ
Ubuntu SoftEtherVPNクライアント
https://qiita.com/carpenders/items/fb572c908e83cf1004b0

### franka link
全体構成図
https://world.franka.de/resources/img/systemoverview.f74fb8f1.png
FCI全般 Linuxインストール libfranka franka_ros
https://frankaemika.github.io/docs/index.html
その中のlibfranka
https://frankaemika.github.io/docs/libfranka.html
libfrankaクラス仕様
https://frankaemika.github.io/libfranka
frankaリポジトリ
franka_ros libfranka docs icra18-fci-tutorial the_reference_platform external_gripper_example
https://github.com/frankaemika

### ros.org link
franka_hwクラス仕様
http://docs.ros.org/en/melodic/api/franka_hw/html/
MoveItチュートリアル
http://docs.ros.org/en/melodic/api/moveit_tutorials/html/index.html

### Franka調査
Franka 操作あれこれ
https://qiita.com/carpenders/items/b8909442b71b2ce48761
Franka libfrankaネットワーク性能不足
https://qiita.com/carpenders/items/78338a6a5c9bdda06372
Franka libfranka実行性能
https://qiita.com/carpenders/items/dd2d27804e3e0b385501
Franka ネットにあるアプリケーション実装
https://qiita.com/carpenders/items/f930e0d31bea7ffe2161

### Franka自作実装
Franka ローカルでexamplesをビルド・CMakeLists.txt的
https://qiita.com/carpenders/items/e000e011a6aa5164b3a8
Franka ローカルでexamplesをビルド・Makefile的
https://qiita.com/carpenders/items/a35dc63f88d8774f2cc4
Franka 動作性能測定
https://qiita.com/carpenders/items/90bbc992cad570aa7a14
Franka  制御プロトコル
https://qiita.com/carpenders/items/fa554349ebd6540d71d0
Franka BilateralController.exe
https://qiita.com/carpenders/items/6e9d7d54630d484c7cac

### ネット情報
C++ラムダ式解説
https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html
https://qiita.com/YukiMiyatake/items/8d10bca26246f4f7a9c8
https://kaworu.jpn.org/cpp/%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F
ROSの歴史
http://lab3.kuis.kyoto-u.ac.jp/~takase/ros/1intro.pdf
Linux Thread
https://www.tenkaiken.com/short-articles/linux%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89-pthread/
https://docs.oracle.com/cd/E19253-01/819-0390/tlib-12926/index.html
https://region-sys.com/c-4/#t2
https://ja.linux-console.net/?p=12393
http://onishi-lab.jp/programming/thread_linux.html