Skip to content

Commit

Permalink
Merge branch 'main' into NAND-Docker
Browse files Browse the repository at this point in the history
  • Loading branch information
TiaSinghania committed Nov 14, 2024
2 parents 873861e + f9bdac1 commit 356acee
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 79 deletions.
155 changes: 82 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,74 +1,95 @@
# RoboBuggy2
A complete re-write of the old RoboBuggy.
A complete re-write of the old RoboBuggy. This code was run for RD23, RD24 and RD25, on both NAND and Short Circuit.


---
## Table of Contents
- Installation
- Quickstart
- Development
- Installation and Initial Setup
- Launching Code
- Infrastructure Documentation
- Code Structure and Documentation


---
## Installation (for Windows)
### Install Softwares: WSL, Ubuntu, Foxglove
- Go to Microsoft Store to install "Ubuntu 20.04.6 LTS".
- Go install Foxglove https://foxglove.dev/.
## Installation and Initial Setup
### Necessary + Recommended Software
- Docker
- Foxglove
- VSCode (recommended)
- Git (recommended)


### Docker
- You will need [Docker](https://docs.docker.com/get-docker/) installed.
- Installation instructions here: https://docs.docker.com/get-docker/

### Set up repo in WSL
- To set up ssh key, follow this link: [Connecting to GitHub with SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh).
- Note: Ensure that the SSH keys are generated while in the WSL terminal
- In the website above, see these two pages: [Generating a new SSH key and adding it to the ssh-agent](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) and ["Adding a new SSH key to your GitHub account"](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account).
### Foxglove
- Installation instructions here: https://foxglove.dev/

### Clone
- In your terminal type: `$ git clone https://github.com/CMU-Robotics-Club/RoboBuggy2.git`.
- The clone link above is find in github: code -> local -> Clone SSH.
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/8ea809f7-35f9-4517-b98d-42e2e869d233)
### VSCode
- https://code.visualstudio.com/download

### Git
- https://git-scm.com/downloads

### ROS
- Navigate to `/rb_ws`. This is the catkin workspace where we will be doing all our ROS stuff.
- To build the ROS workspace and source it, run:
### Install Softwares: WSL, Ubuntu (Windows only)
- Go to Microsoft Store to install "Ubuntu 20.04.6 LTS".

catkin_make
source /rb_ws/devel/setup.bash # sets variables so that our package is visible to ROS commands
### Set up repo in WSL
- To set up ssh key, follow this link: [Connecting to GitHub with SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh).
- Note: Ensure that the SSH keys are generated while in the WSL terminal
- In the website above, see these two pages: [Generating a new SSH key and adding it to the ssh-agent](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) and ["Adding a new SSH key to your GitHub account"](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account).

## Installation (for MacOS)
### Install Softwares: Docker, Foxglove
- Go install Foxglove https://foxglove.dev/.
- You will need [Docker](https://docs.docker.com/get-docker/) installed.

### Apple Silicon Mac Only:
- In Docker Desktop App: go to settings -> general and turn on "Use Rosetta for x86/amd64 emulation on Apple Silicon"
- In Docker Desktop App: go to settings -> general and turn on "Use Rosetta for x86/amd64 emulation on Apple Silicon"

### Set up repository
- To set up ssh key, follow this link: [Connecting to GitHub with SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh).
- Note: Ensure that the SSH keys are generated while in the terminal
- In the website above, see these two pages: [Generating a new SSH key and adding it to the ssh-agent](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) and ["Adding a new SSH key to your GitHub account"](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account).

### Clone
- In your terminal type: `$ git clone [email protected]:CMU-Robotics-Club/RoboBuggy2.git`.
- The clone link above is find in github: code -> local -> Clone SSH.
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/8ea809f7-35f9-4517-b98d-42e2e869d233)

### Clone the Repository
This is so you can edit our codebase locally, and sync your changes with the rest of the team through Git.
- In your terminal type: `$ git clone https://github.com/CMU-Robotics-Club/RoboBuggy2.git`.
- The clone link above is the URL or can be found above: code -> local -> Clone HTTPS.

### ROS
- Navigate to `/rb_ws`. This is the catkin workspace where we will be doing all our ROS stuff.
- To build the ROS workspace and source it, run:

catkin_make
source /rb_ws/devel/setup.bash # sets variables so that our package is visible to ROS commands
### Foxglove Visualization
- Foxglove is used to visualize both the simulator and the actual buggy's movements.
- First, you need to import the layout definition into Foxglove. On the top bar, click Layout, then "Import from file".
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/2aa04083-46b3-42a5-bcc1-99cf7ccdb3d2)
- Go to RoboBuggy2 and choose the file [telematics layout](telematics_layout.json)
- To visualize the simulator, launch the simulator and then launch Foxglove and select "Open Connection" on startup.
- Use this address `ws://localhost:8765` for Foxglove Websocket
- Open Foxglove, choose the third option "start link".
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/66965d34-502b-4130-976e-1419c0ac5f69)

---
## Open Docker


### X11 Setup (recommended)
- Install the appropriate X11 server on your computer for your respective operating systems (Xming for Windows, XQuartz for Mac, etc.).
- Mac: In XQuartz settings, ensure that the "Allow connections from network clients" under "Security" is checked.
- Windows: Make sure that you're using WSL 2 Ubuntu and NOT command prompt.
- While in a bash shell with the X11 server running, run `xhost +local:docker`.
- Boot up the docker container using the "Alternate Shortcut" above.
- Run `xeyes` while INSIDE the Docker container to test X11 forwarding. If this works, we're good.


## Launching Code
### Open Docker
- Use `cd` to change the working directory to be `RoboBuggy2`
- Then do `./setup_dev.sh` in the main directory (RoboBuggy2) to launch the docker container. Utilize the `--no-gpu`, `--force-gpu`, and `--run-testing` flags as necessary.
- Then you can go in the docker container using the `docker exec -it robobuggy2-main-1 bash`.
- When you are done, type Ctrl+C and use `$exit` to exit.

## 2D Simulation
### ROS
- Navigate to `/rb_ws`. This is the catkin workspace where we will be doing all our ROS stuff.
- (This should only need to be run the first time you set up the repository) - to build the ROS workspace and source it, run:
catkin_make
source /rb_ws/devel/setup.bash # sets variables so that our package is visible to ROS commands
- To learn ROS on your own, follow the guide on https://wiki.ros.org/ROS/Tutorials.

### 2D Simulation
- Boot up the docker container
- Run `roslaunch buggy sim_2d_single.launch` to simulate 1 buggy
- See `rb_ws/src/buggy/launch/sim_2d_single.launch` to view all available launch options
Expand All @@ -81,38 +102,8 @@ A complete re-write of the old RoboBuggy.
- To prevent topic name collision, a topic named `t` associated with buggy named `x` have format `x/t`. The names are `SC` and `Nand` in the 2 buggy simulator. In the one buggy simulator, the name can be defined as a launch arg.
- See [**Foxglove Visualization**](#foxglove-visualization) for visualizing the simulation. Beware that since topic names are user-defined, you will need to adjust the topic names in each panel.

### Simulator notes
Feedback:
- Longitude + Latitude for Foxglove visualization on map: `/state/pose_navsat` (sensor_msgs/NavSatFix)
- UTM coordinates (assume we're in Zone 17T): `/sim_2d/utm` (geometry_msgs/Pose - position.x = Easting meters , position.y = Northing meters, position.z = heading in degrees from East axis + is CCW)
- INS Simulation: `/nav/odom` (nsg_msgs/Odometry) (**Noise** is implemented to vary ~1cm)
Commands:
- Steering angle: `/buggy/steering` in degrees (std_msgs/Float64)
- Velocity: `/buggy/velocity` in m/s (std_msgs/Float64)


## Foxglove Visualization
- Foxglove is used to visualize both the simulator and the actual buggy's movements.
- First, you need to import the layout definition into Foxglove. On the top bar, click Layout, then "Import from file".
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/2aa04083-46b3-42a5-bcc1-99cf7ccdb3d2)
- Go to RoboBuggy2 and choose the file [telematics layout](telematics_layout.json)
- To visualize the simulator, launch the simulator and then launch Foxglove and select "Open Connection" on startup.
- Use this address `ws://localhost:8765` for Foxglove Websocket
- Open Foxglove, choose the third option "start link".
- ![image](https://github.com/CMU-Robotics-Club/RoboBuggy2/assets/116482510/66965d34-502b-4130-976e-1419c0ac5f69)

## X11 Setup
Instructions:
- Install the appropriate X11 server on your computer for your respective operating systems (Xming for Windows, XQuartz for Mac, etc.).
- Mac: In XQuartz settings, ensure that the "Allow connections from network clients" under "Security" is checked.
- Windows: Make sure that you're using WSL 2 Ubuntu and NOT command prompt.
- While in a bash shell with the X11 server running, run `xhost +local:docker`.
- Boot up the docker container using the "Alternate Shortcut" above.
- Run `xeyes` while INSIDE the Docker container to test X11 forwarding. If this works, we're good.

---
### Connecting to and Launching the RoboBuggy
When launching the buggy:
### Connecting to and Launching the RoboBuggies
When launching Short Circuit:
- Connect to the Wi-Fi named ShortCircuit.
- In the command line window:
SSH to the computer on ShortCircuit and go to folder
Expand All @@ -123,13 +114,31 @@ Then `$ cd RoboBuggy2`
- Go to docker container
`$ docker_exec`
- Open foxglove and do local connection to “ws://192.168.1.217/8765”
- Roslauch in docker container by `$ roslaunch buggy sc-main.launch` (or `$ roslaunch buggy nand-main.launch` for NAND)
- Roslauch in docker container by `$ roslaunch buggy sc-main.launch`
(wait until no longer prints “waiting for covariance to be better”)

When launching NAND:
- Ask software lead (WIP)

When shutting down the buggy:
- Stop roslauch
`$ ^C (Ctrl+C)`
- Leave the docker container
`$ exit`
- Shutdown the ShortCircuit computer
`$ sudo shutdown now`

## Documentation
### Infrastructure Documentation
Ask Software Lead (WIP)

### Simulator notes
- Longitude + Latitude for Foxglove visualization on map: `/state/pose_navsat` (sensor_msgs/NavSatFix)
- UTM coordinates (assume we're in Zone 17N): `/sim_2d/utm` (geometry_msgs/Pose - position.x = Easting meters , position.y = Northing meters, position.z = heading in degrees from East axis + is CCW)
- INS Simulation: `/nav/odom` (nsg_msgs/Odometry) (**Noise** is implemented to vary ~1cm)
Commands:
- Steering angle: `/buggy/steering` in degrees (std_msgs/Float64)
- Velocity: `/buggy/velocity` in m/s (std_msgs/Float64)

### Auton Logic
Ask someone with experience (WIP)
1 change: 1 addition & 0 deletions rb_ws/src/buggy/launch/nand-system.launch
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@

<node name="foxglove" pkg="foxglove_bridge" type="foxglove_bridge" />
<node name="telematics" pkg="buggy" type="telematics.py" />
<node name="watchdog" pkg="buggy" type="watchdog.py" args = "--self_name NAND" output="screen"/>
</launch>
1 change: 1 addition & 0 deletions rb_ws/src/buggy/launch/sc-system.launch
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@

<node name="foxglove" pkg="foxglove_bridge" type="foxglove_bridge" />
<node name="telematics" pkg="buggy" type="telematics.py" />
<node name="watchdog" pkg="buggy" type="watchdog.py" args = "--self_name SC" output="screen"/>
</launch>
6 changes: 6 additions & 0 deletions rb_ws/src/buggy/launch/watchdog.launch
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<!-- roslaunch buggy main.launch -->

<launch>
<node name="foxglove" pkg="foxglove_bridge" type="foxglove_bridge" />
<node name="watchdog" pkg="buggy" type="watchdog.py" args = "--self_name SC" output="screen"/>
</launch>
9 changes: 5 additions & 4 deletions rb_ws/src/buggy/scripts/serial/ros_to_bnyahaj.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,14 @@ def set_alarm(self, msg):
alarm ros topic reader, locked so that only one of the setters runs at once
"""
with self.lock:
rospy.logdebug(f"Reading alarm of {msg.data}")
self.alarm = msg.data

def set_steering(self, msg):
"""
Steering Angle Updater, updates the steering angle locally if updated on ros stopic
"""
rospy.loginfo(f"Read steeering angle of: {msg.data}")
rospy.logdebug(f"Read steeering angle of: {msg.data}")
# print("Steering angle: " + str(msg.data))
# print("SET STEERING: " + str(msg.data))
with self.lock:
Expand All @@ -120,7 +121,7 @@ def writer_thread(self):
TODO: Does alarm node exist for NAND?
"""
rospy.loginfo("Starting sending alarm and steering to teensy!")
while True:
while not rospy.is_shutdown():
if self.fresh_steer:
with self.lock:
self.comms.send_steering(self.steer_angle)
Expand All @@ -139,7 +140,7 @@ def reader_thread(self):
tuple -> (SC, maybe NAND?) Debug Info
"""
rospy.loginfo("Starting reading odom from teensy!")
while True:
while not rospy.is_shutdown():
packet = self.comms.read_packet()

if isinstance(packet, Odometry):
Expand All @@ -163,7 +164,7 @@ def reader_thread(self):

# TODO: Not mock rolled accurately (Needs to be Fact Checked)
try:
lat, long = World.utm_to_gps(packet.y, packet.x)
lat, long = World.utm_to_gps(packet.x, packet.y)
odom.pose.pose.position.x = long
odom.pose.pose.position.y = lat
odom.twist.twist.angular.z = packet.heading_rate
Expand Down
4 changes: 2 additions & 2 deletions rb_ws/src/buggy/scripts/visualization/telematics.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ def republish_fixinfo(self, msg, publishers):
else:
fix_string += "FIX_RTK_FIXED"

fix_string += "\nsbas_used: " + str(msg.sbas_used)
fix_string += "\ndngss_used: " + str(msg.dngss_used)
# fix_string += "\nsbas_used: " + str(msg.sbas_used)
# fix_string += "\ndngss_used: " + str(msg.dngss_used)
publishers[0].publish(fix_string)
publishers[1].publish(fix_type)

Expand Down
87 changes: 87 additions & 0 deletions rb_ws/src/buggy/scripts/watchdog/watchdog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env python3

import argparse

import rospy

from std_msgs.msg import Bool, Int8, Float64

class Watchdog:

STEERING_DEVIANCE = 4 #deg

def __init__(self, self_name) -> None:
self.alarm = 0 #Check this alarm value
"""
0 - OK
1 - WARNING
2 - ERROR
"""

self.commanded_steering = 0
self.inAutonSteer = False

rospy.Subscriber(
self_name + "/buggy/input/steering", Float64, self.set_input_steering
)
rospy.Subscriber(
self_name + "/buggy/debug/steering_angle", Float64, self.check_stepper_steering
)
rospy.Subscriber(
self_name + "/buggy/debug/use_auton_steer", Bool, self.set_auton_steer
)

self.alarm_publisher = rospy.Publisher(self_name + "/debug/sanity_warning", Int8, queue_size=1)
self.alarm_publish_rate = rospy.Rate(100) #10ms per alarm

def set_input_steering(self, msg):
rospy.logdebug("Got input steering of: " + str(msg.data))
self.commanded_steering = msg.data

def set_auton_steer(self, msg):
if (msg.data and not self.inAutonSteer):
rospy.loginfo("ENTERED AUTON")
if (not msg.data and self.inAutonSteer):
rospy.logwarn("EXITED AUTON")
self.alarm = 0 #No alarm if not in auton
self.inAutonSteer = msg.data

def check_stepper_steering(self, msg):
stepper_steer = msg.data
rospy.logdebug("Firmware's reported stepper degree: " + str(stepper_steer))
if (self.alarm < 2):
self.alarm = 0
if abs(stepper_steer - self.commanded_steering) > Watchdog.STEERING_DEVIANCE:
if self.inAutonSteer:
self.alarm = 2 # ERROR
rospy.logerr("STEPPER DEVIANCE (DEGREES OFF): " + str(abs(stepper_steer - self.commanded_steering)))
else:
rospy.logdebug("(Non Auton) Stepper Deviance of: " + str(abs(stepper_steer - self.commanded_steering)))

elif abs(stepper_steer - self.commanded_steering) > Watchdog.STEERING_DEVIANCE//2:
if self.inAutonSteer:
self.alarm = max(self.alarm, 1)
rospy.logwarn("STEPPER POSSIBILY DEVIATING (DEGREES OFF): " + str(abs(stepper_steer - self.commanded_steering)))
else:
rospy.logdebug("(Non Auton) Stepper possibly deviating: " + str(abs(stepper_steer - self.commanded_steering)))

def loop(self):
while not rospy.is_shutdown():
#publish alarm
ros_alarm = Int8()
ros_alarm.data = self.alarm
self.alarm_publisher.publish(ros_alarm)

self.alarm_publish_rate.sleep()

if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--self_name", type=str, help="name of ego-buggy", required=True
)
args, _ = parser.parse_known_args()
self_name = args.self_name
rospy.init_node("watchdog")
rospy.loginfo("INITIALIZED WATCHDOG NODE")
watchdog = Watchdog(self_name=self_name)
watchdog.loop()

0 comments on commit 356acee

Please sign in to comment.