HAPTIX Matlab and Octave API - modulabs/gazebo-tutorial GitHub Wiki

Overview

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์†์˜ ์„ค๋ช…์„ ์š”์ฒญํ•˜๊ณ  ์กฐ์ธํŠธ ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” Matlab(์œˆ๋„์šฐ)์ด๋‚˜ Octave(๋ฆฌ๋ˆ…์Šค)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

์ด๋ฏธ ์„ค์น˜ ๊ณผ์ •์„ ๋งˆ์ณค๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

Start the Gazebo simulation

๋ฐ์Šคํฌํƒ‘ ์•„์ด์ฝ˜ haptixStart๋ฅผ ๋”๋ธ”ํด๋ฆญํ•œ๋‹ค.

Run your controller in Matlab

Matlab์„ ์—ด๊ธฐ ์ „์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ 'IGN_IP'๊ฐ€ ์…‹ํŒ…๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ผ. ์ž์„ธํ•œ ์„ค๋ช…์€ ์„ค์น˜ ๊ณผ์ •์œผ๋กœ ๊ฐ€์„œ Network Configration ์žฅ์„ ํ™•์ธํ•ด๋ผ. Matlab์„ ์—ด๊ณ  Browse for folder ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜์—ฌ๋ผ. ์ƒˆ๋กœ์šด ํŒ์—… ์œˆ๋„์šฐ๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค. HAPTIX ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ SDK์˜ ์••์ถ•์„ ํ‘ผ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ matlab\ ํด๋”๋ฅผ ์ฐพ๋Š”๋‹ค. HAPTIX ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ SDK์—๋Š” Matlab ์ฝ˜์†” ๋˜๋Š” .m ํŒŒ์ผ์—์„œ hx_connect(), hx_robot_info(), hx_update(), hx_read_sensors() ๋ฐ hx_close() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” mex ํŒŒ์ผ์ด ์žˆ๋‹ค. MATLAB์—์„œ hx_matlab_controller.m ํŒŒ์ผ์„ ์—ด๊ณ  Matlab ๋ช…๋ น ์ฐฝ์— ๋‹ค์Œ์„ ์ž…๋ ฅํ•œ๋‹ค:

hx_matlab_controller

์•„๋ž˜ controller visualization ๋น„๋””์˜ค์™€ ๊ฐ™์€ ํŒ”์˜ ์›€์ง์ž„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Run your controller in Octave

๋งŒ์•ฝ ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋จผ์ € Octave๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

sudo apt-get install octave liboctave-dev

๊ทธ๋ฆฌ๊ณ  ์„ค์น˜๋œ haptix-comm์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์ธ octave ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ๋ช‡๊ฐœ์˜ .m ํŒŒ์ผ์ด ์žˆ๋‹ค.

cd /usr/lib/x86_64-linux-gnu/haptix-comm/octave

๋งŒ์•ฝ์— ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์„ ์‹œ๋„ํ•ด ๋ณด์•„๋ผ:

cd /usr/lib/haptix-comm/octave

Octave๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

octave

Octave์—์„œ hx_connect(), hx_robot_info(), hx_update(), hx_read_sensors() ๋ฐ hx_close()๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค(๊ด„ํ˜ธ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž„). ์‹œ๋ฎฌ๋ ˆ์ดํŠธ๋œ ํŒ”(arm)์— ๋Œ€ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ผ:

hx_matlab_controller

์•„๋ž˜ controller visualization ๋น„๋””์˜ค์™€ ๊ฐ™์€ ํŒ”์˜ ์›€์ง์ž„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Controller visualization

์ปจ๋“œ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ฐ€์ œ๋ณด ์ƒ์˜ ์†๊ฐ€๋ฝ์€ ๋ถ€๋“œ๋Ÿฌ์šด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์›€์ง์ธ๋‹ค. IMAGE ALT TEXT HERE

The code explained

counter = 0;

hx_connect();

deviceInfo = hx_robot_info();

% Uncomment this block to start logging.
% hxs_start_logging('/tmp/log/')

while counter < 250
  cmdSent = tic;

  % Initialize the command scalar structure.
  cmd.ref_pos = [];
  cmd.ref_vel = [];
  cmd.ref_vel_max = [];
  cmd.gain_pos = [];
  cmd.gain_vel = [];

  % Indicate that the positions we set should be used.
  cmd.ref_pos_enabled = 1;
  % We're not setting it, so indicate that ref_vel should be ignored.
  cmd.ref_vel_enabled = 0;
  % We're not setting it, so indicate that ref_vel_max should be ignored.
  cmd.ref_vel_max_enabled = 0;
  % We're not setting it, so indicate that gain_pos should be ignored.
  cmd.gain_pos_enabled = 0;
  % We're not setting it, so indicate that gain_vel should be ignored.
  cmd.gain_vel_enabled = 0;

  % Create a new command based on a sinusoidal wave.
  for n = 0:deviceInfo.motor_count
    cmd.ref_pos(end + 1) = 350 * 0.5 * sin(0.05 * 2.0 * pi * counter * 0.08);
    % We could set a desired maximum velocity
    % cmd.ref_vel(end + 1) = 1.0;
    % cmd.ref_vel_max(end + 1) = 1.0;
    % We could set a desired controller position gain
    % cmd.gain_pos(end + 1) = 1.0;
    % We could set a desired controller velocity gain
    % cmd.gain_vel(end + 1) = 1.0;
  end

  % Send the new joint command and receive the state update.
  state = hx_update(cmd);

  counter = counter + 1;

  % Busy wait. pause() is not accurate enough on Windows.
  elapsedCmd = toc(cmdSent);
  while elapsedCmd < 0.02
    elapsedCmd = toc(cmdSent);
  end
end

% Uncomment this block to stop logging.
% hxs_stop_logging()

hx_close();

HAPTIX Matlab/Octave API๋Š” hx_connect(), hx_robot_info(), hx_update(), hx_read_sensors() ๋ฐ hx_close()์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. hx_connect()์™€ hx_close()๋Š” Gazebo ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ MuJoCo์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

hx_robot_info()๋Š” ์ฃผ์–ด์ง„ ์žฅ์น˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์žฅ์น˜๋Š” Gazebo์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋œ ์†์ด๋‹ค. ์ด ํ˜ธ์ถœ์€ ์‘๋‹ต์ด ์ˆ˜์‹  ๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋œ๋‹ค.

hx_robot_info()์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ ์š”์ฒญ๋œ ์žฅ์น˜์— ๋Œ€ํ•œ ๋ชจํ„ฐ, ์กฐ์ธํŠธ, ์ ‘์ด‰ ์„ผ์„œ, IMU ๋ฐ ์กฐ์ธํŠธ ์ œํ•œ ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ด๋‹ค. ๋˜ํ•œ ์žฅ์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋นˆ๋„์ธ ์—…๋ฐ์ดํŠธ ์†๋„๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์žฅ์น˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ฉด ์† ์ œ์–ด ๋ช…๋ น์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. hx_update() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ํ˜„์žฌ ์†์˜ ์ƒํƒœ๋ฅผ๋ฐ›๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

๊ฐ ์กฐ์ธํŠธ์˜ ์œ„์น˜, ์†๋„ ๋ฐ ์ด๋“์„ ํฌํ•จํ•˜๋Š” ๋ช…๋ น ๊ตฌ์กฐ์ฒด๋ฅผ ์ฑ„์šธ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๋ช…๋ น์„ ์ ์šฉํ•œ ํ›„ ๋ช…๋ น์˜ ์„ผ์„œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” hx_update() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.