ROS + MATLAB에서 레이저 값을 얻고 그려 보았습니다.

소개



ROS와 MATLAB이 공동 출연 할 수 있음에도 불구하고 의외로 알려지지 않은 것과 참고가되는 프로그램이 적기 때문에 씁니다.
게다가 ROS를 보통의 PC에 넣는 것은 힘들습니다 Rasp이라면 곧 할 수 있으므로

목적



ROS와 Matlab의 병용

상세



ROS와 MATLAB을 동시에 취급할 수 있으면 예를 들어 ROS가 들어간 Raspi로 Laser의 값을 취득, 그것을 MATLAB상에서 취득해, 로봇의 모터의 지령치를 생성(Matlab의 제어 라이브러리 툴을 사용할 수 있다→여기 중요) Raspi의 GPIO를 통해 Raspi에서 모터를 움직일 수 있습니다.

준비하는 것



· Raspi (Ubuntu mate 16.04)
・PC(Matlab이 들어간 PC(2017a 이상 추천))
・UST-10(Hokuyo 전기)



이런 식으로 배선

코드



①Raspi로 roscre를 시작
roscore

②Raspi로 LRS를 사용할 수 있는 라이브러리를 일으킵니다
설치 방법을 찾으면 있으므로 가십시오.
(ROS의 좋은 점은 이런 식으로 도서관을 사용할 수있는 것입니다)

③ Matlab의 코드는 이런 느낌
Main file
main.m
%% 初期化作業
clear
close all
% ROS初期化
% raspiのIPを入力(変更する場合)
% ROSCOREのIPをいれてください
rosinit('http://'ここにIP':11311')

%% 各ノード立ち上げ

% Subscriber
% Topic : /Scan
% Topic Type : MatlabはSubscribeする場合はTopic名のみで受信可能
% Callback_func : laser_func
% Topicを受信し次第@laser_funcを実行

matlab_sub_node = rossubscriber('/scan', @laser_func);%レーザの値を取得してくるSubscriber

%% またはreceiveでも値を得ることが可能

%% 片付け
rosshutdown

laser_func 함수에서

laser_func.m
%% Laser_func
function laser_func(obj, message, src);

%% global変数(Publishノード)
global matlab_pub_node

%% massageを受信
distance = ((message.Ranges);%距離データ()
distance_num = length(distance);%データの数
Max_angle = message.AngleMax;%最大角度
min_angle = message.AngleMin;%最小角度
angle_step = message.AngleIncrement;%ステップ角度
angle = min_angle: angle_step :Max_angle;%角度行列

%Laserのスペック
max_det_dis = 25;

%外れ値処理(値がとれずに35となった場合)
for n = 1:1:distance_num
    if distance(n) > max_det_dis && n > 1%端以外の外れ値は1つ前の角度の距離と同様
        distance(n) = distance(n-1);        
    elseif n == 1 && distance(n) > max_det_dis%端は0に
        distance(n) = 0;
    end
end

%% ここから下に処理を書いてください %%%%%%%%%%%%%%
%distanceは距離データ行列
%angleは角度行列



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 描画
refresh%リセット

for n_all = 1:1:distance_num
    X_all_Data(n_all) = distance(n_all) * cos(angle(n_all));
    Y_all_Data(n_all) = distance(n_all) * sin(angle(n_all));
end

plot(X_all_Data, Y_all_Data, 'LineWidth', 3, 'Color', [0 0 1]);
hold on
%描画範囲
XLIM = max(X_all_Data);

YLIM = max(Y_all_Data);
xlim([-XLIM XLIM]);
ylim([-YLIM YLIM]);
hold off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Matlab의 ROS 라이브러리는 receive를 사용해도 Topic의 값을 얻을 수 있지만 ROS처럼 보이지 않으므로 callback 함수를 사용합니다.
실행해 보면,
그려주었습니다! !
다음에는 이것을 사용해도 것을 검출하는 알고리즘을 해 보겠습니다!
또한 프로그램이 github에 올라 있습니다.

Twitter도 확인 부탁드립니다
htps : // 라고 해서 r. 코m/슈니치세키구 1

좋은 웹페이지 즐겨찾기