STM32 및 ROS 직렬 통신 (이것은보다 공식적이고 상세하게 작성된 공개 계정 기사입니다)

검색 위치 : https://zhuanlan.zhihu.com/p/166496656

STM32와 ROS 간의 직렬 통신

Xiaobai는 로봇을 움직이는 법을 배웁니다.

Xiaobai는 로봇을 움직이는 법을 배웁니다.

같은 이름의 공개 계정 : Xiaobaixue 모바일 로봇

생성 진술 : 콘텐츠에 가상의 생성이 포함됨

콘텐츠의 줄거리는 가공의 것이며 참조 용입니다.

ROS 로봇 : 전체 네트워크에서 가장 실용적인 STM32 및 ROS 직렬 통신 솔루션

<-0-> 설명

<1> 서문

전에 공유 한 코드를 사용하는 방법을 몰랐거나 시스템 구조 등이 명확하지 않아 통화가 실패한 친구가 많아서 사과드립니다. 아래에서는이 기사를 보는 모든 사람이 자신의 문제를 해결할 수 있도록 전체 통신 체계의 배포에 대한 자세한 설명을 제공합니다.

<2>이 솔루션으로 해결 된 문제

STM32를 ROS 로봇의 하단 드라이버로 사용하는 직렬 통신 문제를 해결하고 stm32 및 ros 통신이 필요한 다른 소규모 파트너도 사용할 수 있습니다.

<-1-> 소개

<1> 최종 합의 내용

여기서 구현 한 STM32 및 ROS의 직렬 통신 프로토콜은 다음과 같습니다.

STM32 끝과 ROS 끝 모두 데이터 전송 기능과 데이터 수신 기능이 있습니다. 송수신되는 내용은 위 그림과 같은 데이터 패킷입니다. 데이터에는 데이터 헤더 (55aa), 데이터 꼬리 (0d0a) 및 검사 ( crc8), 데이터가 정확하고 안전한지 확인합니다. 통신 프로토콜은 자체적으로 확장 및 변경이 쉽습니다.

<2>이 솔루션에서 제공하는 API로 구현 된 기능

STM32는 왼쪽 바퀴의 실시간 바퀴 속도, 오른쪽 바퀴의 실시간 바퀴 속도, 진행 각도 및 예약 된 제어 비트 (1 바이트를 유연하게 사용할 수 있음)를 ROS에 보냅니다. ROS는 왼쪽 바퀴 설정 속도, 오른쪽 바퀴 설정 속도 및 예약 된 제어 비트를 STM32로 보냅니다 (1 바이트를 유연하게 사용할 수 있음).

<-2-> 원칙

<1> 간략한 설명

우선, 명확하다 . 시리얼 포트는 1 바이트 씩 데이터를 보내고, 시리얼 포트는 데이터를 수신한다. 바이트로 표시되는 최대 데이터는 255에 불과하며 전달해야하는 센서 데이터는 종종 short \ int \ float 데이터 유형의 변수에 저장되어야합니다.

전통적인 직렬 통신 방법은 데이터 분리 기술을 사용하는데, 이는 더 복잡합니다. 아래 그림과 같이이 방법은 여기서 제거됩니다.

데이터 합성 : 수신 된 여러 바이트 (short \ int \ float type) 데이터를 합성 합니다. 데이터 분리 : (short \ int \ float 유형) 데이터를 바이트로 분해하여 전송합니다.

따라서 여기에 1 바이트 이상의 데이터를 보내려면 유니온 메서드가 필요합니다. 노조와 관련하여 다음 사항 만 알면됩니다.

(1) C 언어의 메커니즘, 구조의 다른 구성원이 메모리를 공유하는 메커니즘 (즉, 메모리 주소가 일치 함)

(2) 동시에 한 명의 회원 만 방문 가능

(3) 다른 멤버는 멤버 유형의 특성에 따라 메모리 액세스를 수행합니다.이 액세스 메커니즘은 우리가 사용하는 기능입니다.

<2> 여기서 유니온을 사용하는 방법은 무엇입니까?

프로토콜에서 데이터 송수신 원칙 도입과 관련하여 C 언어의 공용체 기능을 사용하여 통신의 양쪽 끝은 동일한 데이터 구조를 가진 공용체를 정의합니다. 공용체에는 short \ int \ float 및 unsigned char 유형의 배열, 배열의 크기는 short \ int \ float 바이트의 크기에 해당합니다. 이런 방식으로 데이터를 보내고받을 때 유니온의 부호없는 char 배열의 요소 만 보내거나받습니다.

//发送数据(左轮速、右轮速、航向角)共用体(-32767 - +32768)
union sendData
{
    short d;
    unsigned char data[2];
}leftVelNow,rightVelNow,angleNow;

구체적인 원칙 흐름은 다음과 같습니다.

<-3-> 예비 준비

<1> 하드웨어 연결 확인

STM32 직렬 포트 + TTL to USB 모듈 (CH340) + Linux 하드웨어 장치 (Raspberry Pi \ PC \ TX2 등) 라인 연결 : (사진과 진실이 있습니다)

== 여기에 특별히주의해야 할 몇 가지 사항이 있습니다. 이것이 코드 배포의 전제입니다. ==

(1) STM32 및 ROS의 직렬 포트 전송 속도가 일치하는지 확인합니다.

(2) 위 그림과 같이 STM32 시리얼 포트의 Tx, Rx가 TTL to USB 모듈과 연결되어 있는지 확인합니다. Tx, Tx와 연결 해서는 안됩니다 . Rx도 마찬가지이며 연결 케이블의 품질도 테스트해야합니다.

(3) Linux 시스템에로드 된 장치에 일반적으로 사용 가능한 CH340 \ CH341 드라이버가 있는지 확인하십시오. TX2 보드와 함께 제공되는 시스템에는 없습니다. 온라인으로 많은 솔루션이 있습니다. 시스템을 직접 플래싱 할 수도 있습니다. 시스템 플래싱 하려면 여기를 클릭하십시오 .

(4) 직렬 포트에 Linux 시스템에 대한 슈퍼 사용자 권한이 있는지 확인하십시오 (일반적으로 기본적으로이 권한이 없음). 일반적으로 TTL을 USB 모듈에 연결하면 시스템이 ttyUSB0 직렬 장치로 나타납니다.

(5) 모든 사람을위한 ROS 기능 패키지의 mbot_linux_serial.cpp 파일에서 직렬 장치 이름을 자신의 장치 이름으로 변경해야합니다.

boost::asio::serial_port sp(iosev, "/dev/ttyUSB0"); #默认是/dev/ttyUSB0,如若不是必须更改

<2> 시리얼 포트 장치 방법보기

Linux 장치의 USB 모듈에 TTL을 연결 한 후 터미널을 열고 다음 명령을 입력하고 Enter 키를 누릅니다.

ls -l /dev/ttyUSB*

터미널이 다음과 유사하게 나타나면 직렬 장치가 인식되었음을 의미합니다. 예를 들어, / dev / ttyUSB0은 직렬 장치의 이름입니다.

crw-rw---- 1 root dialout 188, 0 Aug  3 21:46 /dev/ttyUSB0

가상 머신을 사용하는 경우 드라이버가 있어도 장치가 인식되지 않을 수 있으며 이때 가상 머신을 설정해야합니다. 메뉴 표시 줄 에서 편집 을 클릭 한 다음 기본 설정 을 클릭 하면 다음과 유사한 그림이 나타납니다.

USB를 클릭 하면 다음 그림이 나타납니다. 장치를 선택하고 가상 머신에 연결하고 확인을 클릭 한 다음 직렬 포트 장치를 꽂고 빼면 장치를 꽂고 뺄 때마다 자동으로 가상 머신에 연결됩니다.

<3> 시리얼 포트 권한 설정 방법

터미널에 다음 명령을 입력하십시오

sudo chmod 777 /dev/ttyUSB0 #按照自己的设备名字对ttyUSB0进行更改

문자를 반환하지 않으면 시리얼 장치 권한이 성공적으로 설정되었음을 의미하지만이 방법은 실제로 매번 시리얼 장치를 사용하기 전에이를 수행하는 방법이며 다음에 소개 될 예정입니다.

<4> 테스트 코드 프로젝트 다운로드

== 공식 계정에서 : Xiaobai가 모바일 로봇을 배우고, 전송 : 직렬 통신, 테스트 코드 프로젝트 파일을 얻을 수 있습니다 == 우리의 슬로건은 : 학습 효율성을 높이기 위해주의를 기울입니다

 

프로젝트 문서에는 다음이 포함됩니다 .

(1) STM32 끝 : STM32F103 및 ROS 직렬 통신 테스트 프로젝트 파일 (2) ROS 끝 : ROS 및 STM32F103 직렬 통신 테스트 기능 패키지 파일

STM32 프로그램 구조 :

주로 다음을 포함합니다.

(1) 직렬 통신 하드웨어 초기화 프로그램 파일 usart.c, 매개 변수는 전송 속도 설정이며 여기서 기본 설정은 115200입니다.

(2) 통신 프로토콜 프로그램 파일 mbotLinuxUsart.c

(3) 시스템 구조 테스트 메인 프로그램 파일 main.c

ROS 테스트 기능 패키지 프로그램 구조 :

주로 다음을 포함합니다.

(1) 통신 프로토콜 및 시리얼 포트 설정 프로그램 파일 mbot_linux_serial.cpp

(2) 시스템 구조 테스트 메인 프로그램 파일 publish_node.cpp

(3) 기본 ROS 기능 패키지의 기타 프로그램 파일

<-4-> 코드 배포

<1> STM32 end STM32 end는 프로젝트 파일로 다운로드 후 컴파일이 가능합니다. 103 보드 인 경우 직접 다운로드하여 테스트하십시오. F103 보드가 아닌 경우 mbotLinuxUsart.c 및 mbotLinuxUsart.h를 해당 프로젝트에 이식 할 수 있습니다. 함수 호출은 main.c를 참조하십시오.

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "mbotLinuxUsart.h"//引用该头文件是使用,通信协议的前提

//测试发送变量
short testSend1   =5000;
short testSend2   =2000;
short testSend3   =1000;
unsigned char testSend4 = 0x05;

//测试接收变量
int testRece1     =0;
int testRece2     =0;
unsigned char testRece3 = 0x00;

int main(void)
{   
//======================================硬件初始化====================================================
    delay_init();                                   //延时函数初始化   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
    uart_init(115200);                              //串口初始化为115200

//=======================================循环程序=====================================================
    while(1)
    {
        //将需要发送到ROS的数据,从该函数发出,前三个数据范围(-32768 - +32767),第四个数据的范围(0 - 255)
        usartSendData(testSend1,testSend2,testSend3,testSend4);
        //必须的延时
        delay_ms(13);
    } 
}

//====================================串口中断服务程序=================================================
void USART1_IRQHandler()
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
     {
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);//首先清除中断标志位
         //从ROS接收到的数据,存放到下面三个变量中
         usartReceiveOneData(&testRece1,&testRece2,&testRece3);
     }
}
//===========================================END=======================================================

<2> ROS 종료

== 전제 조건 : ROS가 성공적으로 설치되었습니다 ==

1 단계 : 작업 공간을 생성하고 컴파일합니다 (이미 작업 공간을 생성 한 경우 두 번째 단계로 건너 뜁니다). 터미널을 열고 다음 명령을 순서대로 실행합니다.

mkdir -p ~/catkin_ws_test/src
cd catkin_ws_test
catkin_make

2 단계 : 다운로드 한 topic_example 함수 패키지를 src 디렉토리에 복사합니다.

cd src
手动复制即可
cd ..
catkin_make

다음 그림이 나타나고 컴파일이 성공적입니다.

<-5-> 코드 테스트

<1> 장치가 연결되어 있는지 확인하십시오 .

위의 예비 준비에 문제가 없다면 전원 연결과 함께 장치를 연결하기 만하면됩니다. 문제가 발생하면 다음 단계로 진행하기 전에 해결하십시오.

<2> 새 터미널을 열고 ros master 시작

roscore

<3> 새 터미널을 열고 테스트 기능 패키지를 시작합니다.

#查看串口设备
ls -l /dev/ttyUSB*

터미널은 다음 정보를 인쇄합니다.

crw-rw---- 1 root dialout 188, 0 Aug  3 21:46 /dev/ttyUSB0

== / dev / ttyUSB0이 아닌 경우 ROS 함수 패키지의 mbot_linux_serial.cpp 파일에서 직렬 장치 이름을 변경해야합니다. ==

#添加设备权限
sudo chmod 777 /dev/ttyUSB0  #根据自己的设备名自行改变
#source
cd catkin_ws_test
source devel/setup.bash
#启动功能包节点
rosrun topic_example publish_node

다음 그림은 STM32에서받은 테스트 데이터를 인쇄하는 터미널에 나타납니다.

동시에 keil 시뮬레이션을 사용하여 ROS에서 STM32로 보낸 테스트 데이터를 볼 수 있으며 다음 그림이 나타납니다.

이 시점에서 시리얼 통신 테스트가 성공적으로 이루어졌으며, 여기에서는 통신 기능을 완벽하게 구현할 수 있도록 완전한 데모를 제공하며, 특정 작업에 대한 루틴으로 데모를 변경할 수 있습니다.

코드의 세부 사항과 프로세스에 관해서는 코드의 주석도 매우 명확하며 조금만 살펴보면 명확합니다.

기사 시리즈 :

TX2 플래싱 튜토리얼 + sdkmanager + ubuntu16.04 + Jetpack 3.3.1

우분투 16.04에 ROS-Kinetic을 빠르게 설치하고 일반적인 오류 처리

지도 제작자를 초고속으로 설치하여 모바일 로봇 SLAM 및 경로 계획 필수 책 배우십시오.

ROS 로봇 플랫폼을 스스로 개발하는 방법은 무엇입니까?

stm32와 ros 간의 직렬 통신

ros 앱 다운로드, ros 안드로이드 앱 다운로드, ROS 로봇 제어 앱 다운로드

자신의 로봇을 사용하여지도 제작자 매핑 테스트를 구현하고지도 저장을 수행해야합니다.

레이저 슬램 센서 처리 : 2D 라이더 모션 왜곡 제거 원리 설명, 코드 구현

더 많은 사람들이이 기사를 볼 수 있도록 좋아요, 댓글, 즐겨 찾기를 원합니다. 감사합니다.

09-05에 편집 됨

직렬 통신

STM32

로봇 운영 플랫폼 (ROS)

 

 

 

 

 

 

네트워크 디스크에 코드를 저장했습니다.

 

추천

출처blog.csdn.net/sinat_16643223/article/details/108895594