산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

자율 탱크

Lego EV3 세트를 사용하여 Carter 및 Kaya 디자인 참조에 훨씬 저렴한 대안을 추가합니다.

이 프로젝트에서 저는 Lego Technic 부품과 모터로 만들고 LiDAR로 향상되고 최신 Isaac SDK를 실행하는 Jetson Nano 보드로 제어되는 추적 차량의 구성을 문서화할 것입니다. 8부로 이동 또는 10 자율 주행의 전체 데모를 보려면

프로젝트는 다음 구성요소로 구성됩니다.

<울>
  • NVIDIA Jetson Nano 개발 보드 – 아이작 로봇 엔진 실행
  • EV3 브릭 – 모터 제어(EV3 31313 로봇 키트에 제공됨) )
  • 추적 기반 - 레고 테크닉 부품과 2개의 대형 모터를 사용하여 제작됨(필요한 모든 것이 EV3 31313 로봇 키트에 제공됨) )
  • YDLIDAR x4 LiDAR
  • Pixy2 시력용 카메라
  • ROS가 아닌 Isaac SDK를 선택해야 하는 이유

    <울>
  • ROS(Robot Operating System)에 대한 자습서는 많지만 Isaac에 대한 자습서는 거의 없습니다(SDK 자체의 자습서 제외)
  • Jetson Nano에 더 나은 선택인 것 같습니다(이 하드웨어 제품군용으로 제작됨)
  • 계획에서 인지까지의 고급 로봇 공학 알고리즘, 대부분 GPU 가속 . 이것은 중요한 부분입니다. GPU 가속이 없는 Jetson Nano는 Raspberry Pi 4 보드와 어떤 면에서도 다르지 않습니다.
  • IsaacSim Unity3D는 Gazebo보다 사실적이어서 시뮬레이션에서 현실로 옮겨가는 결과를 개선합니다.
  • 레고 부품이 필요한 이유

    <울>
  • 많이 가지고 있어요 🙂
  • 부품은 고품질(좋은 서보)
  • 3D 프린터가 없습니다(친구에게 레고와 호환되는 Jetson Nano 케이스를 인쇄해 달라고 부탁했지만 3D로 인쇄된 부분만 해당)
  • 납땜 필요 없음
  • 이 경로를 선택하면 몇 가지 문제가 발생합니다.

    <울>
  • Isaac SDK는 레고 하드웨어를 지원하지 않습니다. Carter와 Kaya의 두 가지 참조 로봇만 존재합니다. JetBot도 지원되지 않습니다.
  • Isaac SDK는 제한된 수의 하드웨어 구성 요소에서만 작동할 수 있습니다.
  • 3개 대상에 대한 컴파일(x86-64, arm64 및 armv5tejl)
  • 모든 것이 오픈 소스는 아닙니다
  • 파트 1:시작하기

    1. 아이작 SDK

    <울>
  • 여기에 설명된 단계를 따르세요.
  • Isaac SDK에서 제공되는 몇 가지 예제를 실행하여 모든 것이 작동하는지 확인하십시오.
  • 2019.3 SDK 버전을 사용해야 합니다!!!
  • 2. 음성 인식(선택 사항)

    <울>
  • CUDA 10.0, CUDNN 7.6.3, TensorRT 6.0 설치
  • TensorFlow 1.15.0 설치(하드웨어 가속)
  • 3. Ev3dev 이미지

    microSD 또는 microSDHC 카드에 EV3(ev3dev-stretch)용 최신 이미지를 다운로드하여 플래시합니다. MicroSDXC 형식은 EV3 브릭에서 지원되지 않습니다.

    4. ev3dev용 ARM 크로스 컴파일러

    $ sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi 

    이 부분은 특히 올바르게 설정하기가 어려웠습니다. Ubuntu 18.04(호스트 컴퓨터 및 Jetson Nano)는 GLIBC_2.28을 사용하고 ev3dev는 Debian stretch 및 GLIBC_2.24를 사용합니다. 기본 arm-linux-gnueabi-g++ 컴파일러 구성으로 컴파일된 모든 항목은 GLIBC_2.28에 종속되었으며 EV3에서 실행되지 않습니다. 정적으로 연결하는 것은 hello world가 segfault를 일으키는 것보다 더 복잡한 것으로 작동하지 않습니다. 내가 찾은 해결책은 수학 라이브러리를 제외한 모든 것을 동적으로 연결하는 것이 었습니다. jetson-ev3/toolchain/CROSSTOOL 파일에서 더 많은 정보를 찾을 수 있습니다. 또 다른 해결책은 Debian 9의 도커 이미지를 사용하는 것입니다.

    5. Jetson + EV3 작업 공간

    $ git clone https://github.com/andrei-ace/jetson-ev3.git 
    <울>
  • jetson-ev3/WORKSPACE를 수정하고 Isaac SDK의 경로를 설정합니다.
  • local_repository(
    이름 ="com_nvidia_isaac",
    경로 ="/home/andrei/ml/isaac"
    )
    <울>
  • jetson-ev3/toolchain/CROSSTOOL을 편집하고 이 파일이 있는 디렉토리의 경로를 설정합니다.
  • # 도구 체인 경로로 편집
    linker_flag:"-L/home/andrei/ml/jetson-ev3/toolchain"

    6. Jetson Nano와 EV3 연결

    다음 파트에서는 ​​많은 Linux 명령을 게시할 것입니다. 관련된 세 가지 시스템이 있기 때문에 내 터미널에서 볼 수 있는 그대로 게시할 것입니다. 의미:

    [이메일 보호됨]:~/ml/jetson-ev3$ #이것은 내 PC에서 실행됩니다
    [이메일 보호됨]:~$ #이것은 켜져 있습니다 Jetson Nano
    [이메일 보호됨]:~$ $ #EV3의 this in

    내 Jetson Nano의 IP는 192.168.0.173(이더넷) 및 192.168.0.218(WiFi)이므로 해당 값을 사용하는 명령이 표시될 때마다 해당 값을 사용자 것으로 교체합니다.

    다음 단계에 따라 USB A-미니 케이블을 사용하여 Jetson 보드와 EV3 브릭을 연결했습니다.

    Jetson 보드에서 ssh 시도:

    [이메일 보호됨]:~$ ssh [이메일 보호됨] 

    기본 비밀번호는 메이커입니다.

    7. 탁구 튜토리얼

    Isaac은 매우 간단한 Codelet을 설명하는 가이드를 가지고 있습니다. 이 자습서를 먼저 수행하는 것이 좋습니다. Isaac에서 실행되는 앱을 빌드하는 데 필요한 개념을 소개합니다.

    이제 jetson-ev3/apps/ev3/ping_pong/ 디렉터리로 이동합니다. 이것은 이전 튜토리얼의 수정된 버전으로, 약간의 변형을 통해 EV3 브릭에 핑을 보낼 것입니다.

    대부분의 파일은 이전 자습서에서 익숙합니다. Jetson과 EV3 간의 통화에는 Cap'n Proto RPC를 사용합니다. Cap' Proto는 다양한 Isaac 구성 요소 간의 통신에 많이 사용되므로 여기에서 사용하는 것이 좋습니다. 이를 위해 몇 가지 새 파일이 필요합니다.

    <울>
  • jetson-ev3/apps/ev3/ping_pong/ping.capnp – 이것은 Isaac Robot Engine에서 실행될 클라이언트와 EV3에서 실행될 서버 간의 인터페이스를 정의합니다.
  • jetson-ev3/apps/ev3/ping_pong/PongEv3Server.cpp EV3 브릭에서 실행되는 서버입니다.
  • jetson-ev3/apps/ev3/ping_pong/Pong.cpp EV3에서 실행되는 Pong 서버를 호출하도록 변경됨
  • ev3_pong 서버 컴파일:

    [이메일 보호됨]:~/ml/jetson-ev3$ bazel 빌드 --config=ev3dev //apps/ev3/ping_pong:ev3_pong 

    scp를 사용하여 먼저 Jetson에 복사한 다음 EV3에 복사하여 EV3에 복사합니다.

    핑퐁 예제를 빌드하고 Jetson에 배포:

    [이메일 보호됨]:~/ml/jetson-ev3$ /engine/build/deploy.sh --remote_user  -p //apps/ev3/ping_pong:ping_pong-pkg -d jetpack43 -h  

    Jetson에서 앱을 배포하고 실행하는 방법에 대한 자세한 내용은 여기를 참조하세요.

    두 앱 모두 실행:

    [이메일 보호됨]:~$ ./ev3_pong ev3dev.local:9999
    [이메일 보호됨]:~/deploy/andrei/ping_pong-pkg$ . /apps/ev3/ping_pong

    모든 것이 제대로 작동했다면 Ping 구성 요소가 EV3의 스피커로 보낸 메시지를 들을 수 있을 것입니다.

    8.Isaac의 모터 제어

    같은 원리지만 조금 더 복잡합니다. 저는 아이작의 다른 가이드를 사용하여 EV3 모터와 상호작용했습니다.

    이 튜토리얼은 Segway RMP 기반을 사용합니다. 나는 주위에 누워 있거나 하나를 살 10000$가 없기 때문에 대신 EV3 모터를 제어할 드라이버를 만들었습니다. 코드는 여기에 있습니다.

    EV3에서 실행되는 서버가 여기에 있으며 다음 명령어로 빌드하고 실행할 수 있습니다.

    [이메일 보호됨]:~/ml/jetson-ev3$ bazel 빌드 --config=ev3dev //packages/ev3/ev3dev:ev3_control_server
    [이메일 보호됨]:~$ ./ev3_control_server ev3dev.local:9000

    여기에 설명된 대로 Sight의 가상 조이스틱을 사용했습니다.

    9.EV3용 DifferentialBase

    Ev3ControlServer 서버는 2개의 호출에 응답합니다.

    <울>
  • command(cmd :Control) – 선형 및 각속도를 매개변수로 사용하고 두 모터를 모두 제어하여 요청된 속도를 얻습니다.
  • state() -> (state:Dynamics); – 로봇의 실제 선형 및 각속도를 반환합니다.
  • 운동학은 여기와 여기에서 더 자세히 설명되어 있습니다.

    Proportional_control_cpp 샘플 앱을 사용하여 로봇을 1m 구동하고 EV3의 주행 거리(선형 및 각속도) 데이터를 초당 회전 펄스(타코 카운트)로 보고했습니다. 계산된 이동 거리(Isaac에 의해)를 사용하고 실제 거리를 측정하여 보고된 값을 조정하여 실제 결과와 일치하도록 상수를 생각해 냈습니다. 이것은 잘 작동했고 결과는 직선뿐만 아니라 여러 번 재현할 수 있었습니다. 휠(또는 이 경우 트랙)의 반경을 사용하여 이 값을 계산할 수도 있습니다.

    2부:로봇 만들기

    베이스는 EV3 키트의 공식 모델 중 하나인 레고의 EV3 Track3r과 매우 유사합니다. https://www.lego.com/biassets/bi/6124045.pdf

    Jetson Nano의 사례는 다음에서 가져옵니다. https://github.com/3D-printable-lego-technic/PELA-blocks

    파트 3:아이작 앱

    Isaac 앱은 세 가지 주요 부분으로 구성됩니다.

    <울>
  • graph – 노드:이 부분은 앱을 만드는 모든 구성 요소를 정의합니다. 노드는 다른 파일에 정의된 또 다른 그래프일 수도 있습니다. 예제의 "voice_detection" 노드는 하위 그래프입니다.
  • graph – edge:이 부분은 노드 간의 메시지 흐름을 정의합니다. 에지에는 소스와 대상이 있습니다. 예를 들어 "voice_detection" 노드(하위 그래프)에서 감지된 명령은 목표를 생성하는 구성 요소로 전송됩니다.
  • 구성 – 이 부분은 그래프의 노드를 구성합니다.
  • 예시 앱:

    <코드>{
    "이름":"음성 제어",
    "모듈":[
    "//apps/ev3/voice_control:voice_control_goal_generator",
    "@com_nvidia_isaac//packages/navigation",
    "@com_nvidia_isaac//packages/planner"
    ],
    "config_files":[
    " apps/ev3/voice_control/model/isaac_vcd_model.metadata.json"
    ],
    "구성":{
    "2d_ev3.ev3_hardware.ev3":{
    "isaac.Ev3Driver ":{
    "주소":"ev3dev.local",
    "포트":9000
    }
    },
    "navigation.imu_odometry.odometry":{
    "DifferentialBaseWheelImuOdometry":{
    "use_imu":false
    }
    },
    "commander.robot_remote":{
    "isaac.navigation.RobotRemoteControl ":{
    "angular_speed_max":0.6,
    "linear_speed_max":0.3
    }
    },
    "웹사이트":{
    "웹사이트서버":{
    "webroot":"external/com_nvidia_isaac/packages/sight/webroot",
    "ui_config":{
    "windows":{
    "음성 명령 감지":{
    "렌더러":"플롯" ,
    "dims":{
    "너비":400,
    "높이":200
    },
    "채널":[
    {
    "이름":"voice_control/voice_detection.voice_command_detector/isaac.audio.VoiceCommandConstruction/voice_command_id",
    "활성":true
    }
    ]
    }
    }
    }
    }
    },
    "navigation.shared_robot_model":{
    "SphericalRobotShapeComponent":{
    "원":[
    { "중심":[0.0, 0.0], "반지름":0.075 },
    { "중심":[0.02, 0.03464], "반지름":0.055 },
    { "중심":[0.02, -0.03464], "반지름":0.055 },
    { "중심":[-0.04, 0.0], "반지름":0.055 },
    { "중심":[0.0525, 0.09093 ], "반지름":0.035 },
    { "중심":[0.0525, -0.09093], "반지름":0.035 },
    { "중심":[-0.105, 0.0], "반지름 ":0.035 }
    ]
    }
    },
    "navigation.control.lqr":{
    "isaac.planner.DifferentialBaseLqrPlanner":{
    "manual_mode_channel":"commander.robot_remote/isaac.navigation.RobotRemoteControl/manual_mode"
    }
    },
    "navigation.control.control":{
    "isaac.planner.DifferentialBaseControl":{
    "manual_mode_channel":"commander.robot_remote/isaac.navigation.RobotRemoteControl/manual_mode"
    }
    }
    },
    "그래프":{
    "노드":[
    {
    "이름":"음성 제어_구성 요소",
    "구성 요소":[
    {
    "이름":"message_ledger",
    "유형":"isaac::alice::MessageLedger"
    },
    {
    "이름":"goal_generator",
    "유형":"isaac::VoiceControlGoalGenerator"
    }
    ]
    },
    {
    "이름":"음성_감지",
    "하위 그래프":"apps/ev3/voice_control/voice_command_detection.subgraph.json"
    },
    {
    "이름":"2d_ev3",
    "하위 그래프":"apps/ev3/2d_ev3.subgraph.json"
    },

    {
    "이름":"내비게이션",
    "하위 그래프":"@com_nvidia_isaac//packages/navigation/apps/differential_base_navigation.subgraph.json"
    },
    {
    "이름":"사령관",
    "하위 그래프":"@com_nvidia_isaac//packages/navigation/ apps/differential_base_commander.subgraph.json"
    }
    ],
    "가장자리":[
    {
    "소스":"음성_검출.subgraph/인터페이스/Detected_command" ,
    "대상":"음성_제어_구성요소/목표_생성기/감지된_명령"
    },
    {
    "출처":"음성_제어_구성요소/목표_생성기/목표",
    "대상" :"navigation.subgraph/interface/goal"
    },
    {
    "source":"2d_ev3.subgraph/interface/base_state",
    "target":"내비게이션. 하위 그래프/인터페이스/상태"
    },
    {
    "소스":"navigation.subgraph/interface/command",
    "대상":"commander.subgraph/인터페이스/ 제어"
    },
    {
    "소스":"commander.subgraph/interface/command",
    "대상":"2d_ev3.subgraph/interface/base_command"
    },
    {
    "소스":"2d_ev3.subgraph/interface/flatscan",
    "대상":"navigation.subgraph/interface/flatscan_for_localization"
    },
    {
    "소스":"2d_ev3.subgraph/interface/flatscan",
    "대상":"탐색. 하위 그래프/인터페이스/flatscan_for_obstacles"
    }
    ]
    }
    }

    서브그래프 예:

    <코드>{
    "모듈":[
    "@com_nvidia_isaac//packages/audio",
    "@com_nvidia_isaac//packages/ ml:tensorflow"
    ],
    "그래프":{
    "노드":[
    {
    "이름":"하위 그래프",
    " 구성 요소":[
    {
    "이름":"message_ledger",
    "유형":"isaac::alice::MessageLedger"
    },
    {
    "이름":"인터페이스",
    "유형":"isaac::alice::Subgraph"
    }
    ]
    },
    {
    "이름":"audio_capture",
    "구성 요소":[
    {
    "이름":"ml",
    "유형":"isaac::alice ::MessageLedger"
    },
    {
    "이름":"isaac.audio.AudioCapture",
    "유형":"isaac::audio::AudioCapture"
    }
    ]
    },
    {
    "이름":"voice_command_detector",
    "구성 요소":[
    {
    " 이름":"ml",
    "유형":"isaac::alice::MessageLedger"
    },
    {
    "이름":"isaac.audio.VoiceCommandFeatureExtraction" ,
    "유형":"isaac::audio::VoiceCommandFeatureExtraction"
    },
    {
    " 이름":"isaac.ml.TensorflowInference",
    "유형":"isaac::ml::TensorflowInference"
    },
    {
    "이름":"isaac. audio.VoiceCommandConstruction",
    "유형":"isaac::audio::VoiceCommandConstruction"
    }
    ]
    }
    ],
    "가장자리" :[
    {
    "소스":"audio_capture/isaac.audio.AudioCapture/audio_capture",
    "대상":"voice_command_detector/isaac.audio.VoiceCommandFeatureExtraction/audio_packets"
    },
    {
    "소스":"voice_command_detector/isaac.audio.VoiceCommandFeatureExtraction/feature_tensors",
    "대상":"voice_command_detector/isaac.ml.TensorflowInference/input_tensors"
    },
    {
    "소스":"voice_command_detector/isaac.ml.TensorflowInference/output_tensors",
    "대상":"voice_command_detector/isaac.audio.VoiceCommandConstruction/keyword_probabilities"
    },
    {
    "소스":"voice_command_detector/isaac.audio.VoiceCommandConstruction/detected_command",
    "대상":"하위 그래프/인터페이스/감지됨 _command"
    }
    ]
    },
    "구성":{
    "audio_capture":{
    "isaac.audio.AudioCapture":{
    "sample_rate":16000,
    "num_channels":1,
    "audio_frame_in_milliseconds":100,
    "ticks_per_frame":5
    }
    },
    "voice_command_detector":{
    "isaac.audio.VoiceCommandFeatureExtraction":{
    "audio_channel_index":0,
    "minimum_time_between_inferences":0.1
    },
    "isaac.ml.TensorflowInference":{
    "model_file_path":"apps/ev3/voice_control/model/isaac_vcd_model.pb",
    "config_file_path":"apps/ev3/voice_control/model/isaac_vcd_config. pb"
    },
    "isaac.audio.VoiceCommandConstruction":{
    "command_list":[
    "jetson",
    "jetson 왼쪽",
    "제트슨 오른쪽"
    ],
    "command_ids":[0, 1, 2],
    "max_frames_allowed_after_keyword_detected":14
    }
    }
    }
    }

    하위 그래프는 많은 앱에서 재사용할 수 있습니다. 실제로 isaac의 탐색 스택은 하위 그래프로 사용됩니다.

    4부:EV3에서 Isaac 앱 실행

    드라이버(jetson-ev3/packages/ev3/BUILD)는 Segway RMP 기본 드라이버와 동일한 명령에 응답합니다. 즉, Kaya 또는 Carter에서 작동하는 많은 앱과 함께 작동하므로 세 번째 옵션으로 훨씬 저렴합니다!

    Carter 및 Kaya 봇을 소개하기 위해 만든 일부 앱을 수정했습니다.

    <울>
  • 조이스틱 앱 – 조이스틱으로 DifferentialBase 로봇을 제어합니다. 지역 지도 생성을 위한 LiDAR가 있습니다.
  • <울>
  • gmapping 분산:Kaya 로봇의 ev3 및 호스트 - EV3 로봇과 YDLIDAR X4를 사용하여 GMap을 생성할 수 있습니다.
  • 전체 탐색 – 하드웨어에 대한 하위 그래프와 EV3 로봇에 대한 2D 탐색을 추가하여 Carter나 Kaya를 사용하는 것처럼 쉽게 다른 앱에서 사용할 수 있도록 했습니다.
  • 파트 5:주행 거리 측정

    자율 모드에서 달리기 위해서는 좋은 주행 거리를 갖는 것이 중요합니다. 이는 시간 경과에 따른 로봇의 위치를 ​​추정하는 데 사용됩니다. ev3 앱을 사용하여 조정해 보겠습니다.

    [이메일 보호됨]:~/ml/jetson-ev3$ ./engine/build/deploy.sh --remote_user andrei -p //apps/ev3:ev3 -pkg -d jetpack43 -h 192.168.0.173

    [이메일 보호]:~$ brickrun ./ev3_control_server ev3dev.local:9000

    [이메일 보호]:~/deploy /andrei/ev3-pkg$ ./apps/ev3/ev3 --graph ./apps/assets/maps/map.graph.json --config ./apps/assets/maps/map.config.json

    두 가지를 추정해야 합니다.

    <울>
  • 선형 속도
  • 각속도
  • 선형 및 각속도 공식은 다음과 같습니다.

    각속도를 찾는 것은 쉽습니다. 좌우 모터의 차이를 베이스 길이로 나눈 값입니다.

    선형 속도를 찾는 것은 조금 더 복잡합니다. 3가지 경우가 있습니다:

    <울>
  • 두 모터 속도가 같을 때 – 선형 속도는 오른쪽 속도(및 왼쪽 속도)와 동일합니다.
  • 왼쪽 모터 속도가 오른쪽 모터 속도와 반대일 때 선형 속도는 0이고 탱크는 제자리에서 회전합니다.
  • 왼쪽 모터 속도가 0일 때(오른쪽에 설명된 경우). 선형 속도는 올바른 속도의 절반입니다(로봇의 중심은 더 작은 호를 따라 이동합니다).
  • 각속도 실험:

    수동 제어를 사용하여 로봇을 제자리에서 360도 회전합니다. 이것은 왼쪽과 오른쪽 모터를 반대 속도로 움직여서 수행됩니다. 두 모터의 속도를 알면 각속도를 계산할 수 있습니다.

    시도해 봅시다:

    각 및 선형 속도 실험:

    나는 탱크를 이리저리 몰고 마지막에 시작 위치로 되돌리려고 노력할 것입니다. 속도를 올바르게 계산하는 경우 주행 거리 측정 데이터는 마지막에 가능한 한 0에 가까워야 합니다.

    6부:모든 것을 하나로 모으기

    자, 이제 값비싼 RC 탱크를 갖게 된 것뿐인가요? 아니요, 이제 이삭의 다른 모든 부분을 사용할 수 있습니다. 예를 들어 음성 명령을 내리고 로봇이 자율적으로 움직이도록 합니다. 이에 대한 예는 voice_control을 확인하세요.

    그것은 Isaac의 오디오 및 기계 학습 보석을 사용합니다. 보석이란 무엇입니까? 매뉴얼에 명시된 바와 같이:"GEM:계획에서 인지에 이르는 로봇 알고리즘의 모음이며, 대부분은 GPU 가속입니다."

    이 가이드에 설명된 단계에 따라 자체 RNN을 학습했습니다. 특히 unknownkeywords/silence/random noise의 경우 데이터가 많은지 확인하십시오.

    저는 'jetson', 'left', 'right'라는 3가지 단어를 인식하도록 훈련했습니다. 여기에서 저장된 모델을 찾을 수 있습니다. 이 3개의 단어로 "jetson left" 및 "jetson right"의 2가지 명령을 작성할 수 있습니다.

    감지 부분은 사용 및 재사용 준비가 된 자체 하위 그래프에 설명되어 있습니다.

    기본적으로 마이크의 소리를 듣고 명령 중 하나를 선택하면 voice_command_id를 출력합니다. 이를 위해 이전에 훈련된 RNN을 사용합니다.

    그 detect_command를 가져와서 자체 Codelet에 전달할 수 있습니다.

    {
    "source":"voice_detection.subgraph/interface/detected_command",
    "target":"voice_control_components/goal_generator/detected_command"
    }

    Codelet에서 목표를 생성하고 게시할 수 있습니다.

    자동 proto =rx_detected_command().getProto();
    int id =proto.getCommandId();
    자동 goal_proto =tx_goal(). initProto();
    goal_proto.setStopRobot(true);
    goal_proto.setTolerance(0.1);
    goal_proto.setGoalFrame("로봇");
    ToProto(Pose2d::Rotation( 90), goal_proto.initGoal());
    tx_goal().publish();

    이것은 로봇을 왼쪽으로 90도 회전시키는 목표를 설정합니다. 우리는 다른 프레임에서 다른 목표를 설정할 수 있습니다. 그것은 부엌의 좌표와 같은 "세계"프레임의 좌표로 이동했을 수 있습니다. 로봇의 프레임에 Pose2::Translate(1.0, 0)를 설정하여 로봇을 1미터 전진시켰을 수도 있습니다.

    그리고 여기에서 목표를 글로벌 플래너에게 전달합니다.

    {
    "source":"voice_control_components/goal_generator/goal",
    "target":"navigation.subgraph/interface/goal"
    }

    모든 마법이 일어나는 곳:

    불행히도 5W가 아닌 10W 모드에서만 작동하므로 내 배터리에 너무 많은 양입니다. 5W 모드에서 추론이 너무 오래 걸립니다:

    나는 더 작은 RNN으로 시도했고 2개의 사용 가능한 CPU 코어(nvpmodel -m 1)에서 3개로 늘렸지만 별로 도움이 되지 않았습니다. 추론을 위한 시간을 30ms로 줄였지만 정확한 결과를 얻기에는 여전히 너무 깁니다.

    7부:매핑

    지도를 만들려면 Jetson에서 하나의 Isaac 인스턴스를 실행하고 호스트 컴퓨터에서 하나를 실행해야 합니다. 매핑에는 Jetson Nano가 처리할 수 있는 것보다 많은 리소스가 필요합니다.

    [이메일 보호됨]:~/ml/jetson-ev3$ ./engine/build/deploy.sh --remote_user andrei -p //apps/ev3:gmapping_distributed_ev3 -pkg -d jetpack43 -h 192.168.0.218

    [이메일 보호됨]:~/deploy/andrei/gmapping_distributed_ev3-pkg$ ./apps/ev3/gmapping_distributed_ev3

    [이메일 보호됨]:~/ml/jetson-ev3$ bazel 실행 앱/ev3:gmapping_distributed_host

    Jetson IP로 apps/ev3/gmapping_distributed_host.app.json 파일을 변경하는 것을 잊지 마십시오:

    <코드>"tcp_subscriber":{
    "isaac.alice.TcpSubscriber":{
    "포트":5000,
    "호스트" :"192.168.0.218"
    }
    }

    출처:자율 탱크


    제조공정

    1. Donkey Car Garbage Collector를 위한 자율 주행 AI
    2. 탱크 23일차:범위 및 방위
    3. JQR 4족 자율 로봇
    4. 자율적인 미래를 위한 준비
    5. CNC 가공된 전투 탱크 모델
    6. 자율 로봇이 문을 열다
    7. 자율적 어셈블러 어셈블
    8. 예비 탱크란 무엇입니까?
    9. 연료 탱크 용접을 위한 안전 수칙
    10. 내 차에서 가스 누출을 해결하려면 어떻게 해야 합니까?