F1_tenth

Joyjin·2023년 9월 15일

Ubuntu 18.04 노트북(Linux) 준비

1. Ubntu 18.04 (리눅스 듀얼 부팅) (20.04는 joystick 패키지가 호환되지 않음)

1. 우분투 18.04 다운로드
2. 우분투 설치 USB 만들기
3. 우분투 설치공간 마련을 위해 파티션 나누기
4. 우분투 설치

주 파티션
- 크기: 마련한 공간과 동일, 종류: 주, 마운트 위치: /
스왑 파티션
- 크기: 나머지 공간, 종류: 논리, 용도: 스왑 영역
5. USB 제거 후 재부팅

윈도우 리눅스 듀얼 부팅 링크

2. Visual Studio Code 설치 및 세팅

1) 설치

설치 코드

sudo apt update
sudo apt install software-properties-common apt-transport-https wget
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
sudo apt install code

VS Code 설치 링크

2) 세팅

  • Extension 설치 (Python, Ros, Code runner 등)
  • Hilighter

3. Python 설치

1) Aanaconda 가상환경 구축

1. anaconda 설치
공식 사이트 링크
2. 다운받은 파일 확인

cd ~/Downloads
ls

3. bash 명령어로 쉘 스크립트 실행

# home 디렉토리로 이동 후
bash Anaconda3-2022.10-Linux-x86_64.sh
# 실제로 다운로드 받은 버전을 입력해야 함 

Enter를 눌러 약관을 쭉 확인하고 약관에 yes 입력하여 동의
4. 설정

source ~/.bashrc 
conda config --set auto_activate_base false

5. 콘다 환경 활성화

conda activate
conda deactivate  # 비활성화

6. anaconda 가상환경 만들고 python 설치

conda create -n ros python=3.8.5
# conda create -n <가상환경이름> python=<설치할버전> 
conda env list
# 가상환경 목록 보여줌  
conda env remove -n ros
# 가상환경 삭제
conda activate python38
# 가상환경 활성화 

아나콘다 설치 및 가상환경 구축 링크

2) Python 가상환경 구축 (필요 시)

1. 패키지 설치를 위한 channel conda-forge로 변경 (기본 채널보다 업데이트 빠르고 호환성 면에서도 이득. 다만 기본 채널이 더 안정적 )
conda config --add channels conda-forge && conda config --set channel_priority strict
conda config --show channels (우선권 : 상단채널 )
2. 원하는 라이브러리 설치
기본적으로 깔리므로 나중에 필요할 때 갈면 됨

아나콘다 가상환경 내에서 파이썬 설치하기 링크

3) VS Code에서 Anaconda 가상환경 사용하기

  1. VS Code 열기
    code
  2. VS Code 창에서 ctrl+shift+p
  3. "Python : Select interpreter" 선택
  4. 원하는 가상환경 선택
  5. File > New Text File
  6. Select a language > Python
  7. 아래 배너에서 가상환경 확인

참조 링크

4. ROS 설치

1) ROS 1 ( Melodic ) Ubuntu 18.04는 해당 버전을 설치해야함

Ros1 설치 (Ubuntu18.04, ROS Melodic) 링크

2) ROS 1 ( Noetic )

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 install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt install ros-noetic-desktop-full
sudo apt install ros-noetic-slam-gmapping
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential python3-roslaunch
sudo apt install python3-rosdep
sudo rosdep init
rosdep update
roscore

Ros1 설치 (Ubuntu20.04, ROS Noetic) 링크

  • 위의 3번째 명령어에서 막힐 경우
    sudo apt update 입력 후
    GPG error 발견 시
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654 입력 후
    3번째 명령어 재입력
    GPG error 해결 링크
  • Ros 삭제
    sudo apt-get purge ros-noetic-*
    삭제되었는지 확인 (새 터미널을 열어서)
    rosversion -d

  • 제거 후 새 터미널을 열때 아래와 같은 코드가 뜬다면
    (bash: /opt/ros/noetic/setup.bash: No such file or directory)
    : gedit ~/.bashrc
    입력 후 환경 설정 파일이 텍스트 편집기로 열리면
    해당 Ros 버전(Noetic)과 관련된 모든 줄을 찾아 삭제하고 저장

2) ROS 2 ( Foxy )

  • 설정 및 패키지 설치
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
sudo apt update
sudo apt install ros-foxy-desktop
  • 실행환경 설정
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
  • 부가적 설치(개발할 때 편리)
sudo apt install -y python3-pip
pip3 install -U argcomplete
sudo apt install python3-colcon-common-extensions
  • 테스트 명령어 - 2개의 터미널을 열어 메세지 송/수신 확인
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener

ROS2, Foxy 설치 링크

5. NVIDIA SDK Manager 설치

1. 베포판 다운로드
링크 에 접속하여 ".deb Ubuntu "다운
2. 다운로드 파일 확인 및 파일 복사(ctrl+shift+c)
cd ~/Downloads
ls
2. 설치( 파일 경로 내에서)
sudo apt install ./[붙여넣기] (직접 치기)
3. 실행
sdkmanager
4. JetPack (Jetson Firmware) 다운로드
Target Hardware : Jetson Xavier NX

설치 가이드 링크

export 참고

Nvidia Jetson Nano ㅡ 노트북 연결

1. Jetson Nano Setup

1. 점퍼 핀을 FC RECGND 에 연결 후 노트북-Jetsond 연결(USB-C)

2. Nvidia SDK Manager 로그인

3. Target hardware : Jetson xavier NX [developer kit version] < 선택

4. 라이센스 동의 후 COUNTINUE (Download now install later 박스는 체크 x)

5. Flash

  • Username, Password 지정

6. Install

  • Connection: NVME (SSD)
  • IP address 는 USB C-Type connector 와 연결되는 기본값 ip 사용, 192.168.55.1
  • Jetson 의 username 과 password 를 입력
  • Install 을 클릭하여 계속 진행

7. 설치 완료와 부팅화면 확인 후 FC REC 와 GND에 연결된 점퍼 핀 제거 후 재부팅 진행

2. Ros 통신 Setup (노트북 & Jetson(모니터와 연결하여 진행))

1. 노트북 & Jetson 같은 Wifi에 연결 (중요!)

2. 작업공간 만든 후, 깃 클론 진행

mkdir -p f1tenth_ws/src 
cd f1tenth_ws/src 
git clone https://github.com/Kwally1209/F1tenth_bootcamp.git

(F1tenth Git 저장소 복제 주소 > F1tenth_Bootcamp )

3. 패키지 설치

sudo apt-get install python3-pip
sudo apt-get install ros-noetic-driver-base
sudo apt-get install ros-noetic-urg-node
sudo apt-get install ros-noetic-map-server
sudo apt-get install ros-noetic-joy

4. f1tenth_ws 위치에서 catkin_make 빌드 진행

cd ..
catkin_make

5. python 파일(joy_teleop.py) 실행 권한 부여

cd ~/f1tenth_ws/src/F1tenth_bootcamp/racecar/racecar/scripts
chmod +x joy_teleop.py

6. joy_teleop.py 파일 수정

  • 279번 줄 ", e" -> " as"
  • 284번 줄, iteritems > items

7. Wifi 연결 후 ip 확인 (Jetson ip)

ifconfig

8. ~/.bashrc 작성

  • 아래 내용 그대로 추가 후 저장 (Nvidia & 노트북)
export ROS_MASTER_URI=http://[차량 Nvidia IP]:11311   # 192.168.1.113    
export ROS_IP=[차량 Nvidia IP]                          
export ROS_HOSTNAME=$ROS_IP 

alias b='gedit ~/.bashrc'
alias s='source ~/.bashrc'

alias v1='sudo mkdir /dev/sensors'
alias v2='sudo ln -s /dev/ttyACM0 /dev/sensors/vesc'
alias v3='sudo chmod 777 /dev/ttyACM0'
alias v4='source ~/f1tenth_ws/devel/setup.bash'
alias v5='roslaunch racecar teleop.launch'

alias vesc='sudo mkdir /dev/sensors && sudo ln -s /dev/ttyACM0 /dev/sensors/vesc && sudo chmod 777 /dev/ttyACM0 && source ~/f1tenth_ws/devel/setup.bash && roslaunch racecar teleop.launch'   
alias lidar='rosrun urg_node urg_node _ip_address:=192.168.0.10' 
alias sb='source ~/.bashrc' 
alias vb='vim ~/.bashrc' 
alias hector='source ~/hector/devel/setup.bash && roslaunch hector_mapping mapping_default.launch' 
alias mapsave='rosrun map_server map_saver -f map_data' 
alias particle='source /home/hmclab/parScle/devel/setup.bash && roslaunch particle_filter localize.launch' 
alias joy='rosrun joy joy_node _autorepeat_rate:=20.0'
  • ".bashrc" 파일 실행
source ~/.bashrc

8. 통신 확인
1) Jetson

rosecore

2) 노트북

rosenode ping --all

3. Lidar 통신 test

1. Ethernet 연결 (Nvidia)

  • Settings > Network > Wired > "[+]"

    IPv4 method : Manual
    Addresses : 192.168.0.15
    Netmask : 24
    Gateway : 192.168.0.1

2. 연결 확인

1) Ping test
ping 192.168.0.15
(Ethrenet address)
2) Ros에서 LIDAR 읽어 들이는지 확인
lidar
or
rosrun urg_node urg_node _ip_address:=192.168.0.10
3) 센서 값 받아보기
rostopic echo /scan
4) 센서 값 시각적으로 확인
rosrun rviz rviz
5) Rviz
[add] > [By topic] > [/scan] > [laser] < 더블 클릭
map : "/laser"로 수정 (Topic : /scan)

참고

4. VESC

PID

5. Joystick 연결

1) Nvidia 보드에 조이스틱 USB 연결
2) 전면 스위치 D > X
3) 연결 확인

cd /dev/input
ls		#js0 확인
sudo jstest /dev/input/js0		# 값 나오는지 확인
joy		# alias commend
rostopic echo /joy		# 조이스틱 버튼과 축 값 확인

4) 작동 확인

  • Jetson Terminal
    1) roscore
    2) vesc
    3) lidar
    4) joy
  • 좌측 앞의 LB 스위치를 한번 누른 후, 다시 계속 누른 상태에서 조작
  • Parameter 조정
    1) Speed & Steering angle: joy_teleop.yaml 파일 수정
    파일 위치: f1_tenth/src/F1tenth_bootcamp/racecar/racecar/config/racecar-v2
    -> human_control 부분의 scale 값(m/s) 수정
    2) Initial steering angle: vesc.yml 파일 수정

참고 - joystick parameter

ckarh

참고

f1tenth build link

6. Python 코드를 통한 실행

1) Motor 정상작동 확인

  • Wall_following_lab.py 코드 수정
    파일위치: Home/f1tenth_ws/src/F1tenth_bootcamp/racecar/racecar/scripts
    수정사항 (error 따라가면 됨)
    1) real_velocity (instance) 부분 주석 처리
    2) def pid_control(self, error, velocity):
    pass
    부분 들여쓰기 해주기
    3) 파일 실행권한 부여
    cd f1tenth_ws/src/F1tenth_bootcamp/racecar/racecar/scripts
    ls -all 해당 파일에 x(excutable)표시 없으면
    chmod +x <파일이름.py>
    4) roscore, vesc, lidar 실행
    5) 해당 디렉토리로 이동 후 코드 실행
    python <파일이름.py>
    (코드)
#!/usr/bin/env python
from __future__ import print_function
import sys
from math import pi, atan, sin, cos
import numpy as np
import time
# ROS Imports
import rospy
from sensor_msgs.msg import Image, LaserScan
from ackermann_msgs.msg import AckermannDriveStamped, AckermannDrive
from std_msgs.msg import Float64
from nav_msgs.msg import Odometry

# TO DO: Tune parameters
# PID CONTROL PARAMS
kp = 2.2
kd = 0.01
ki = 0.001
servo_offset = 0.0
prev_error = 0.0
error = 0.0
integrator = 0.0
prev_time = time.time()

# WALL FOLLOW PARAMS
ANGLE_RANGE = 270  # Hokuyo 10LX has 270 degrees scan
DESIRED_DISTANCE_RIGHT = 0.50  # meters
DESIRED_DISTANCE_LEFT = 0.5
VELOCITY = 4  # meters per second
CAR_LENGTH = 0.50  # TfollowLeftraxxas Rally is 20 inches or 0.5 meters


class WallFollow:
    """ Implement Wall Following on the car
    """

    def __init__(self):
        # Topics & Subs, Pubs
        self.lidar_sub = rospy.Subscriber("/scan", LaserScan, self.lidar_callback)  #: Subscribe to LIDAR
        self.velocity_sub = rospy.Subscriber("/vesc/odom", Odometry, self.callback_vel)#: Subscribe to VESC

        self.drive_pub = rospy.Publisher('/vesc/ackermann_cmd', AckermannDriveStamped,
                                         queue_size=10)  #: Publish to drive
        # self.start = 0
        # self.timestamp = rospy.Time.now().secs + rospy.Time.now().nsecs / 1000000000
        # self.prev_timestamp = self.timestamp
        # self.time_duration = 0

    def callback_vel(self, data):
        #TO DO: Subscribe Current Velocity
        #self.real_velocity = data.twist.twist.linear.x

    	def pid_control(self, error, velocity):
        	pass
        # TODO: Use kp, ki & kd to implement a PID controller
        #       Example:
        #               drive_msg = AckermannDriveStamped()
        #               drive_msg.header.stamp = rospy.Time.now()
        #               drive_msg.header.frame_id = "laser"
        #               drive_msg.drive.speed = 0
        #               self.drive_pub.publish(drive_msg)

    def lidar_callback(self, data):
        global kp
        global kd
        global ki
        global servo_offset
        global prev_time
        global prev_error
        global error
        global integrator

        # get velocity to get AC length
        drive_msg = AckermannDriveStamped()
        drive_msg.header.frame_id = "laser"
        drive_msg.header.stamp = rospy.Time.now()
        drive_msg.drive.speed = 4 # VELOCITY
		drive_msg.drive.steering_angle = -2 # Steering angle

        self.drive_pub.publish(drive_msg)


def main(args):
    rospy.init_node("WallFollow_node", anonymous=False)
    wf = WallFollow()
    rospy.sleep(0.1)
    rospy.spin()


if __name__ == '__main__':
    main(sys.argv)

ROS에서 로지텍 조이스틱을 사용하기 위해 ros-noetic-joy 패키지를 설치했다면, 이를 이용하여 로지텍 조이스틱으로 로봇이나 드론을 제어할 수 있습니다. 아래는 로지텍 조이스틱을 사용하여 간단한 조작을 시작하는 단계입니다:

로지텍 조이스틱 연결: 먼저 로지텍 조이스틱을 컴퓨터에 연결합니다. 일반적으로 USB 포트를 사용하여 연결하게 됩니다.

ROS Joy 패키지 실행: ros-noetic-joy 패키지를 사용하려면 ROS를 실행해야 합니다. 터미널을 열고 다음 명령어로 ROS를 실행합니다:

roscore

이 명령어를 실행하면 ROS 마스터가 시작됩니다.

Joy 노드 실행: 로지텍 조이스틱을 ROS에서 사용하기 위해 joy 노드를 실행합니다. 새로운 터미널 창을 열고 다음 명령어를 실행합니다:

rosrun joy joy_node

이 명령어는 조이스틱의 입력을 ROS 메시지로 변환하여 게시합니다.

조이스틱 메시지 확인: 로지텍 조이스틱의 입력 메시지를 확인하려면 새로운 터미널 창을 열고 다음 명령어를 실행합니다:

bash

rostopic echo /joy

이 명령어를 실행하면 조이스틱의 입력 메시지가 실시간으로 표시됩니다. 이를 통해 조이스틱의 버튼과 축 값을 확인할 수 있습니다.

조이스틱으로 로봇 또는 드론 제어: 이제 로지텍 조이스틱의 입력 메시지를 사용하여 로봇 또는 드론을 제어할 수 있습니다. 조이스틱의 버튼과 축 값에 따라 원하는 동작을 프로그래밍하고, 해당 동작을 실행하는 ROS 패키지를 만들어야 합니다. 이 부분은 로봇 또는 드론의 제어 시스템과 연관이 있으므로 자세한 내용은 해당 시스템의 문서를 참조하거나 필요한 ROS 패키지를 설치하고 사용법을 익히는 것이 필요할 것입니다.

로지텍 조이스틱을 사용하여 ROS에서 로봇 또는 드론을 제어하려면 로봇 또는 드론의 모델과 환경에 따라 추가적인 설정 및 프로그래밍이 필요할 수 있습니다. 이러한 작업은 로봇 또는 드론의 특정 ROS 패키지나 컨트롤러에 대한 문서와 지침을 따라야 합니다.

https://www.youtube.com/results?search_query=f1tenth+racing+tutorial

profile
System_Dynamics_Lab

0개의 댓글