ROS 1 연습

Embeded/ROS : 2021. 1. 4. 12:56

ROS 명령어

- rospack

$ rospack find [package_name]

$ rospack find roscpp

would return:

  • YOUR_INSTALL_PATH/share/roscpp

If you installed ROS Kinetic from apt on Ubuntu Linux you would see exactly:

  • /opt/ros/kinetic/share/roscpp

- roscd

$ roscd [locationname[/subdir]]

$ roscd roscpp

$ pwd

YOUR_INSTALL_PATH/share/roscpp

 

- rosls

$ rosls [locationname[/subdir]]

$ rosls roscpp_tutorials

cmake launch package.xml srv

 

- roscd log

$ roscd log

 

catkin workspace 만들기

$ mkdir -p ~/catkin_ws/src

$ cd ~/catkin_ws/

$ catkin_make

 

catkin_create_pkg

워크스페이스로 들어가서

$ cd ~/catkin_ws/src

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp  <== beginner_tutorials이라는 패키지를 만드는데 의존성은 std_msgs, rospy, roscpp와걸려있다.

 

# This is an example, do not try to run this

# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

 

catkin_make

catkin workspace로 가서 catkin_make 를 한다.

$ cd ~/catkin_ws

$ catkin_make

빌드되면 /opt/ros/$ROSDISTRO_NAME 여기에 작업공간과 비슷한 구조의 디렉토리가 생긴다.

당신의 workspace를 ROS 환경에 추가하려면 생성된 setup.bash 를 적용해준다.

$ . ~/catkin_ws/devel/setup.bash

 

rospack

rospack으로 dependencies 를 확인 할 수 있다.

$ rospack depends1 beginner_tutorials

roscpp

rospy

std_msgs

 

이렇게 하면 beginner_tutorials 에 딸린 dependency 걸린 package의 dependency 까지도 확인 할 수있다.

$ rospack depends beginner_tutorials

 

패키지 빌드하기

# source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash

$ source /opt/ros/kinetic/setup.bash # For Kinetic for instance

 

# In a catkin workspace

$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

$ catkin_make install # (optionally)

 

소스가 다른 위치에 있을 때는

# In a catkin workspace

$ catkin_make --source my_src

$ catkin_make install --source my_src # (optionally)

 

빌드후에 workspace는

$ ls

build devel src

이렇게 세개가 생긴다. devel은 install 전에 실행파일과 library 들이 들어있다.

 

ros client library

  • rospy = python client library
  • roscpp = c++ client library

roscore

ros를 실행할 때 맨 처음 해줘야 한다.

$ roscore

ros 가 퍼미션 문제를 발생시키면 소유권을 바꿔준다.

$ sudo chown -R <your_username> ~/.ros 

 

rosnode

현재 돌아가고 있는 ROS node 들의 정보를 보여준다.

$ rosnode list

/rosout   <= 얘는 기본으로 돌아가는 애다. 로그를 뿌려주는 역할이다.

 

$ rosnode info /rosout

------------------------------------------------------------------------

Node [/rosout]

Publications:

* /rosout_agg [rosgraph_msgs/Log]

 

Subscriptions:

* /rosout [unknown type]

 

Services:

* /rosout/get_loggers

 

어쩌꾸 저쩌구.. 나온다.

 

rosrun

$ rosrun [package_name] [node_name]

$ rosrun turtlesim turtlesim_node

 

터틀심 띄운다음에 node를 확인해보면

$ rosnode list

/rosout

/turtlesim  <<== 하나 더 생겼다.

 

이름 바꿔서 띄울려면

$ rosrun turtlesim turtlesim_node __name:=my_turtle

 

다시 해보면

$ rosnode list

/my_turtle

/rosout

 

노드에 날릴 수 있는 ping 도 있다.

$ rosnode ping my_turtle

rosnode: node is [/my_turtle]

pinging /my_turtle with a timeout of 3.0s

xmlrpc reply from http://aqy:42235/ time=1.152992ms

xmlrpc reply from http://aqy:42235/ time=1.120090ms

xmlrpc reply from http://aqy:42235/ time=1.700878ms

xmlrpc reply from http://aqy:42235/ time=1.127958ms

 

rqt_graph

$ sudo apt-get install ros-<distro>-rqt

$ sudo apt-get install ros-<distro>-rqt-common-plugins

 

$ rosrun rqt_graph rqt_graph

 

rostopic

$ rostopic -h

rostopic bw        display bandwidth used by topic

rostopic echo        print messages to screen

rostopic hz        display publishing rate of topic

rostopic list        print information about active topics

rostopic pub        publish data to topic

rostopic type        print topic type

 

$ rostopic echo /turtle1/cmd_vel

이렇게 하고 터틀심 키 누르면  찍힌다.

 

$ rostopic list -h

$ rostopic list -v

 

rostopic 메세지는 퍼블리셔와 섭스크라이버 같에 같은 타입을 통해 통신한다. 그 타입을 알아보는 방법.

 

$ rostopic type /turtle1/cmd_vel

geometry_msgs/Twist

 

rosmsg 

$ rosmsg show geometry_msgs/Twist

geometry_msgs/Vector3 linear 
  float64 x 
  float64 y 
  float64 z 
geometry_msgs/Vector3 angular 
  float64 x 
  float64 y 
  float64 z

 

rostopic 으로 메세지를 발생 시킬 수 있다.

rostopic pub [topic] [msg_type] [args]

 

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

 

-1 : 은 한번 퍼블리쉬 하고 끝난다는 뜻.

/turtle1/cmd_vel : 토픽 이름

geometry_msgs/Twist : 토픽으로 퍼블리쉬 될 메세지의 타입

-- : 다음에 오는 argements 가 옵션이 아니라는 것을 표시해줌.

'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' : yaml 구문, 위에서 타입을 확인했듯이 linear x,y,z 값과 angular x,y,z 값을 넣어준다.

 

-r 옵션을 주어 1Hz 간격으로 계속 commands stream을 발생시켜야 움직인다.

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

 

터틀심에서 퍼블리쉬하는 데이터를 보려면.

rostopic echo /turtle1/pose

 

데이터 퍼블리쉬 되는 간격을 보려면.

rostopic hz [topic]

$ rostopic hz /turtle1/pose

 

subscribed to [/turtle1/pose] 
average rate: 59.354 
        min: 0.005s max: 0.027s std dev: 0.00284s window: 58 
average rate: 59.459 
        min: 0.005s max: 0.027s std dev: 0.00271s window: 118 
average rate: 59.539 
        min: 0.004s max: 0.030s std dev: 0.00339s window: 177 
average rate: 59.492 
        min: 0.004s max: 0.030s std dev: 0.00380s window: 237 
average rate: 59.463 
        min: 0.004s max: 0.030s std dev: 0.00380s window: 290

 

메세지 타입 확인 할 때 이렇게 이어서 쓸 수 있다.

$ rostopic type /turtle1/cmd_vel | rosmsg show

 

rqt_plot

시간별  토픽에 퍼블리시 되는 데이터를 볼 수 있다.

$ rosrun rqt_plot rqt_plot 

로 띄운다음 토픽을 추가하면 된다. 여러개 추가하면 같이 보인다.

 

rosservice 

service 는 다른 노드와 통신 할 수 있는 또 다른 방법.

request를 보내고 response를 받을 수 있다.

 

rosservice list         print information about active services 
rosservice call         call the service with the provided args 
rosservice type         print service type 
rosservice find         find services by service type 
rosservice uri          print service ROSRPC uri

 

$ rosservice list

 

/clear 
/kill 
/reset 
/rosout/get_loggers 
/rosout/set_logger_level 
/spawn 
/teleop_turtle/get_loggers 
/teleop_turtle/set_logger_level 
/turtle1/set_pen 
/turtle1/teleport_absolute 
/turtle1/teleport_relative 
/turtlesim/get_loggers 
/turtlesim/set_logger_level

 

터틀심이 제공하는 서비스 리스트가 출력된다.

 

rosout 과 연결된 서비스도 발견할 수 있다.

 

 

rosservice type [service]

서비스의 타입을 알 수 있다.

$ rosservice type /clear

std_srvs/Empty  <== empty는 아규먼트 없이 실행가능하다는 뜻이다.

 

rosservice call [service] [args]

$ rosservice call /clear

/clear 서비스는 아규먼트 없이 호출 할 수 있다.

 

$ rosservice type /spawn | rossrv show

float32 x 
float32 y 
float32 theta 
string name 
--- 
string name <<== 리턴되는 타입인가??  optional 이라 여기에 나오는건가?

 

이렇게 호출 가능.

$ rosservice call /spawn 2 2 0.2 ""

name: turtle2

 

rosparam

rosparam은 데이터를 저장하거나 관리할 수 있게 해준다.

integers, floats, boolean, dictionaries, and lists 를 저장 할 수 있고. YAML 마크업 랭귀지를 따른다.

 

rosparam set            set parameter 
rosparam get            get parameter 
rosparam load           load parameters from file 
rosparam dump           dump parameters to file 
rosparam delete         delete parameter 
rosparam list           list parameter names

 

$ rosparam list

/rosdistro 
/roslaunch/uris/host_nxt__43407 
/rosversion 
/run_id 
/turtlesim/background_b 
/turtlesim/background_g 
/turtlesim/background_r

 

rosparam set [param_name]

rosparam get [param_name]

 

$ rosparam set /turtlesim/background_r 150

$ rosservice call /clear <= 이걸 해줘야 적용이 된다.

배경색이 바뀐것을 볼 수 있다.

 

$ rosparam get /turtlesim/background_g

86

 

$ rosparam get /

rosdistro: 'noetic 

  ' 
roslaunch: 
  uris: 
    host_nxt__43407: http://nxt:43407/ 
rosversion: '1.15.5 

  ' 
run_id: 7ef687d8-9ab7-11ea-b692-fcaa1494dbf9 
turtlesim: 
  background_b: 255 
  background_g: 86 
  background_r: 69

 

설정을 그대로 저장했다가 다음에 다시 로드해서 쓰기

rosparam dump [file_name] [namespace]

rosparam load [file_name] [namespace]

 

$ rosparam dump params.yaml

$ rosparam load params.yaml copy_turtle 
$ rosparam get /copy_turtle/turtlesim/background_b

255

 

rqt

이걸 먼저 깔아준다.

$ sudo apt-get install ros-<distro>-rqt ros-<distro>-rqt-common-plugins ros-<distro>-turtlesim

Replace <distro> with the name of your ROS distribution (e.g. indigo, jade, kinetic, lunar...).

 

rqt colsole은 ROS 로깅 프레임웍에 연결되서 노드의 아웃풋을 보여준다.

$ rosrun rqt_console rqt_console

rqt_logger_level 로 로그 레벨을 조정할 수 있다.

$ rosrun rqt_logger_level rqt_logger_level

 

$ rosrun turtlesim turtlesim_node

터틀심을 띄우고 로그레벨을 바꿔보면 로그가 나온다.

 

roslaunch

$ roslaunch [package] [filename.launch]

roslaunch는 노드를 정의된 런치파일로 실행한다.

 

$ roscd beginner_tutorials

$ cd ~/catkin_ws 
$ source devel/setup.bash 
$ roscd beginner_tutorials

$ mkdir launch

$ cd launch

$ vi turtlemimic.launch 에 이렇게 쓰고 저장한다.

 

   1 <launch> 
   2  
   3   <group ns="turtlesim1">  <== name space로 구분해서 sim이라는 터틀심이 두개 인데 구분하게 해줌.
   4     <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 
   5   </group> 
   6  
   7   <group ns="turtlesim2"> 
   8     <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 
   9   </group> 
  10  
  11   <node pkg="turtlesim" name="mimic" type="mimic">  <<==mimic이라는 노드를 만듬.
  12     <remap from="input" to="turtlesim1/turtle1"/> 
  13     <remap from="output" to="turtlesim2/turtle1"/> <== 아웃풋을 터틀심2로 보내서 터틀심2가 터트심1을 따라한다.
  14   </node> 
  15  
  16 </launch>

 

실행한다.

$ roslaunch beginner_tutorials turtlemimic.launch

$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

 

$ rqt 나 $ rqt_graph 로 노드간 구조를 확인해본다.

 

rosed

$ rosed [package_name] [filename]

rosed는 rosbash의 일부다.  패키지 전체 경로를 입력하지 않다고 이름만 입력하고 편집할 수 있다.

$ rosed roscpp Logger.msg

이렇게 하면 roscpp의 Logger.msg 을 지정된 에디터로 열어준다. vi등.

 

$ rosed [package_name] <tab><tab> 탭으로 자동완성을 사용 가능하다.

 

export EDITOR='nano -w'

이런식으로 에디터 지정 가능하다.

 

msg 와 srv

msg 파일은 일반 텍스트파일이다. ROS 메세지의 필드를 기술한다. 

srv 파일은 서비스를 기술한다. rquest 와 response 부분으로 되어있다.

 

msg 파일은 각 패키지의 msg 디렉토리에, srv 는 srv 디렉토리에 있다.

 

msg 파일은 한줄에 하나씩 쓰면 된다.

타입은 

int8, int16, int32, int64 (plus uint*) 
float32, float64 
string 
time, duration 
other msg files 
variable-length array[] and fixed-length array[C]

이런것들이 있다.

 

그리고 헤더라는 특별한 타입이 있다. timespamp 와 coordinate frame 정보를 담을 수 있다.

 

기본적으로 이렇게 생겼다.

  Header header 
  string child_frame_id 
  geometry_msgs/PoseWithCovariance pose 
  geometry_msgs/TwistWithCovariance twist

 

srv 파일은 msg 파일이랑 비슷하다. rquest 와 response 두 부분으로 나눠진다는것만 다르다. 

--- 세개 쓰면 나누어지는 부분이다.

int64 A <<==request
int64 B 
--- 
int64 Sum <<=response

 

msg 사용해보기.

$ roscd beginner_tutorials 
$ mkdir msg 
$ echo "int64 num" > msg/Num.msg

 

이렇게 하면 한줄짜리 생긴다.

 

string first_name 
string last_name 
uint8 age 
uint32 score

 

좀더 복잡하게 이런것을 추가하고 싶다면.

 

준비단계로 뭣좀 해줘야 한다.

package.xml 을 열어서

 

  <build_depend>message_generation</build_depend>   <-빌드 타임에 message_generation 필요하다.
  <exec_depend>message_runtime</exec_depend>     <- 런타임에는 message_runtime 필요하다.

 

두줄 추가해주고.

 

resed 로 CMakeLists.txt 열어서.

 

# Do not just add this to your CMakeListstxt, modify the existing text to add message_generation before the closing parenthesis 
find_package(catkin REQUIRED COMPONENTS 
   roscpp 
   rospy 
   std_msgs 
   message_generation   <== 이거 추가해준다.
)

 

그리고 런타임 dependency 를 추가해준다.

catkin_package( 
  ... 
  CATKIN_DEPENDS message_runtime ... 
  ...)

 

요 부분을 찾아서 수정하고 주석처리를 제거해준다.

# add_message_files( 
#   FILES 
#   Message1.msg 
#   Message2.msg 
# )

 

이렇게 바꿔준다.

add_message_files( 
  FILES 
  Num.msg 
)

 

이 부분도 찾아서 주석 제거해준다.

# generate_messages( 
#   DEPENDENCIES 
#   std_msgs 
# )

 

그러면 아까 $ echo "int64 num" > msg/Num.msg 이렇게 만들었기 때문에

 

$ rosmsg show [message type] 로 확인 할 수 있다.

 

$ rosmsg show beginner_tutorials/Num

int64 num

 

아니면 패키지 이름이 잘 생각 안날땐 이렇게 해도 나온다.

$ rosmsg show Num

[beginner_tutorials/Num]:

int64 num

 

srv 사용해보기

 

일단 srv 를 만든다.

$ roscd beginner_tutorials

$ mkdir srv

 

수작업으로 srv를 만드는 대신 있는걸 복사해다 쓸수도 있는데 

 

roscp 라는것을 쓰면 간단하다.

$ roscp [package_name] [file_to_copy_path] [copy_path]

 

rospy_tutorials 에서 복사해다 쓸라면 이렇게 한다.

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

 

srv도 msg 와 마찬가지로 package.xml 을 수정해야 한다. 아까랑 같다.

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

 

CMakeLists.txt도 같다.

# Do not just add this line to your CMakeLists.txt, modify the existing line 
find_package(catkin REQUIRED COMPONENTS 
  roscpp 
  rospy 
  std_msgs 
  message_generation 
)

 

이번에는 이것을 찾아서 주석 해제하고 내용을 수정한다.

 

# add_service_files( 
#   FILES 
#   Service1.srv 
#   Service2.srv 
# ) 

이렇게 바꾼다.
add_service_files( 
  FILES 
  AddTwoInts.srv 
)

 

확인하기.

$ rossrv show <service type>

$ rossrv show beginner_tutorials/AddTwoInts

int64 a 
int64 b 
--- 
int64 sum

 

또는

 

$ rossrv show AddTwoInts 
[beginner_tutorials/AddTwoInts]: 
int64 a 
int64 b 
--- 
int64 sum 

[rospy_tutorials/AddTwoInts]: 
int64 a 
int64 b 
--- 
int64 sum

 

 

다시한번

# generate_messages( 
#   DEPENDENCIES 
# #  std_msgs  # Or other packages containing msgs 
# )

CMakeLists.txt 에서 이거 주석 해제 했는지 확인한다. 아래처럼 바꾼다.

generate_messages( 
  DEPENDENCIES 
  std_msgs 
)

 

빌드해본다.

# In your catkin workspace 
$ roscd beginner_tutorials 
$ cd ../.. 
$ catkin_make 
$ cd -

 

빌드하면 랭귀지 별로 헤더가 생긴다.

 

The C++ message header file will be generated in ~/catkin_ws/devel/include/beginner_tutorials/. 

The Python script will be created in ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg.

The lisp file appears in ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.

 

비슷하게 srv도 찾아보면 있다.

 

자세한 message description은 

msg - ROS Wiki

 

Building messages, services or actions — catkin 0.8.9 documentation (ros.org)

 

'Embeded > ROS' 카테고리의 다른 글

ROS2 간단한 publisher 와 subscriber 만들기 (C++)  (0) 2021.01.12
ROS2 클라이언트 라이브러리, 패키지  (0) 2021.01.11
ROS 1 연습  (0) 2021.01.04
ROS2 install 및 기본 사용법.  (0) 2020.12.10
Posted by Real_G

댓글을 달아 주세요