-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 0d2707c
Showing
29 changed files
with
2,258 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Drone Methods Cheat Sheet | ||
|
||
## Movements | ||
``` | ||
takeoff() – instructs a drone to take off | ||
parameters – No parameters | ||
land() – instructs a drone to land | ||
parameters – No parameters | ||
up(int c) – instructs a drone to go up by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: up(30) – move up by 30 cm | ||
down(int c) – instructs a drone to go down by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: down(30) – move down by 30 cm | ||
left(int c) – instructs a drone to move to the left by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: left(30) – move left by 30 cm | ||
right(int c) – instructs a drone to move to the right by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: right(30) – move right by 30 cm | ||
forward(int c) – instructs a drone to move forward by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: forward(30) – move forward by 30 cm | ||
backward(int c) – instructs a drone to move backward by ‘c’ centimeters | ||
parameters – ‘c’ | ||
Example: backward(30) – move forward by 30 | ||
turnLeft(int d) – instructs a drone to turn left by ‘d’ degrees | ||
parameters – ‘d’ | ||
Example: turnLeft(90) – turn left by 90 degrees | ||
turnRight(int d) – instructs a drone to turn right by ‘d’ degrees | ||
parameters – ‘d’ | ||
Example: turnRight(90) – turn right by 90 degrees | ||
flip(FlipDirection 'dir') - instructs a drone to make a flip in a specified direction. Possible directions are FlipDirection.LEFT, FlipDirection.RIGHT, FlipDirection.FORWARD, FlipDirection.BACKWARD | ||
parameters - 'dir' | ||
Example: flip(FlipDirection.BACKWARD) - instructs a drone to make a backward flip | ||
move(int x, int y, int z, int speed) - move to a relative position (x, y, z) with a specified speed. | ||
parameters - 'x', 'y', 'z', 'speed' | ||
Example: move(100, 100, 0, 50) - move to a position (100, 100, 0) w.r.t. current position at speed 50. | ||
Note: for a drone, positive x-axis is in the direction of a camera, and positive y-axis is in the direction to left if you look from the top of a drone. | ||
``` | ||
|
||
|
||
## Setting Drone Parameters | ||
``` | ||
setSpeed(int cmps) – set drone speed to ‘cmps’ centimeters/s | ||
parameters – ‘cpms’, 10 < cmps < 100 | ||
Example: setSpeed(40) – set speed to 40 cm/s | ||
``` | ||
|
||
|
||
## Streaming Video from a Drone | ||
``` | ||
addVideoListener(VideoListener listener)– adds a new video listener to a drone, which receives video frames | ||
parameters – ‘listener’ | ||
Example: addVideoListener(new VideoWindow())- creates a new window which displays video frames received from a drone | ||
setStreaming(bool enable) – enables/disables video streaming from a drone | ||
parameters – ‘enable’ | ||
Example: setStreaming(true) – enable video stream | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# ELE115/docs: Everything you need to know | ||
|
||
* [How to setup your programming environment](https://github.com/ELE115/docs/blob/master/setup.md) | ||
* [How to create a new project](https://github.com/ELE115/idea-gradle-template/blob/master/README.md) | ||
* [How to submit your projects with Git and GitHub](https://github.com/ELE115/docs/blob/master/git.md) | ||
* [Some common FAQ](https://github.com/ELE115/docs/blob/master/faq.md) | ||
* [Drone Methods Cheat Sheet](https://github.com/ELE115/docs/blob/master/Drone_Methods_Cheat_Sheet.md) | ||
* [Station mode and wifi mode](https://github.com/ELE115/docs/blob/master/wifi.md) | ||
* [Fly your drone at home](https://github.com/ELE115/docs/blob/master/at-home.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# Guide on flying your Tello at home | ||
|
||
## Preparation | ||
|
||
[Switch your drone to wifi mode](https://github.com/ELE115/docs/blob/master/wifi.md) | ||
if you havn't do so. | ||
|
||
## Connect to wifi | ||
|
||
1. Turn on your drone if you haven't done so. | ||
1. Wait until your drone blinks yellow light at high frequently. | ||
1. Using your laptop, connect to the wifi named `TELLO-<droneId>`. | ||
|
||
## Fly | ||
|
||
**WARNING:** Please read the entire section before proceed. **WARNING** | ||
|
||
**WARNING:** Please read the entire section before proceed. **WARNING** | ||
|
||
1. Put on your safety goggle. | ||
1. Make sure that the situation is suitable for flying. | ||
1. Launch IntelliJ IDEA. | ||
1. Create a new project or open an existing project. | ||
1. **DOUBLE CHECK** if it is **SAFE** for your drone to takeoff and move around. | ||
1. Click the Run button. | ||
1. Watch your drone flying. Closely (but not physically too close) monitor your drone. | ||
If anything goes wrong, **click the Stop button immediately**. | ||
1. The drone takes **15 seconds** to land after you hit the Stop button. | ||
1. Do *not* try to catch the drone by your hand. | ||
|
||
## Charge your drone | ||
|
||
1. Turn off your drone. Leave the battery **inside** the drone. | ||
1. Use the Micro USB cable to charge the battery through the drone. | ||
1. Disconnect the cable when battery is fully charged. | ||
1. Remove battery from the drone. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# My code is not working | ||
|
||
IntelliJ IDEA is your best friend. | ||
Before you reach out to TAs, it may have already figured out what's going wrong in your code and given you some error hints: | ||
|
||
1. If you see **red wavy underline**, then there is a **syntax problem** such as missing/extra semicolon or braces. | ||
1. If you see anything **red**, then there is a **problem** such as you used a variable without declaration. | ||
1. If you see anything with **yellow background**, then there is a **warning** indicating that you **MAY** encounter some issue when your code runs. | ||
1. If you see anything **gray**, then you may have written something you don't need. | ||
|
||
 | ||
|
||
To the right of your code editor window, you may also notice a thin column of colorful dashes (not shown in the screen above). | ||
These are the summary of all error hints. | ||
Hover on it to read what's going wrong. | ||
Click on it to locate the exact location of the anticipated error. | ||
|
||
# Still not working? | ||
|
||
Some common mistakes: | ||
|
||
* `A problem occurred evaluating settings` | ||
|
||
You didn't modify `settings.gradle`. | ||
|
||
* `Error: Could not find or load main class com.github.ele115.xxx` | ||
|
||
Make sure the `mainClassName` in `build.gradle` matches your class name. | ||
|
||
# Where to find the documentation of the drone | ||
|
||
1. [Drone Methods Cheat sheet](https://github.com/ELE115/docs/blob/master/Drone_Methods_Cheat_Sheet.md) | ||
1. To quickly show simple documentation of a particular method or class (such as `ITelloDrone`, or `Tello.Connect`), | ||
click it and hit `Ctrl+Q` (or `Command+Q` if using macOS). | ||
1. To open the source code of something, hold `Ctrl` (or `Command if using macOS) and click on the stuff you want to look at. | ||
|
||
**Note:** Don't be intimidated about these. Feel free to ask TAs if you don't understand what's inside. | ||
|
||
# How to maintain a good coding style | ||
|
||
A piece of code is valid as long as it has correct syntax and semantics. | ||
But code with bad style hurts our feelings and, with time, may lead to incorrect syntax and semantics. | ||
Bad style *may* also hurt your grade. | ||
|
||
In ELE115 world, there is a large set (238) of rules that defines *what is a good coding style*. | ||
Refer to your `.editorconfig` file for the complete specification of ELE115 coding styles. (Please don't modify the file!) | ||
|
||
Since we take coding style serisouly, we provde a way to automatically **check** your code against the rules and **fix** all violations. | ||
This process is called `auto-format`. | ||
We encourage you to auto-format your code frequently, and | ||
we **strongly** encourage you to auto-format your code **before** commit and push. | ||
|
||
To auto-format your code: | ||
|
||
In your Java code file, | ||
* For Linux/Windows users, simply hit `Ctrl+Alt+L`. | ||
* For Mac OS users, simply hit `Option+Command+L`. | ||
|
||
**Note:** If you don't see any changes, | ||
you are already doing great in coding style! | ||
No rule violations detected. |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# How to setup Git for your computer | ||
|
||
1. In IntelliJ IDEA workspace, find the `Terminal` panel (it is usually hidden at the bottom of your workspace). | ||
1. Type the following into the terminal. Hit enter at the end of a line. | ||
|
||
**Note:** If you are in `Welcome to IntelliJ IDEA` dialog, you should postpone this setup until you have created a project. | ||
|
||
**Note:** Do **NOT** copy paste this. You may accidentally break things here. | ||
|
||
**Note:** Use the same capitalization as you did on GitHub registration. | ||
``` | ||
git config --global user.name <Your-GitHub-UserName> | ||
git config --global user.email <Your-GitHub-Email> | ||
``` | ||
|
||
**Note:** Omit the `<`/`>` surrounding. | ||
|
||
# How to setup Git for a single project | ||
|
||
1. **Make sure Git is setup for your computer first!** (See above for instructions) | ||
1. In IntelliJ IDEA workspace, click menu: `VCS`/`Import into Version Control`/`Create Git Repository...`. | ||
1. Make sure your project folder is selected. Click `OK`. | ||
|
||
**EXTREMELY IMPORTANT NOTICE: | ||
DO NOT SELECT `src` FOLDER. DO NOT SELECT ANY FOLDER OTHER THAN THE DEFAULT ONE AT ALL. | ||
DO NOT CLICK ANYWHERE OTHER THAN THE `OK` BUTTON. | ||
IF YOU PICK ANY FOLDER OTHER THAN THE ROOT FOLDER OF YOUR PROJECT, | ||
YOUR PROJECT WILL BE IRREVERTABLY DESTROYED.** | ||
[How to fix your destroyed project (if you are TA)](https://github.com/ELE115/labs/tree/master/docs/fix.md) | ||
|
||
1. Click menu: `File`/`Settings...` (or `IntelliJ IDEA`/`Preferences...` if you are using **mac OS**). | ||
1. Click `Version Control` (**NOT** unfolding it, just click). | ||
1. Pick the only item in the list (it should currently be the path to your project). | ||
1. Hit enter or click `Edit` (the small pen icon). | ||
1. Make sure `Project` is selected. | ||
1. Click `OK`. | ||
1. Click `OK`. | ||
|
||
Also, you need to do the following: | ||
|
||
1. In IntelliJ IDEA workspace, click menu: `VCS`/`Git`/`Remotes...`. | ||
1. Click `+`. | ||
1. For the Name, just use `origin` by default. For the URL: | ||
* For Linux and mac OS users: | ||
When you accepted an assignment in GitHub Classroom, you were given a link to a private repo. | ||
At that page GitHub asked you to choose between `HTTPS` and `SSH`. Pick `SSH` and you will get a link looks like | ||
`git@github.com:ELE115/lab*****-netid.git`. That's what you need right here. | ||
* For Windows users: | ||
When you accepted an assignment in GitHub Classroom, you were given a link to a private repo. | ||
At that page GitHub asked you to choose between `HTTPS` and `SSH`. Pick `HTTPS` and you will get a link looks like | ||
`https://github.com/ELE115/lab*****-netid.git`. That's what you need right here. | ||
1. Click `OK`. | ||
1. Click `OK`. | ||
|
||
**Note:** If there's already some contents in the repo, you may use the green `Clone or download` button to get the URL. | ||
|
||
**Note:** The URL is **NOT** guranteed to work on Windows. If you have trouble doing Git Push, ask TA for help. | ||
|
||
# How to create a commit | ||
|
||
1. **Make sure Git is setup for your project first!** (See above for instructions) | ||
1. [Auto-format](https://github.com/ELE115/docs/blob/master/faq.md#how-to-maintain-a-good-coding-style) your Java source files. | ||
1. Click `VCS`/`Commit...`. | ||
1. Choose what changes you want to include in the commit. | ||
1. Add a meaningful commit message. The first line of your commit message shall be a summary. | ||
**NEVER** use empty commit message or garbage commit message. | ||
1. Uncheck **ALL** checkboxes in `Before Commit` section. | ||
1. Click `Commit`. | ||
|
||
> Well, but **what should I commit?** | ||
Basically you have to *eventually* commit everything, | ||
including all the files that are provided to you at the beginning (`build.gradle`, `settings.gradle`, ...), | ||
and the files you created during the lab (`src/main/java/...`). | ||
|
||
By *eventually* I mean, you don't have to commit everything all at once. | ||
You can commit some files in your first commit, | ||
other files in another commit. | ||
But, before the code submittion deadline, you **must** have all files committed and pushed to GitHub. | ||
|
||
# How to push your commit to GitHub | ||
|
||
1. **Make sure Git is setup for your project first!** (See above for instructions) | ||
Also make sure you have several commit(s) before you push. | ||
1. Click `VCS`/`Git`/`Push...`. | ||
1. Review the changes. | ||
1. Click `Push`. | ||
|
||
To **verify** everything is good, please visit the assignment repo on GitHub and directly browse your code. | ||
|
||
If everything looks great there, you are all set! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
# Preparation | ||
|
||
> Estimated Time Cost: 20~40min. | ||
Connect to our Wifi `ELE115-TELLO`. Ask the TA for password. **NEVER** share Wifi password(s) with anybody. | ||
[Setup environment](https://github.com/ELE115/docs/blob/master/setup.md) if your haven't done so. | ||
|
||
# Part I: Hello Java | ||
|
||
> Estimated Time Cost: 10min. | ||
1. **Read the whole [FAQ](https://github.com/ELE115/docs/blob/master/faq.md).** | ||
1. Accept the GitHub Classroom assignment. See Canvas for the link. | ||
1. **Follow the [guide](https://github.com/ELE115/idea-gradle-template/blob/master/README.md) to create a new project.** | ||
**Name** your project as `lab1-hello-java`. | ||
|
||
**Note:** You MUST follow the guide to create new projects. Do not try to setup a new project on your own. | ||
|
||
Write your code now. Your project shall do (and only do) the following: | ||
* Write `Hello Java` on the screen | ||
* Exit afterwards | ||
|
||
1. Hit Shift+F10 to confirm the correctness of your program. Fix problems and retry until success. | ||
1. Once finished, show your `Hello Java` result to the TA. | ||
1. Follow the [Guide on submitting projects to GitHub](https://github.com/ELE115/docs/blob/master/git.md#how-to-setup-git-for-a-single-project). | ||
1. Proceed to Part II. | ||
|
||
# Part II: Hello Robot | ||
|
||
> Estimated Time Cost: 20min. | ||
1. Accept the GitHub Classroom assignment. See Canvas for the link. | ||
1. Get one Tello drone from the TA. | ||
1. Confirm the content of your drone case: | ||
* Tello drone x 1, with four propellers and four propeller guards | ||
* Boards * 4 | ||
* Setup guide x 1 | ||
* User manual x 1 | ||
* Micro USB Cable x 1 | ||
* A small bag containing: | ||
* Replacement propellers x 4 | ||
* Propeller replacement tool x 1 | ||
1. Find your drone Id. It is a 6-characters string located on the **inner surface** of the drone. | ||
**Confirm** that the drone Id is identical to the drone Id labeled on the case. | ||
1. Put some stickers on your drone. Be sure *NOT* to cover the heat sink at the bottom. | ||
1. *Optionally* replace your propeller guards with fancier one(s). | ||
1. **Confirm** with the TA that the drone Id is correct and nothing is missing from the drone case. | ||
1. Get one battery from the TA. | ||
|
||
Create **another** project `lab1-hello-robot`. | ||
Code your project to do the following: | ||
* Connect to **your** drone, which should be placed at the blue cross on the floor. | ||
* Let your drone takeoff | ||
* Let your drone fly to the green cross. | ||
* Let your drone land at the green cross. | ||
* Exit afterwards | ||
|
||
**Note:** Distance between the two cross is approximately 350 centimeters. | ||
|
||
**Note:** You don't have to land *exactly* at the green cross. Anywhere around the cross is acceptable. | ||
|
||
To confirm the correctness of your program, | ||
you need to do the following: | ||
|
||
1. Power on your drone. | ||
1. Put your drone at the blue cross on the floor. | ||
1. Hit Shift+F10. | ||
1. Collect your drone when it **fully stops**. Do **NEVER** touch a flying drone. | ||
|
||
If you think your program is correct proceed to the following: | ||
|
||
1. Show your program result (actual drone actually flying) to the TA. | ||
1. Remove the battery from your drone. | ||
1. Pack your drone, with one battery, in your drone case. | ||
Always **double check** your drone Id. | ||
1. Follow the [Guide on submitting projects to GitHub](https://github.com/ELE115/docs/blob/master/git.md#how-to-setup-git-for-a-single-project). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
# ELE 115 – Lab 2 | ||
|
||
**Read the documentation for [Lab 2](https://github.com/ELE115/docs/blob/master/lab2.md)** | ||
|
||
## **Part 1 - Exploring every vertex of a regular 2-D triangle** | ||
|
||
Let's start with a simple mission – exploring every vertex of a regular triangle! | ||
|
||
Your task is to write a program which instructs a drone to fly a regular 2-D triangle in the air after a takeoff. | ||
|
||
1. Accept assignment by clicking on lab2-part1 invitation link on Canvas | ||
2. Create a new project and configure files _build.gradle_ and _settings.gradle_ using your **netid** and `lab2-part1`/`lab2_part1` name for your project (see steps 2-4 on [https://github.com/ELE115/idea-gradle-template/blob/master/README.md](https://github.com/ELE115/idea-gradle-template/blob/master/README.md)) | ||
2. Create a new Java class (see [https://github.com/ELE115/idea-gradle-template/blob/master/README.md#6-start-programming-and-have-fun](https://github.com/ELE115/idea-gradle-template/blob/master/README.md#6-start-programming-and-have-fun)) with the next name: `com.github.ele115.<netid>.lab2_part1.Main`, replacing `<netid>` by your university netid. E.g. if your netid is `alavrov`, use `com.github.ele115.alavrov.lab2_part1.Main` for the class name. | ||
3. Add the next code before your Main class to import libraries required to control the drone: | ||
|
||
```java | ||
import com.github.ele115.tello_wrapper.ITelloDrone; | ||
import com.github.ele115.tello_wrapper.Tello; | ||
``` | ||
|
||
4. Complete a main method of your class which will make the drone to fly a 2-D triangle with a side of 100 cm after it takes off. You can use any of the next drone methods to move the drone (see [Drone Methods Cheat Sheet](https://github.com/ELE115/docs/blob/master/Drone_Methods_Cheat_Sheet.md) for more commands and description): | ||
|
||
*takeoff(), forward(int c), backward(int c), turnLeft(int d), turnRight(int d), land()* | ||
5. Show your code to a TA and submit this part to **github** | ||
|
||
|
||
**The drone must land around the same point where it took off and it must face the same direction as before taking off!** | ||
|
||
**Your program must exit after the drone lands!** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
# ELE 115 – Lab 2 | ||
|
||
**Read the documentation for [Lab 2](https://github.com/ELE115/docs/blob/master/lab2.md)** | ||
|
||
## **Part 2 - Exploring a regular 2-D polygon with 3, 4, 5, or 6 sides based on operator's Input** | ||
|
||
Now when you can fly a regular 2-D triangle, let's make a program interactive and let a drone operator to choose which polygon to fly! | ||
|
||
This time before taking off you should ask an operator which regular polygon he/she wants to explore. The operator needs to enter the number of sides before a drone takes off, check that provided input is a valid number, and after that fly a specified polygon. We assume that valid polygons are triangle, square, pentagon, and hexagon. Therefore, number of sides can be either 3, 4, 5, or 6. In the case if the input is not valid, the program must print an error message and exit. | ||
|
||
1. Accept assignment by clicking on lab2-part2 invitation link on Canvas | ||
2. Create a new project and configure files _build.gradle_ and _settings.gradle_ using your **netid** and `lab2-part2`/`lab2_part2` name for your project (see steps 2-4 on [https://github.com/ELE115/idea-gradle-template/blob/master/README.md](https://github.com/ELE115/idea-gradle-template/blob/master/README.md)) | ||
2. Create a new Java class (see [https://github.com/ELE115/idea-gradle-template/blob/master/README.md#6-start-programming-and-have-fun](https://github.com/ELE115/idea-gradle-template/blob/master/README.md#6-start-programming-and-have-fun)) with the next name: `com.github.ele115.<netid>.lab2_part2.Main`, replacing `<netid>` by your university netid. E.g. if your netid is `alavrov`, use `com.github.ele115.alavrov.lab2_part2.Main` for the class name. | ||
4. Add the next code before your Main class to import libraries required to control the drone: | ||
|
||
```java | ||
import com.github.ele115.tello_wrapper.ITelloDrone; | ||
import com.github.ele115.tello_wrapper.Tello; | ||
``` | ||
|
||
5. Complete a main method of your class which will first ask an operator to provide number of sides for a polygon and checks its correctness (see the description above). If the input is valid, make the drone to fly a 2-D regular polygon with a side of 100 cm after taking off and landing after finishing exploring a polygon. | ||
|
||
6. Show your code to a TA and submit this part to **github** | ||
|
||
In addition to drone control commands from Part I, you should use conditional statements: *if/if-else/switch*. In this part you are not required to use loop statements. | ||
|
||
**The drone must land around the same point where it took off and it must face the same direction as before taking off!** | ||
|
||
**Your program must exit after the drone lands!** |
Oops, something went wrong.