Jetson nano의 ROS 소개-ROS 통합 개발 및 ROS 통신 연구 노트


1. ROS 통합 개발 환경 구축

여기에 이미지 설명 삽입

Visual Studio Code의 전체 이름인 VSCode는 Microsoft의 경량 코드 편집기로 무료이며 강력한 오픈 소스입니다. 구문 강조, 스마트 코드 완성, 사용자 정의 핫키, 대괄호 일치, 코드 스니펫, 코드 비교 Diff, GIT 및 거의 모든 주류 프로그래밍 언어의 기타 기능을 지원하고 플러그인 확장을 지원하며 웹 개발 및 클라우드 애플리케이션 개발을 위해 설계되었습니다. 최적화되었습니다.

vscode 다운로드 https://code.visualstudio.com/docs?start=true

cd를 vscode의 deb 설치 패키지 디렉토리로 이동합니다.

sudo dpkg -i xxxx.deb

설치 후 vscode를 엽니다. Python 확장, C/C++ 확장, ROS 플러그인, 중국어 간체 플러그인, CMake 플러그인 등과 같은 일부 플러그인을 다운로드해야 합니다. 다운로드 후 작업 공간을 생성하고 생성합니다. 작업 공간 아래의 src 파일 패키지

sudo mkdir -p /home/nvidia/xxx/src
cd /home/nvidia/xxx

방금 만든 작업 공간 및 src 파일 패키지에 권한을 추가합니다.

sudo chmod +777 /home/nvidia/xxx 
sudo chmod +777 /home/nvidia/xxx/src

그런 다음 작업 공간 디렉토리에서 catkin_make 컴파일 명령을 실행하십시오.

catkin_make

그 중 CMake는 상위 도구인 make 도구의 생성기로 컴파일 및 구축 과정을 단순화하고 대규모 프로젝트를 관리할 수 있으며 확장성이 좋습니다. ROS와 같은 대규모 플랫폼의 경우 CMake를 사용하고 ROS는 CMake를 확장하므로 Catkin 컴파일 시스템이 있습니다. 아래는 전체 ROS 워크스페이스의 파일 구조입니다.
여기에 이미지 설명 삽입

WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

    |--- src: 源码

        |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts 存储python文件

            |-- src 存储C++源文件

            |-- include 头文件

            |-- msg 消息通信格式文件

            |-- srv 服务通信格式文件

            |-- action 动作格式文件

            |-- launch 可一次性运行多个节点 

            |-- config 配置信息

        |-- CMakeLists.txt: 编译的基本配置

작업 공간에서 터미널 명령을 실행하여 vscode를 엽니다.

code .

2. ROS 통신 메커니즘 및 명령어

여기에 이미지 설명 삽입

ROS의 통신 메커니즘은 기본적으로 RPC 프로토콜 프레임워크에 의존하며,RPC(원격 프로시저 호출 프로토콜)는 기본 네트워크 기술에 대한 지식 없이도 네트워크를 통해 원격 컴퓨터 프로그램에서 서비스를 요청하는 프로토콜입니다., 호출 프로세스는 주로 여러 단계로 나뉩니다.

1. 서비스 소비자(클라이언트)가 로컬에서 서비스를 호출합니다.
2. 클라이언트 스텁은 호출을 받은 후 네트워크를 통해 전송할 수 있는 메시지 본문으로 메서드, 매개 변수 등을 조립하는 역할을 합니다. 3.
클라이언트 스텁 서비스 주소를 찾아 전송 메시지를 서버로 전송
4. 서버 스텁은 메시지 수신 후 메시지를 디코딩
5. 서버 스텁은 디코딩 결과에 따라 로컬 서비스 호출
6. 로컬 서비스 실행 및 반환 결과를 서버 스텁에
7. 서버 스텁이 반환된 결과를 압축합니다. 8. 클라이언트 스텁이
메시지를 수신하고 이를 디코딩합니다.
9. 서비스 소비자가 최종 결과를 얻습니다.

여기에 이미지 설명 삽입

ROS 통신 계층은 ros_comm 스택의 일부이며 발행/구독 모델을 따릅니다. 토픽 통신에서 노드는 일부 토픽을 게시하고 다른 노드는 이 토픽을 구독할 수 있으며 서비스 메커니즘은 유사하며 토픽과 서비스는 고정된 유형으로 설계되어 ROS 패키징 후 게시됩니다.

1. 주제 커뮤니케이션

주제 통신의 구현 모델은 비교적 이해하기 쉽고 그 프로세스는 MQTT의 통신 방법과 유사하며 이 모델에는 세 가지 역할이 있습니다.

ROS 마스터(매니저)

화자 (출판사)

리스너(구독자)

먼저 클라이언트는 ROS Master에 정보를 등록해야 하는데 등록 정보에는 주제, 메시지의 데이터 타입, 메시지 큐의 크기 등이 포함된다. Listener, 그리고 Talker와 Listener를 같은 주제로 일치시켜 Talker가 Listener와 연결을 설정하도록 돕습니다.연결이 설정된 후 Talker는 메시지를 게시할 수 있으며 게시된 메시지는 Listener에 의해 구독됩니다.

여기에 이미지 설명 삽입

2. 서비스 커뮤니케이션

서비스 커뮤니케이션은 주제 커뮤니케이션과 유사하며 이 모델에는 세 가지 역할도 포함됩니다.

ROS 마스터(매니저)

서버(서버)

클라이언트(클라이언트)

ROS Master는 Server와 Client의 등록 정보를 유지하고 Server와 Client를 같은 주제로 매칭하여 Server와 Client가 연결을 맺도록 도와주는 역할을 담당하며, 연결이 설정된 후 Client는 요청 정보를 보내고 Server는 응답 정보를 반환합니다.

여기에 이미지 설명 삽입

클라이언트가 시작된 후 요청해야 하는 서비스 이름을 포함하여 RPC를 통해 ROS 마스터에 자신의 정보도 등록합니다. ROS Master는 노드의 등록 정보를 레지스트리에 추가합니다. ROS Master는 레지스트리에 있는 정보에 따라 서버와 클라이언트를 일치시키고 서버의 TCP 주소 정보를 RPC를 통해 클라이언트로 보냅니다. 클라이언트는 2단계의 응답 정보에 따라 TCP를 사용하여 서버와 네트워크 연결을 설정하고 요청 데이터를 보냅니다. Server는 요청된 데이터를 수신하고 구문 분석하여 응답 결과를 생성하여 Client에 반환합니다.

3. 파라미터 서비스

매개변수 서버 구현은 가장 간단하며 이 모델에는 세 가지 주요 액터가 포함됩니다.

ROS 마스터(매니저)

Talker(파라미터 설정기)

리스너(매개변수 호출자)

ROS Master는 매개변수를 공용 컨테이너로 저장하고 Talker는 컨테이너에 매개변수를 설정할 수 있으며 Listener는 매개변수를 가져올 수 있습니다.

여기에 이미지 설명 삽입
Talker는 RPC를 통해 매개변수(매개변수 이름과 매개변수 값 포함)를 매개변수 서버로 보내고 ROS Master는 매개변수 목록에 매개변수를 저장합니다. Listener는 RPC를 통해 매개변수 서버에 매개변수 검색 요청을 보내고 요청에는 검색할 매개변수의 이름이 포함됩니다. ROS Master는 2단계 요청에서 제공한 파라미터 이름에 따라 파라미터 값을 찾아 쿼리 결과를 RPC를 통해 Listener로 보낸다.

4. ROS 일반 명령

로스노드

rosnode ping    测试到节点的连接状态
rosnode list    列出活动节点
rosnode info    打印节点信息
rosnode machine    列出指定设备上节点
rosnode kill    杀死某个节点
rosnode cleanup    清除不可连接的节点

유망한

rostopic bw     显示主题使用的带宽
rostopic delay  显示带有 header 的主题延迟
rostopic echo   打印消息到屏幕
rostopic find   根据类型查找主题
rostopic hz     显示主题的发布频率
rostopic info   显示主题相关信息
rostopic list   显示所有活动状态下的主题
rostopic pub    将数据发布到主题
rostopic type   打印主题类型

rosmsg

rosmsg show    显示消息描述
rosmsg info    显示消息信息
rosmsg list    列出所有消息
rosmsg md5    显示 md5 加密后的消息
rosmsg package    显示某个功能包下的所有消息
rosmsg packages    列出包含消息的功能包

로스 서비스

rosservice args 打印服务参数
rosservice call    使用提供的参数调用服务
rosservice find    按照服务类型查找服务
rosservice info    打印有关服务的信息
rosservice list    列出所有活动的服务
rosservice type    打印服务类型
rosservice uri    打印服务的 ROSRPC uri

3. Python은 ROS 통신을 구현합니다. - - 작은 거북이의 상태를 제어하고 읽습니다.

vscode 인터페이스로 전환하고 먼저 작업 공간 아래를 마우스 오른쪽 버튼으로 클릭합니다.src 폴더에서 Create Catkin Package 옵션을 선택하고 새 폴더에 이름을 지정하고 다음 종속 패키지를 추가합니다.

roscpp rospy std_msgs

새 폴더 디렉토리 아래의 src 폴더는 C++ 파일을 저장하는 데 사용되며 scripts 폴더는 python 파일을 저장하는 데 사용됩니다.

1. package.xml 파일 구성

먼저 컴파일 및 실행이 의존하는 패키지 이름을 주로 선언하는 package.xml 파일을 구성합니다. 여기에서 필요에 따라 추가할 수 있습니다. 예를 들어 메시지 파일을 사용자 정의하는 경우 컴파일 종속성 및 런타임을 추가해야 합니다. 종속성 <build_depend>message_generation</build_depend>.<exec_depend>message_runtime</exec_depend>

<?xml version="1.0"?>
<!-- 格式: 以前是 1,推荐使用格式 2 -->
<package format="2">
  <!-- 包名 -->
  <name>demo01_hello_vscode</name>
  <!-- 版本 -->
  <version>0.0.0</version>
  <!-- 描述信息 -->
  <description>The demo01_hello_vscode package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
  <!-- 维护人员 -->
  <maintainer email="[email protected]">xuzuo</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <!-- 许可证信息,ROS核心组件默认 BSD -->
  <license>TODO</license>


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/demo01_hello_vscode</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="[email protected]">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <!-- 依赖的构建工具,这是必须的 -->
  <buildtool_depend>catkin</buildtool_depend>

  <!-- 指定构建此软件包所需的软件包 -->
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>

  <!-- 指定根据这个包构建库所需要的包 -->
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>

  <!-- 运行该程序包中的代码所需的程序包 -->  
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>

  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

2. CMakeLists.txt 파일 구성

그런 다음 CMakeLists.txt 파일을 구성합니다. CMakeLists.txt 파일은 CMake 컴파일 시스템이 소프트웨어 패키지를 컴파일하기 위한 입력 파일입니다. cmake 명령은 CMakeLists.txt 파일을 기반으로 makefiles 파일을 생성하고 make 명령은 컴파일되고 makefile 파일을 기반으로 실행 파일을 링크합니다.

find_package는 주로 빌드에 필요한 다른 CMake/Catkin 패키지를 채웁니다.

find_package(catkin REQUIRED COMPONENTS 
  roscpp
  rospy
  std_msgs
  message_generation
)

add_message_files(), add_service_files(), add_action_files()는 주로 메시지/서비스/액션 생성기로, 관련 메시지/서비스/액션 파일 이름을 직접 작성해야 합니다.

add_message_files(
  FILES
  person.msg
)

generate_messages()는 주로 메시지/서비스/작업과 같은 사용자 지정 메시지를 생성하는 데 사용되며 메시지/서비스/작업에 의해 생성된 종속성 패키지만 채우면 됩니다.

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package()의 기능은 패키지의 빌드 정보 출력을 지정하는 것입니다. 컴파일에 의존하는 패키지만 채우면 됩니다.

catkin_package( 
#  INCLUDE_DIRS include  
#  LIBRARIES ${PROJECT_NAME}   
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime   
#   DEPENDS eigen opencv
)

Python 코드의 경우 add_library() 및 add_executable() 함수를 사용하지 않기 때문에 설치 규칙이 다르게 보입니다.catkin_install_python()은 catkin에게 컴파일할 파이썬 파일을 알려주는 데 사용됩니다.Python 스크립트만 설치하고 모듈을 제공하지 않는 경우 setup.py 파일을 생성할 필요가 없으며 catkin_python_setup()을 구성할 필요가 없습니다.

catkin_install_python(PROGRAMS 
#  scripts/myscript  
   scripts/turtle_circle.py
   scripts/turtle_pose.py
   scripts/turtle_create.py
   DESTINATION ${
    
    CATKIN_PACKAGE_BIN_DESTINATION}
)

3. Python 코드 작성

다음으로 작은 거북이의 이동 궤적이 원이 되도록 작은 거북이의 움직임 소식을 게시하는 주제 게시 노드를 작성하고 turtle_circle.py라는 scripts 디렉터리에 새 .py 파일을 만듭니다.

#! /usr/bin/python

#1.导包
import rospy
from geometry_msgs.msg import Twist

if __name__ == "__main__":
    # 2.初始化 ROS 节点
    rospy.init_node("turtle_circle")
    # 3.创建发布者对象
    pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=1000)
    # 4.循环发布运动控制消息
    rate = rospy.Rate(10)
    msg = Twist()
    msg.linear.x = 1.0
    msg.linear.y = 0.0
    msg.linear.z = 0.0
    msg.angular.x = 0.0
    msg.angular.y = 0.0
    msg.angular.z = 0.6

    while not rospy.is_shutdown():
        pub.publish(msg)
        rate.sleep()

그런 다음 선형 속도, 각속도 및 포즈를 포함하여 작은 거북이의 모션 상태를 실시간으로 얻기 위해 주제 구독 노드를 작성하고 turtle_pose.py라는 스크립트 디렉토리에 새 .py 파일을 만듭니다.

#! /usr/bin/python

#1.导包
import rospy
from turtlesim.msg import Pose

def doPose(data):
    rospy.loginfo("乌龟坐标:x=%.2f, y=%.2f,theta=%.2f",data.x,data.y,data.theta)

if __name__ == "__main__":

    # 2.初始化 ROS 节点
    rospy.init_node("sub_pose_p")

    # 3.创建订阅者对象
    sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=1000)
    #     4.回调函数处理订阅的数据
    #     5.spin循环
    rospy.spin()

그런 다음 서비스 요청 노드를 작성하여 새 작은 거북이를 생성하고 스크립트 디렉토리에 새 .py 파일을 만들고 이름을 turtle_create.py로 지정합니다.

#! /usr/bin/python

#1.导包
import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse

if __name__ == "__main__":
    # 2.初始化 ros 节点
    rospy.init_node("set_turtle_p")
    # 3.创建 service 客户端
    client = rospy.ServiceProxy("/spawn",Spawn)
    # 4.等待服务启动
    client.wait_for_service()
    # 5.发送请求
    req = SpawnRequest()
    req.x = 2.5
    req.y = 2.5
    req.theta = 0
    req.name = "turtle2"
    try:
        response = client.call(req)
        # 6.处理响应
        rospy.loginfo("乌龟创建成功!,叫:%s",response.name)
    except expression as identifier:
        rospy.loginfo("服务调用失败")

터미널에서 Python 파일에 실행 권한을 추가해야 합니다.

chmod +777 *.py

그런 다음 바로 가기 키 ctrl + shift + B를 눌러 컴파일을 호출하고 catkin_make:build를 선택하고 터미널에서 오류를 보고하는지 확인합니다. 오류가 보고되지 않으면 기본적으로 문제가 없습니다.

4. 시작 파일 구성

프로그램은 여러 노드를 시작해야 할 수 있습니다. 예: ROS 내장 작은 거북이 케이스, 거북이의 움직임을 제어하고 움직임 상태를 읽으려면 각각 roscore, 거북이 인터페이스 노드를 시작하는 여러 창을 시작해야 합니다. , 스포츠 주제 릴리스 노드, 스포츠 주제 구독 노드. rosrun을 호출하여 매번 하나씩 시작하는 것은 분명히 비효율적입니다 공식 ROS 최적화 전략은 시작 파일을 사용하여 한 번에 여러 ROS 노드를 시작하는 것입니다.

node --> a node pkg included
-----> function package
type ----> 실행할 node 파일명
--> node
출력명 --> 로그 출력 대상 설정

xxx 함수 패키지 아래에 새 시작 폴더를 만들고 폴더 아래에 새 xxx.launch 파일을 만들고 .launch 파일의 내용을 구성합니다.

<launch>
    <node pkg="xxx" type="turtle_circle.py" name="run_circle" output="screen" />
    <node pkg="xxx" type="turtle_pose.py" name="run_pose" output="screen" />
    <node pkg="xxx" type="turtle_create.py" name="run_create" output="screen" />
    <node pkg="turtlesim" type="turtlesim_node" name="t1"/>
</launch>

마지막으로 vscode 터미널에서 roslaunch 명령을 실행하여 시작 스크립트를 실행합니다.

roslaunch xxx(功能包名) xxx.launch(launch文件名)

요약하다

이상은 ROS 통합 개발 및 ROS 통신 연구 노트의 전체 내용이며, 이 노트는 ROS 개발 환경의 기본 구축 프로세스와 ROS 통신의 원리 학습 및 테스트 배포를 간략하게 소개합니다. ROS는 주로 로봇이 여러 부분을 포함하고 각 부분에는 로봇의 움직임과 인식 기능을 실현하기 위한 지원 제어 프로그램이 있기 때문에 분산 프레임워크를 채택합니다. 그런 다음 로봇에서 이러한 부분들을 조율하거나 여러 로봇으로 구성된 로봇 클러스터를 조율하려면 분산된 부분들이 서로 통신할 수 있도록 해야 하는데, 이러한 분산 통신 문제를 해결하는 것이 ROS의 본래 의도입니다.

추천

출처blog.csdn.net/m0_55202222/article/details/130415912