Trong bài toán định vị (localization) ở robot, chúng ta cần sự trợ giúp từ các cảm biến như IMU, GPS, và Odometry. Bằng cách kết hợp các tín hiệu từ các cảm biến lại với nhau(sensor fusion) một lượng thông tin bổ ích sẽ giúp cho robot định vị được tọa độ chính xác trong các môi trường khác nhau. Trong project này, mình sẽ giới thiệu tới các bạn Robot Localization package một công cụ hữu ích để tích hợp sensor fusion cùng với turtlebot 3. Ở project này, mức độ đòi hỏi các bạn cần có một số kiến thức cơ bản như urdf, frames,… để có thể chỉnh sửa và thay đổi các file sẵn có. Hy vọng blog này sẽ mang lại cái nhìn tổng quan về chủ đề sensor fusion và localization ở robotics.
Khởi động rosject
The Construct đã tạo ra một công cụ rất hữu ích là rosject, nơi các bạn dễ dàng truy cập và khởi tạo các project cùng với ROS ở các phiên bản khác nhau:
Như hình bên dưới là một rosject hoàn chỉnh, bạn chỉ việc nhấn vào nút RUN để khởi động rosject.
Sau khi nhấn vào nút RUN bạn sẽ thấy rosject được chạy trên màn hình. Ở đây, rosject cung cấp cho bạn cả terminal để có thể nhập các câu lệnh:
Bây giờ cùng nhau đến bước tiếp theo trong ví dụ này nhé.
Cài đặt các package cần thiết
Đầu tiên các bạn cần cài đặt các package cần thiết để có thể thực hiện project này, sau khi vào môi trường làm việc catkin là ros2_ws các bạn làm theo bằng cách thực hiện các câu lệnh sau đây:
Sau bước này thì các bạn sẽ cần một ít thời gian để có thể cài đặt thành công các gói cần thiết cho chương trình.
Tiếp theo sử dụng câu lệnh sau để build môi trường catkin
colcon build --symlink-install
Mình sẽ giải thích lý do tại sao các bạn lại phải sử dụng đường link github phía bên trên. Vì ở trong project này mình muốn tổng hợp và sử dụng những packages cần thiết và chỉnh sửa một số nội dung file nên mình đã gom thành một package lớn bao gồm các packages nhỏ để tiện cho việc chạy chương trình.
Mô phỏng trên Gazebo cùng robot
Sau khi đã cài đặt đầy đủ các package cần thiết. Bước tiếp theo bạn cần chọn model robot cho project của bạn. mình sử dụng waffle trong project này:
source ~/ros2_ws/install/setup.bash
export TURTLEBOT3_MODEL=waffle
Sau đó để sử dụng môi trường gazebo và robot, bạn cần truy xuất môi trường gazebo và chạy ros launch package:
Cửa sổ Gazebo sẽ xuất hiện như trên cùng với robot waffle.
Chạy Robot Localization package
Như bạn thấy môi trường và robot đã có, điểm quan trọng trong project lần này là biết cách áp dụng các cảm biến như IMU, Odometry, GPS,.. cùng với robot trong nhiệm vụ tổng hợp các tiến hiệu từ các cảm biến khác để giải quyết bài toán định vị cho robot. Ở cửa sổ thứ 2, các bạn thực hiện câu lệnh sau đây:
source ~/ros2_ws/install/setup.bash
ros2 launch robot_localization ekf.launch.py
Tạo và mô phỏng robot cùng cảm biến trên Rviz
Sau khi đã có môi trường cho robot hoạt động là gazebo, có các cảm biến được tích hợp trên robot, nhiệm vụ là làm sao để có thể xác định và sử dụng các cảm biến để phục vụ cho bài toán định vị trên robot. Ở đây trên Rviz sẽ mô phỏng và cho thấy các trục tọa độ của từng thành phần được gắn vào robot. Trong các thư mục được cài đặt mình cũng đã chỉnh sửa phần mô phỏng để cho thấy sự thay đổi khi sử dụng gói Robot Localization:
Các bạn lưu ý là ở đây odom sẽ là frame chính của chúng ta, sau khi mô phỏng trên RViz thành công bây giờ các bjan có thể tận dụng các cảm biến đưuọc cài đặt sẵn trên robot và phục vụ cho project của các bạn như SLAM,…
Thêm một chút gợi ý nho nhỏ cho các bạn để kiểm tra rằng mình đã có các topic và frame được liên kết với nhau chưa. Đầu tiên mình sử dụng:ros2 topic list và kết quả xuất hiện các topic như GPS, IMU, Odometry.
Bên cạnh đó, ROS cung cấp câu lệnh để kiểm tra sự kết nối giữa các frame được khai báo: ros2 run tf2_tools view_frames.py
Sau đó file sẽ được lưu dưới dạng pdf và bạn chỉ việc mở lên để kiểm tra bằng câu lệnh sau:
evince frames.pdf
Để có được kết quả như trên, thì chủ yếu mình đã chỉnh sửa và thêm vào IMU và GPS tại urdf file. Các bạn có thể mở gói turtlebot3_description để chỉnh sửa tùy theo project của mình.
Hy vọng qua blog này các bạn đã có thêm một số kiến thức cũng như công cụ hỗ trợ cho các dự án liên quan tới robotics sử dụng ROS. Bên cạnh đó, các bạn có thể theo dõi các blog khác cũng như các khóa học liên quan trên The Construct nhé.
Robot Ignite Academy, the place to learn to program robots using only a web browser
ROS Development Studio (the environment used in the video), another powerful online tool for pushing your ROS learning in a practical way
Preparing the environment
In order to spawn a gazebo model in a simulation using ROS, you need to have Gazebo and ROS installed. If you don’t want to install everything, we highly recommend using ROSDS (ROS Development Studio) which gives you access to an online environment with ROS already installed. Indeed, we are going to use that tool for easiness. You can follow the same steps on your computer as well if you don’t want to use ROSDS.
To use ROSDS, you can just create an account and start using it.
Once you have your account created, you have to create a ROSject by clicking on the New ROSject button:
Once you have the ROSject, you can open it by clicking Open:
Spawning a two-wheeled robot in a gazebo simulation
When you open a ROSject, you are able to open web shell, code editor, etc.
Let’s start opening a web shell by clicking Tools -> Shell in ROSDS. Once you have the shell, let’s clone the repository that contains the robot:
cd ~/simulation_ws/src/
git clone https://bitbucket.org/theconstructcore/two-wheeled-robot-simulation
If you see, the repository we just cloned, you will find the file m2wr_description/launch/spawn.launch which contains the code used to spawn the robot. The code is as follows:
A quick look into this file shows that the file loaded in gazebo will be the m2wr_description/urdf/m2wr.xacro, in the positions xyz = 0, 0, 0.5.
Now, to actually spawn the robot, you can first load an empty world by clicking Simulations -> Empty World -> Start Simulation.
Starting an empty simulation in ROSDS
With the empty simulation running, we can now spawn our robot into the current simulation. For that, let’s first compile the workspace to make sure the package we cloned is ok:
cd ~/simulation_ws/
catkin_make
source devel/setup.bash
rospack profile
Now let’s spawn our robot:
roslaunch m2wr_description spawn.launch
If everything went as expected, you should have the two-wheeledrobot in the simulation:
A two-whelled robot running in ROSDS
Congratulations!!! You just learned how to spawn a robot in a gazebo simulation.
Youtube video
If you didn’t understand well all the steps explained here or need more understanding of the files we created, remember that we have the live version of this post on YouTube. Also, if you liked the content, please consider subscribing to our youtube channel. We are publishing new content ~every day.
Learn how to add a gazebo model to a running gazebo simulation
List of resources used in this post:
Robot Ignite Academy, the place to learn to program robots using only a web browser
ROS Development Studio (the environment used in the video), another powerful online tool for pushing your ROS learning in a practical way
Gazebo models repository where you can find different models to be spawned
Including our model in the .world file
In this post, we are assuming you already have created a ROS package called my_simulations and the following files: ~/simulation_ws/src/my_simulations/launch/my_world.launch and ~/simulation_ws/src/my_simulations/world/empty_world.world.
If you check the my_world.world file, from the previous post we have the following content:
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- A ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>
</world>
</sdf>
Let’s add a postbox model. Remember that you can find many Gazebo moels on the Gazebo models repository.
The final content of ~/simulation_ws/src/my_simulations/world/empty_world.world after adding the postbox would be:
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- A ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>
<!-- A post box plane -->
<include>
<uri>model://postbox</uri>
</include>
</world>
</sdf>
This adds a model called postbox in the initial position (x=0, y=0, z=0). If you want it in a different position, you can add a <pose> like in the example below:
If you are in ROSDS and chose to run the simulation manually, then you have to manually open the Gazebo Web (gzweb) by clicking on Tools -> Gazebo.
Congratulations. You have successfully loaded a custom model in a Gazebo World using ROS.
Youtube video
If you didn’t understand well all the steps explained here or needs more understanding of the files we created, remember that we have the live version of this post on YouTube. Also, if you liked the content, please consider subscribing to our youtube channel. We are publishing new content ~every day.
Gazebo is a leader in robot simulation. It is a tool relied upon by hundreds of thousands of users and developers around the world.
Perhaps you have heard “Gazebo simulation” many times, but you don’t know exactly what it is or how it works. In this post, you will learn what a Gazebo simulation is by practicing, as it pertains to ROS development.
You don’t need a ROS installation for this, as we will use the ROS Development Studio (ROSDS), an online platform that provides access to ROS1 & ROS2 computers and other powerful ROS tools within a browser!
Action first before the theory! Grab a copy of the project used for this post using the link below. If you don’t have an account on the ROSDS, you will be guided to create one.
Once you have cloned the project, open it up and give it a moment to finish loading.
If you want to know how to install Gazebo in an existing ROS environment on your local computer, then please follow this tutorial:
[irp posts=”8194″ name=”All about Gazebo ROS (Gazebo 9)”]
Step 2: Bring up a Gazebo simulation
From the ROSDS Tools menu, pick the Shell and Gazebo tools. Yeah, we have a tool so named:). Place the tools side-by-side for best effect.
Type the following commands on the Shell to bring up a Gazebo simulation.
user:~$ roslaunch gazebo_ros mud_world.launch
You should now see something similar to this:
Step 3: What is Gazebo simulation in theory?
Well, I just showed you a Gazebo simulation in the step above, in practice. Now we are going to look what it’s in theory.
A Gazebo simulation is a robot simulation made with Gazebo, a 3D simulator with the ability to accurately and efficiently simulate populations of robots in complex indoor and outdoor environments.
It’s similar to game engines, but produces better simulations and offers a suite of sensors and interfaces for both users and programs.
It has the following main components:
World files – contain all the elements in a simulation, including robots, lights, sensors, and static objects. In the image above, the world is shown in the Gazebo app.
Models – represent individual elements. The three robots and the object in front of them are models.
gzserver – the “work horse” Gazebo program – it reads the world file to generate and populate a world.
gzclient – connects to gzserver and visualizes the elements. In the shell output, under “NODES”, we have both gzserver and gzclient listed.
gzweb – web version of gzclient, using WebGL.
Step 4: Wrapping up
And that’s it! You know what a Gazebo simulation is in both practice and theory. This knowledge is the foundation for using and creating Gazebo simulations.
Extra: Video
Prefer to watch a video demonstrating the steps above? We have one for you below!
Related Resources and Further Learning
If you are a ROS beginner and want to learn ROS basics fast, we recommend you take any of the following courses on Robot Ignite Academy:
Did you like this post? Do you have questions about what is explained? Whatever the case, please leave a comment on the comments section below, so we can interact and learn from each other.
If you want to learn about other ROS topics, please let us know in the comments area and we will do a video or post about it
In this video we are going to show how to solve the problem of a pioneer 3dx gazebo robot that still moves even after releasing the keyboard, using keyboard twist teleop.
Step 1. Create a project in ROS Development Studio(ROSDS)
ROSDS helps you follow our tutorial in a fast pace without dealing without setting up an environment locally. If you haven’t had an account yet, you can create a free account here. Let’s create a new project and call it pioneer3dx_do_not_stop.
Step 2. Clone the repository
To reproduce the problem, we have to clone it from the original repository. Create a folder called p3dx under the simulation_ws/src and run the following commands to clone the repository.
cd simulation_ws/src/
mkdir p3dx && cd p3dx
git clone https://github.com/RafBerkvens/ua_ros_p3dx.git
Then you can run the simulation from Simulations->select launch file->gazebo.launch
You can try to control the robot by sending the command to the /p3dx/cmd_vel topic. Then you’ll see the problem. The robot won’t stop even when we stop sending command.
To fix this, we comment out these lines in the /p3dx/p3dx_description/urdf/pioneer3dx.gazebo file
We want to change the controller which support timeout control and we also have to specify transmission property. Several parts have been changed in the repository. You can find the changes in detail here. We also need a parameter file for the controller. Create a file called control.yaml under the /p3dx/p3dx_control/ directory with the following content.
We also have to modify the gazeno.launch file like this to launch the controller.
<launch>
<!-- these are the arguments you can pass this launch file, for example
paused:=true -->
<arg name="paused" default="false" />
<arg name="use_sim_time" default="true" />
<arg name="gui" default="true" />
<arg name="headless" default="false" />
<arg name="debug" default="false" />
<!-- We resume the logic in empty_world.launch, changing only the name of
the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<!--<arg name="world_name" value="$(find p3dx_gazebo)/worlds/p3dx.world" />-->
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)" />
<arg name="use_sim_time" value="$(arg use_sim_time)" />
<arg name="headless" value="$(arg headless)" />
</include>
<group ns="/p3dx">
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description"
command="$(find xacro)/xacro.py --inorder '$(find p3dx_description)/urdf/pioneer3dx.xacro'" />
<!-- Run a python script to the send a service call to gazebo_ros to spawn
a URDF robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
respawn="false" output="screen" args="-urdf -param robot_description -model p3dx" />
<rosparam command="load" file="$(find p3dx_control)/config/control.yaml" />
<node name="base_controller_spawner" pkg="controller_manager" type="spawner"
args="--namespace=/p3dx
p3dx_joint_publisher
p3dx_velocity_controller
--shutdown-timeout 3"
output="screen"/>
<!-- ros_control p3rd launch file -->
<!-- <include file="$(find p3dx_control)/launch/control.launch" /> -->
</group>
</launch>
Now you launch the simulation again and execute the following command rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=/p3dx/p3dx_velocity_controller/cmd_vel . You’ll see that the robot stops when you release the key. You can also change the time for timeout in the control.yaml file.
If you are interested in this topic, please check our ROS control 101 course, which explains the ros controller much into detail.
Edit by: Tony Huang
—–
Did you like the video? If you did please give us a thumbs up and remember to subscribe to our channel and press the bell for a new video every day. Either you like it or not, please share your thoughts and questions in the comments area.