Sa maikling ROSject na ito, ating tatalakayin ang isa sa mga pinakamahalagang aspeto na kailangan nating matutunan at maging bihasa bilang mga nagnanais na maging robotics developer na siyang gagamit ng ROS (Robot Operating System) para sa ating mga proyekto — at yan ay ang paggawa ang pag-aayos ng ating mga workspaces!
Ang pangunahing paksa sa kursong ito ay ang paggawa ng mga workspace at maging mga diskurso sa mga best practices sa pag-oorganisa ng mga direktori upang siguraduhin na madali at mabilis nating mahanap, magagamit, at mabubuksan ang ating mga kinakailangang programa o dokumento para sa ating mga susunod na proyektong pang-robotics!
Mayroong dalawang bahagi ang kursong ito — ang una ay siyang tatalakay sa paggawa ng workspace gamit ang ROS1 Noetic Ninjemys at ang ikalawa naman ay siyang gumagamit ng ROS2 Humble Hawksbill.
Para sa kursong ito, inaasahang may payak na kaalaman na ang user sa paggamit ng mga sistemang tumatakbo sa Ubuntu at maging ang pagkumpuni gamit ang Linux Terminal. Kung nais niyong matutunan pa lalo ang mga paksang patungkol sa pangunahing kaalmaan hinggil sa pag-proprogram gamit ang ROS, mangyaring pumunta sa website ng The Construct ukol sa kanilang kursong Code Foundation for ROS Learning Path! Ang mga maiikling kursong ito’y siguradong maghahanda sa inyo para inyong mahasa ang inyong kaalaman hinggil sa mga kinakailangang programming languages na ginagamit sa ROS.
Mga Modules na Nilalaman ng Code Foundation for ROS Learning Path:
Linux for Robotics
Python 3 for Robotics
Examination
Para sa mga nagnanais na gamitin ang kanilang sariling mga kompyueter, para sa parehong kurso ay susundan natin ang OS-to_Distribution compatiblities na galing mula sa opsiyal na dokumentasyon ng ros.org para sa parehong ROS1 Noetic Ninjemys at ROS2 Humble Hawksbill
ROS1 Noetic: PC o Virtual Machine na tumatakbo sa Ubuntu 20.04 LTS
ROS2 Noetic: PC o Virtual Machine na tumatakbo sa 22.04 LTS
1.2 ROS Workspaces
Sa bawat ROS project, lahat ng ito ay nagsisimula sa tinatwag na Workspace. Ang folder na ito ang siyang maglalaman ng halos lahat na kakailanganin ng iyong robot para ito ay tumakbo — maging mga packages, scripts, at sa pagdalob sa mga partikular ng ROS, ng iyong mga nodes at topics na siyang gagamitin sa kabuuan ng operasyon at pagdisenyo ng robot. Sa ganitong palagay ay tila napakahalagang matutunan natin ang tamang pamamaraan ng paggawa at pag-organisa ng mga nilalaman ng mga ito sapagkat dahil sa natural na pagiging komplikado ng mga ganitong sistema, maaring sa pagtagal ay tila mahirapan tayo dahil sa dami ng mga kumpuni na ating nagawa para sa naturang robot. At sa kursong ito ay siyang mismo ang ating tatalakayin – ang pagsigurado ng kaayusan at kalinisan ng ating mga folder at directory sa kabuuan ng ating development!
Halina’t simulan na natin!
1.3 1.3 Paglikha ng Iyong Unang Workspace sa ROS1
Masasabing hindi komplikado ang paggawa ng workspace sa ROS2. Sa industriya, sinusunod natin ang format ng pagpapangalan sa ating mga folder na naaayon sa syntax na ‘projectname_ws’. Para tayo ay magsimula, una muna tayong pupunta sa root directory at gagawa ng halimbawang workspace na ating papangalanang ‘robot1_ws’
Kung inyong mapapapansin, opo, ang isang workspace ay siyang kumakatawan sa isang buong robot. Sa kabuuan ng iyong development, ang folder na ito ang maglalaman ng lahat ng parte and kumpuni ng iyong proyekto.
# Patakbuhin sa Terminal 1 # Pagpunta sa Root Directory cd ~ # Paglikha ng Workspace mkdir robot1_ws
Matapos patakbuhin ang mga code na ito, iyong makikita ang iyong panibagong folder na nakalagay na sa iyong root folder:
Mula sa kaninang diskurso, kakailanganin nating pagdaluban ng diwa ang isang mahalagng tanong: Ano kaya ang magiging kalabasan ng ating directory matapos ang 100 mga workspace?
Tunay ngang maari itong magmukhang magulo lalo na at sa root folder natin silang lahat nilalagay. Upang mas mainam ang ating pag-oorganisa sa mga ito ay mangyaring gumawa tayo ng Master Folder na siyang maglalaman ng lahat ng ating mga workspace upang mas mabilis natin silang mahanap at mabuksan.
Papangalanan natin itong “Workspaces” at matapos natin itong magawa, ililipat naman natin ang kaninang “robot1_ws” na folder sa loob nito.
# Patakbuhin sa Terminal 1 # Likhain ang Master Folder mkdir Workspaces # Ilipat ang robot1_ws sa Workspaces mv robot1_ws ~/Workspaces/
Matapos nating gawin ang ating workspace folder, mangyaring gawan natin ito ng ‘src’ folder sa loob.
# Patakbuhin sa Terminal 1 cd ~/Workspaces/robot1_ws mkdir src
Ganito dapat ang kalalabasan ng iyong diretory:
Ngayon, ano ang halaga ng ‘src’ folder na ito?
Ito lang naman ang siyang naglalaman ng mga ROS Packages na ating gagamitin para sa pagdisenyo ng ating robot – nandito ang mga nodes, topics, messages, at maging mga python o c++ scripts na ating iproprogram para sa mga parte ng ating robot.
Kaya’t gumawa rin tayo ng halimbawang package at pangalanan nating camera1_pkg.
# Patakbuhin sa Terminal 1 # Pumunta sa loob ng src folder bilang paghahanda sa paggawa ng package cd src
Kung inyong papansinin, ang mag ros package ay siyang mga maituturing na mismong kumpuni ng inyong robot – maaaring ito yung para sa camera, para sa motion planning, at iba pa.
Ngayon, ang paggawa ng package sa ROS1 ay hindi nadadaan sa simpleng paglikha ng folder sa ‘src’ folder; bagkus, ay kakailanganin nating magpatakbo ng mga commands upang maisagawa ito nang maayos.
# Patakbuhin sa Terminal 1 # Siguraduhing nasa loob na ng ‘src’ folder ng iyong nagawang workspace catkin_create_pkg camera1_pkg roscpp rospy std_msgs
Matapos nito, iyong makikita ang ganitong compigurasyon ng iyong terminal
Iyo ring mapapansin ang mga panibagong laman nito tulad ng CMakeLists.txt at Package.xml na siyang naglalarawan ng mga katangian ng package na ating nalikha.
Ang bagong ‘src’ folder sa loob ng ating package naman ang siyang ating paglalagayan ng lahat ng ating c++ scripts para sa paglikha ng ating mga node. Kung nais nating mag-develop gamit ang python, mainam na lumikha tayo ng folder na pinangalanang ‘scripts’ upanag manatiling organisado at maayos ang ating mga dokumento para sa naturang proyekto.
Upang kumpletuhin ang proseso, ngayon naman ay atin nang bubuuin ang workspace gamit ang syntax na:
catkin_make
Ngunit bago natin ito gawin, siguraduhin nasa loob tayo ng folder ng ating workspace na siyang si ‘robot1_ws’
# Patakbuhin sa Terminal 1 # Bumalik sa robot1_ws folder cd ../ # Buuin ang Workspacce catkin_make
Ito ang halimbawa ng resultang lalabas sa inyong mga terminal:
Matapos nito, may mga lalabas ring panibagong mga folder at dokumento sa directory ng inyong workspace:
Pag kapareho nito ang lumabas sa inyong IDE, isang masigasig na pagbati! Matagumpay nating nagawa ang ating unang workspace gamit ang ROS1 Noetic.
Para sa ikalawang parte nitong tutorial na ito, atin namang titignan ang proseso ng paggawa ng workspace para sa ROS2 Humble. Mangyaring inyo na rin itong matignan gamit ang ROSject link na ito:
Para sa kursong ito, inaasahang may payak na kaalaman na ang user sa paggamit ng mga sistemang tumatakbo sa Ubuntu at maging ang pagkumpuni gamit ang Linux Terminal. Kung nais niyong matutunan pa lalo ang mga paksang patungkol sa pangunahing kaalmaan hinggil sa pag-proprogram gamit ang ROS, mangyaring pumunta sa website ng The Construct ukol sa kanilang kursong Code Foundation for ROS Learning Path! Ang mga maiikling kursong ito’y siguradong maghahanda sa inyo para inyong mahasa ang inyong kaalaman hinggil sa mga kinakailangang programming languages na ginagamit sa ROS.
Mga Modules na Nilalaman ng Code Foundation for ROS Learning Path:
Linux for Robotics
Python 3 for Robotics
Examination
Para sa mga nagnanais na gamitin ang kanilang sariling mga kompyueter, para sa parehong kurso ay susundan natin ang OS-to_Distribution compatiblities na galing mula sa opsiyal na dokumentasyon ng ros.org para sa parehong ROS1 Noetic Ninjemys at ROS2 Humble Hawksbill
ROS1 Noetic: PC o Virtual Machine na tumatakbo sa Ubuntu 20.04 LTS
ROS2 Noetic: PC o Virtual Machine na tumatakbo sa 22.04 LTS
1.2 ROS Workspaces
Sa bawat ROS project, lahat ng ito ay nagsisimula sa tinatwag na Workspace. Ang folder na ito ang siyang maglalaman ng halos lahat na kakailanganin ng iyong robot para ito ay tumakbo — maging mga packages, scripts, at sa pagdalob sa mga partikular ng ROS, ng iyong mga nodes at topics na siyang gagamitin sa kabuuan ng operasyon at pagdisenyo ng robot. Sa ganitong palagay ay tila napakahalagang matutunan natin ang tamang pamamaraan ng paggawa at pag-organisa ng mga nilalaman ng mga ito sapagkat dahil sa natural na pagiging komplikado ng mga ganitong sistema, maaring sa pagtagal ay tila mahirapan tayo dahil sa dami ng mga kumpuni na ating nagawa para sa naturang robot. At sa kursong ito ay siyang mismo ang ating tatalakayin – ang pagsigurado ng kaayusan at kalinisan ng ating mga folder at directory sa kabuuan ng ating development!
Halina’t simulan na natin!
1.3 Paglikha ng Iyong Unang Workspace sa ROS2
Masasabing hindi komplikado ang paggawa ng workspace sa ROS2. Sa industriya, sinusunod natin ang format ng pagpapangalan sa ating mga folder na naaayon sa syntax na ‘projectname_ws’. Para tayo ay magsimula, una muna tayong pupunta sa root directory at gagawa ng halimbawang workspace na ating papangalanang ‘robot1_ws’
Kung inyong mapapapansin, opo, ang isang workspace ay siyang kumakatawan sa isang buong robot. Sa kabuuan ng iyong development, ang folder na ito ang maglalaman ng lahat ng parte and kumpuni ng iyong proyekto.
# Patakbuhin in Terminal 1 # Pagpunta sa Root Directory cd ~ # Paggawa ng Workspace mkdir robot1_ws
Matapos patakbuhin ang mga code na ito, iyong makikita ang iyong panibagong folder na nakalagay na sa iyong root folder:
Mula sa kaninang diskurso, kakailanganin nating pagdaluban ng diwa ang isang mahalagng tanong: Ano kaya ang magiging kalabasan ng ating directory matapos ang 100 mga workspace?
Tunay ngang maari itong magmukhang magulo lalo na at sa root folder natin silang lahat nilalagay. Upang mas mainam ang ating pag-oorganisa sa mga ito ay mangyaring gumawa tayo ng Master Folder na siyang maglalaman ng lahat ng ating mga workspace upang mas mabilis natin silang mahanap at mabuksan.
Papangalanan natin itong “Workspaces” at matapos natin itong magawa, ililipat naman natin ang kaninang “robot1_ws” na folder sa loob nito.
# Patakbuhin sa in Terminal 1 # Likhain ang Master Folder mkdir Workspaces # Ilipat ang robot1_ws sa Workspaces mv robot1_ws ~/Workspaces/
Matapos nito, ganito na dapat ang lalabas sa ating directory:
Upang ating masubukan mamaya kung paano gumamit ng mahigit sa isang workspace sa ROS2, tayo’y gumawa pa ng isang folder na ating papangalanang robot2_ws sa loob ng Workspaces master folder. Matapos na ito’y gawin, ganito dapat ang kalalabasan:
# Patakbuhin sa Terminal 1 # Solusyon A: mkdir robot2_ws mv robot2_ws ~/Workspaces #Solusyon B: cd ~/Workspaces mkdir robot2_ws
Mahusay!
Ngayong nalikha na natin ang ating mga workspace folder, ang sunod na hakbang ay ang paggawa ng mga ‘src’ folder sa bawat workspace natin.
# Patakbuhin sa Terminal 1 cd ~/Workspaces/robot1_ws mkdir src cd ../ cd robot2_ws mkdir src
Ganito na dapat ang kalalabasan ng ating directory:
Matapos nito ay babalik tayo sa main folder ng ating workspace at tsaka patatakbuhin ang command na ‘colcon build’
# Patakbuhin sa Terminal 1 cd ~/Workspaces/robot1_ws colcon build cd ~/Workspaces/robot2_ws colcon build
Maglalabas ang terminal ng naturang output:
MAHALAGA: Kahit mapapansing gumana ang command na ito sa terminal, nararapat lamang na sa inyong mga lokal na kompyuter ay siguraduhing na-source nang maigi ang ating ROS Distro (Distribusyon) sa pamamagitan ng pagtakbo ng code na ito sa root folder:
# Hindi kailangang patakbuhin ngunit PALAGING TANDAAN!!! cd ~ source ~/opt/ros/[–distro–]/setup.bash # Note: the -distro- is to be replaced with the disitrbution that you have installed and are currently using. In this case, we will use humble source ~/opt/ros/humble/setup.bash
Matapos gawin ang mga ito, dapat na lumabas ang mga panibagong folder na ito sa inyong mga workspace:
Ngayon, ating talakayin ang iilan sa mga payak ngunit mahahalagang folder na kailangan nating pagtuunan ng pansin matapos ang paggawa ng ating workspace. Magsimula tayo sa ‘src’ folder, ang folder na ito ang maglalaman ng lahat ng packages na ating nalikha para sa ating robot. Bilang maikling pagtalakay, ang package ay masasabing isang esensyal na lipon ng mga script na siyang naglalarawan o naglilikha sa isang partikular na parte ng ating robot — maari itong maging camera, pang-motion-planning, at iba pa. May hiwalay na commands na kailangan upang makagawa ng package sa ROS2 na siyang tatalakayin sa iba pang maiksing kurso.
Pumunta naman tayo sa ‘install’ folder. Kung inyong mapapansin mula sa inyong mga IDE, napakaraming bagong dokumento sa loob nito at isa sa mga kailangan nating tignan ay ang ‘setup.bash’. Sa ROS2, pag nais nating gamitin ang mahigit sa isang workspace, nararapat nating ma-source nang maigi hindi lamang ang distro na gamit natin; bagkus, maging na rin ang workspace na ating patatakbuhin.
Sa ganitong palagay, kung nais nating gamitin ang laman ng ‘robot1_ws’ na workspace, kakailanganin nating i-source ito sa terminal gamit ang sumusunod na code:
# Patakbuhin sa in Terminal 1 cd ~/Workspaces source robot1_ws/install/setup.bash
Kung nais mo namang gamitin at ‘robot2_ws’ workspace, mangyaring patakbuhin ang sumusunod na command:
Ang karaniwang panuntunan na ating susundin ay ang pag-source ng setup.bash file ng workspace mula sa ‘install’ folder nito
source ~/folder1/sample_ws/install/setup.bash
# Patakbuhin sa Terminal 1 cd ~/Workspaces source robot2_ws/install/setup.bash
At ayan! Matagumpay nating nagawa ang ating workspace gamit ang ROS2 Humble Hawksbill.
Panorama
Uma dúvida recorrente de desenvolvedores ROS iniciantes é como combinar publisher e subscriber no mesmo arquivo. Neste exemplo, vamos utilizar um dos robôs mais famosos, TurtleBot3, para fazer uma demonstração virtual.
Abrindo o rosject
Para seguir este tutorial, será útil e conveniente usar um rosject (que a grosso modo é um projeto ROS configurado para rodar um exemplo).
Acesse o link: https://app.theconstructsim.com/l/5e2b6017
Clique no botão vermelho “RUN”:
Lançando a simulação exemplo:
Abra um terminal clicando no ícone indicado na figura:
Na janela do primeiro terminal, insira o comando:
roslaunch realrobotlab main.launch
Você será apresentado à uma janela do Gazebo como esta:
Você pode sempre revisitar a janela do Gazebo clicando em “Open Gazebo”:
Nesta janela, você tem a visualização da sua simulação com o TurtleBot3 presente.
Identificando os tópicos importantes: Num segundo terminal (clique no botao “+” para criar abas diferentes), insira o comando:
Esta é a listagem de todos os tópicos da simulação. Serão de especial importância para nós o tópico /scan, pois queremos ler o scanner do robô e o tópico /cmd_vel, pois queremos alterar a velocidade do robô.
No mesmo terminal, rode o comando:
rostopic type /scan
que apresentará:
sensor_msgs/LaserScan
esta informação é importante para compor o arquivo Python.
Abra a janela da IDE clicando no ícone indicado na figura:
Você pode encontrar o arquivo move_file.py na correta estrutura de pastas. Tome um minuto para entender onde o arquivo deve ser criado dentro do seu workspace para uma melhor organização geral.
A informação obtida anteriormente com respeito ao tópico /scan é utilizada em:
from sensor_msgs.msg import LaserScan
e
sub = rospy.Subscriber('/scan', LaserScan, callback)
Importante: aqui, você é capaz de diferenciar onde deve entrar com o nome do tópico e seu tipo no método subscriber.
Agora, tendo em mente o nosso publisher, o mesmo procedimento deve ser empregado. Rode o comando:
rostopic type /cmd_vel
que produzirá:
geometry_msgs/Twist
esta informação é utilizada em:
from geometry_msgs.msg import Twist
e
pub = rospy.Publisher('/cmd_vel', Twist)
A variável que nós criamos, chamada “move”, também deve ser do tipo “Twist”. Por isso temos:
move = Twist()
A função “callback” é chamada pelo subscriber e toda vez que isso acontece um determinado feixe do scanner será lido. Qual deles? Bem, isso depende do que você selecionar. Vejamos exemplos:
Rode o comando:
rosmsg show sensor_msgs/LaserScan
Reparou no uso do tipo descoberto anteriormente aqui também?
Você deve ver:
De fato, os valores que queremos ler estão em “ranges”. Para ter exemplos de leitura do scanner, você pode rodar:
rostopic echo /scan
Não se assuste com esse comando, sua tela ficará cheia de dados provenientes do scanner. Com o comando Ctrl+C você para de printar esses dados na tela. Então, pode verificar o que nos interessa, ou seja, as informacoes contidas em “ranges”. Cada posição desse array corresponde a um feixe do scanner (por exemplo, o 360 está na frente do robô).
Raciocínio semelhante pode ser aplicado ao publisher. Rode o comando:
rosmsg show geometry_msgs/Twist
Para obter:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
Baseando-se nesses valores, nós sabemos onde ler e onde escrever as informações.
Aplicando uma lógica simples de movimentação Vamos imaginar que se o robô detecta um obstáculo à sua frente ele muda a direção. Caso contrário, continua em linha reta. Isso é feito muito facilmente lendo o valor do feixe de interesse e alterando as velocidades linear e angular do robô. Assim, o arquivo Python deve conter em sua função callback:
Imaginando que esse é seu primeiro pacote, navegue até o diretório do seu worspace:
roscd
cd..
Compile:
catkin_make
source devel/setup.bash
Para facilitar sua vida, já existe um arquivo de launch preparado neste rosject que você pode rodar inserindo:
roslaunch basic_project move_launcher.launch
Na janela do Gazebo, você deve ver o robô se comportando como esperado. Nada nos dá mais satisfação do que ver o robô fazendo o que deveria fazer.
Nós esperamos que este post seja útil para você!
Vídeo no YouTube Este foi o post de hoje. Lembre-se que nós temos uma versão deste post em vídeo no YouTube.
Se você gostou do conteúdo, por favor, considere se inscrever no nosso canal do YouTube. Estamos publicando novos conteúdos quase todos os dias.
In this course, you’ll cover the foundational concepts needed to start working with ROS 2, as well as more advanced topics, all while engaging in hands-on practice.
Opening the rosject
In order to follow this tutorial, we need to have ROS2 installed in our system, and ideally a ros2_ws (ROS2 Workspace). To make your life easier, we have already prepared a rosject for that: https://app.theconstructsim.com/l/5e01d324/
Just by copying the rosject (clicking the link above), you will have a setup already prepared for you.
After the rosject has been successfully copied to your own area, you should see a Run button. Just click that button to launch the rosject ( see this example).
After pressing the Run button, you should have the rosject loaded. Now, let’s head to the next section to get some real practice.
In order to interact with ROS2, we need a terminal.
Let’s open a terminal by clicking the Open a new terminal button.
cd cpp_py_pkg/
touch src/cpp_node.cpp
touch include/cpp_py_pkg/cpp_header.hpp
In order to compile the package later, we need at least a main function in the C++ node. For this tutorial for simplicity, we can just add this minimal code to the cpp_node.cpp file:
#include “rclcpp/rclcpp.hpp”
// Include your header file to use it
#include “cpp_py_pkg/cpp_header.hpp”
int main(int argc, char **argv)
{
// Initiate ROS communications
rclcpp::init(argc, argv);
// Instantiate the node
auto node = std::make_shared<rclcpp::Node>(“my_node_name”);
// Make the node spin
rclcpp::spin(node);
// Shutdown ROS communications
rclcpp::shutdown();
return 0;
}
Add a Python node and module to import
For Python, we need to create additional folders first:
The CMakeLists.txt and package.xml will be shared by Python and C++, which is what we will edit in the next section to configure the package for both Python and C++.
Configure the package
package.xml
Add a buildtool_depend tag for ament_cmake_python:
# Install Python executables in the ros2_ws/install/cpp_py_pkg/lib/cpp_py_pkg/ folder
install(PROGRAMS
scripts/py_node.py
DESTINATION lib/${PROJECT_NAME}
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
Compile package, then run C++ node and Python node
cd ~/ros2_ws/
colcon build –packages-select cpp_py_pkg
Source ROS2 environment and start C++ node in one terminal:
source ~/ros2_ws/install/setup.bash
ros2 run cpp_py_pkg cpp_executable
Source ROS2 environment and start Python node in another terminal:
source ~/ros2_ws/install/setup.bash
ros2 run cpp_py_pkg py_node.py
That’s it! If there are no errors when you run the nodes then it means that it was successful (remember that our nodes do not do anything except spin).
Congratulations. You now know how to use C++ and Python in the same ROS 2 package.
To learn more about ROS 2, have a look at the course below:
Để liệt kê tất cả các topic đang hoạt động, ta sử dụng câu lệnh sau:
ros2 topic list
Để tìm kiếm một topic cụ thể, chúng ta sử dụng thêm lệnh grep như khi sử dụng Terminal bình thường:
ros2 topic list | grep cmd_vel
Xem thông tin chi tiết về một topic
Để xem thông tin chi tiết về một topic nào đó, các bạn có thể sử dụng lệnh info. Ví dụ mình sẽ sử dụng lệnh info để xem thông tin của topic cmd_vel vừa được liệt kê ở trong phần trước:
ros2 topic info /cmd_vel
Thông tin về topic sẽ được hiển thị trên Terminal bao gồm các trường như sau:
Type: kiểu dữ liệu của topic
Publisher count: số lượng publisher đang hoạt động được kết nối tới topic
Subscription count: số lượng subscriber đang hoạt động được kết nối tới topic
Tương tự như vậy, các bạn có thể xem thông tin về bất cứ topic nào mà mình quan tâm. Ví dụ như topic /scan là dữ liệu mà lidar trên robot quét, topic /camera/image_raw là dữ liệu hình ảnh mà camera nhận được:
ros2 topic info /scan
ros2 topic info /camera/image_raw
Các bạn cũng có thể xem trực tiếp dữ liệu nào đang được lưu truyền trên topic bằng lệnh echo. Mình sẽ lấy ví dụ về topic cmd_vel ở trên:
ros2 topic echo /cmd_vel
Không có gì xuất hiện, các bạn có thấy gì kì lạ không?
Các bạn không thao tác nhầm ở đâu đâu. Terminal không xuất hiện gì cả vì hiện tại đang không có dữ liệu nào lưu hành trên topic này. Các bạn sẽ được hướng dẫn cách gửi dữ liệu lên topic trong phần dưới đây.
Xuất bản (Publish) dữ liệu lên một topic
Như các bạn thấy thì hiện tại topic /cmd_vel đang không có dữ liệu nào cả. Vì vậy, chúng ta sẽ tiếp tục tìm hiểu cách gửi dữ liệu, hay là publish dữ liệu lên một topic.
Để publish dữ liệu lên một topic, chúng ta cần biết kiểu dữ liệu của topic đó trước. Sử dụng lệnh sau để xem lại kiểu dữ liệu mà topic /cmd_vel sử dụng:
ros2 topic info /cmd_vel
Theo kết quả hiển thị trên Terminal, kiểu dữ liệu của /cmd_vel là geometry_msgs/msg/Twist. Chúng ta cùng xem một message loại này thì gồm những thành phần gì bằng lệnh:
ros2 interface show geometry_msgs/msg/Twist
Một message geometry_msgs/msg/Twist bao gồm hai vector 3 chiều là linear (tốc độ dài) và angular (tốc độ góc) trong không gian ba chiều. Các bạn lưu ý là mỗi tọa độ của vector là một số thực (float64) nhé.
OK. Bây giờ các bạn đã có đủ thông tin để publish các message tới topic /cmd_vel. Chúng ta cùng publish một message lên topic /cmd_vel để turtlebot di chuyển trong không gian mô phỏng nhé. Ta sử dụng câu lệnh sau:
geometry_msgs/msg/Twist: tên của interface/loại message
Phần còn lại: nột dung message muốn publish
Sau khi lệnh trên được chạy, các bạn sẽ thấy Terminal thông báo đang publish các message lên topic /cmd_vel, đồng thời turtlebot cũng bắt đầu di chuyển thành vòng tròn.
Kiểm tra topic hoạt động
Để kiểm tra xem topic có đang hoạt động ổn định hay không, chúng ta cùng thực hiện lại các lệnh tương tự như phần đầu của bài viết và so sánh.
Đầu tiên là xem thông tin về topic bằng lệnh:
ros2 topic info /cmd_vel
Terminal hiển thị hiện tại đã có thêm một publisher, vậy là chúng ta đã publish dữ liệu lên topic thành công.
Tiếp theo, chúng ta sẽ kiểm tra dữ liệu nào đang được lưu truyền trên topic bằng lệnh:
ros2 topic echo /cmd_vel
Trên Terminal sẽ xuất hiện các message đang được lưu hành trên topic.
OK xong. Vậy là qua bài viết này các bạn đã làm quen với các câu lệnh cơ bản để làm việc với topic trong ROS2. Chúc các bạn thực hành thành công.
Para poder seguir al pie de la letra este tutorial , necesitamos tener ROS 2 Humble instalado en nuestro equipo, ademas de un entorno de ROS 2 configurado. Para hacer nuestra vida mas fácil, ya tenemos preparado un rosject preparado: https://api.robotigniteacademy.com/l/5f308d0d/
Solo copiando el rosject (abriendo el enlace de arriba), vas a tener el entorno configurado.
Luego de que el rosject haya sido copiado sin problemas en tu área, podrás ver un botón en rojo que dice ejecuta. Solo oprime ese botón para poder arrancar el entorno.
Crear un paquete de ROS 2 en C++:
Para crear un paquete de ROS 2, necesitas tener un entorno de ROS 2, y para eso, necesitamos una terminal.
Vamos a abrir una terminal oprimiendo el botón de abrir nueva terminal.
Ya estando en la terminal, para poder crear nuestro paquete debemos movernos a la carpeta src de nuestro entorno.
$ cd ros2_ws/src
Y ya estando en la carpeta, podemos crear nuestro paquete con compilación de tipo cmake:
Preparar nuestro paquete para usar archivos tipo launch
Ya que creamos nuestro paquete vamos a entrar y crear una carpeta launch donde vamos a crear nuestros launch files:
$ cd launch_cmake
$ mkdir launch
Ahora ya que no es el punto de este tutorial, vamos a copiar unos nodos que se encuentran en otro paquete de nuestro entorno clonado
$ cp ~/ros2_ws/src/paquete_cpp/src/* src/
y vamos a importar estos nodos en nuestro paquete, para eso debemos oprimir el botón de Editor de código, buscamos nuestro paquete y editamos el archivo CMakeLists.txt
Para poder que nuestro paquete reconozca los nodos vamos a añadir estas lineas de codigo justamente debajo de los find_package(…):
teniendo eso vamos a crear un archivo en la carpeta launch, el cual se va a llamar launchcpp.launch.py como pueden observar la extensión es .py ya que ROS 2 usa Python 3 como interprete de archivos tipo launch. Con el archivo creado, vamos a llenar de codigo nuestro launch:
import os
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package=’launch_cmake’,
executable=’publisher’,
name=’publisher’,
output=’screen’,
),
Node(
package=’launch_cmake’,
executable=’subscriber’,
output=’screen’,
name=’subscriber’,
)
])
Ya teniendo nuestro launch file que ejecuta nuestros dos nodos, debemos importarlo en el CMakeList.txt para poder permitir al paquete detectarlo, para eso inmediatamente debajo de lo que pusimos para nuestros nodos, vamos a poner la carpeta donde alojamos los launch files:
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}
)
como podemos observar, en este ultimo trozo de código estamos diciéndole a nuestro paquete que necesitamos tener disponible en la carpeta compartida share todos los archivos que se encuentren en la carpeta launch.
Compilar entorno y ejecutar launch file
Por ultimo, debemos comprobar que todo salió bien, para eso vamos a abrir de nuevo la terminal y compilamos nuestro entorno: