ROS 1 연습
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은
Building messages, services or actions — catkin 0.8.9 documentation (ros.org)
'Embeded > ROS' 카테고리의 다른 글
ROS2 간단한 publisher 와 subscriber 만들기 (C++) (1) | 2021.01.12 |
---|---|
ROS2 클라이언트 라이브러리, 패키지 (0) | 2021.01.11 |
ROS2 install 및 기본 사용법. (0) | 2020.12.10 |