mirror of
https://github.com/SHC-ASTRA/rover-ros2.git
synced 2026-02-11 17:30:36 +00:00
Compare commits
14 Commits
serial-ref
...
docker
| Author | SHA1 | Date | |
|---|---|---|---|
| 91fa23cd32 | |||
| 3e1b1683af | |||
| e3ad666fbc | |||
| 7da58dda3c | |||
|
|
3f68052144 | ||
|
|
c72f72dc32 | ||
|
|
61f5f1fc3e | ||
|
|
65aab7f179 | ||
|
|
697efa7b9d | ||
|
|
b70a0d27c3 | ||
|
|
2d48361b8f | ||
|
|
d9355f16e9 | ||
|
|
9fc120b09e | ||
|
|
4a98c3d435 |
4
.dockerignore
Normal file
4
.dockerignore
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.git
|
||||||
|
*.log
|
||||||
|
build/
|
||||||
|
install/
|
||||||
12
README.md
12
README.md
@@ -11,6 +11,7 @@ You will use these packages to launch all rover-side ROS2 nodes.
|
|||||||
- [Software Prerequisites](#software-prerequisites)
|
- [Software Prerequisites](#software-prerequisites)
|
||||||
- [Nix](#nix)
|
- [Nix](#nix)
|
||||||
- [ROS2 Humble + rosdep](#ros2-humble--rosdep)
|
- [ROS2 Humble + rosdep](#ros2-humble--rosdep)
|
||||||
|
- [Docker](#docker)
|
||||||
- [Running](#running)
|
- [Running](#running)
|
||||||
- [Testing Serial](#testing-serial)
|
- [Testing Serial](#testing-serial)
|
||||||
- [Connecting the GuliKit Controller](#connecting-the-gulikit-controller)
|
- [Connecting the GuliKit Controller](#connecting-the-gulikit-controller)
|
||||||
@@ -47,6 +48,17 @@ $ cd path/to/rover-ros2
|
|||||||
$ rosdep install --from-paths src -y --ignore-src
|
$ rosdep install --from-paths src -y --ignore-src
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
Using the docker compose file automatically builds the workspace and allows you to choose between running on the CPU or GPU for applications like Rviz2 and Gazebo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run on CPU
|
||||||
|
$ docker compose run --rm --name rover-ros2-container cpu
|
||||||
|
# Run on GPU (NVidia only)
|
||||||
|
$ docker compose run --rm --name rover-ros2-container gpu
|
||||||
|
```
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
38
docker-compose.yml
Normal file
38
docker-compose.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
services:
|
||||||
|
cpu:
|
||||||
|
image: moveit/moveit2:${DOCKER_IMAGE}
|
||||||
|
container_name: moveit2_container
|
||||||
|
privileged: true
|
||||||
|
network_mode: host
|
||||||
|
command: ["bash", "-c", "colcon build --symlink-install && source /ros2_ws/install/setup.bash && exec bash"]
|
||||||
|
volumes:
|
||||||
|
- ./:/ros2_ws
|
||||||
|
- /tmp/.X11-unix:/tmp/.X11-unix
|
||||||
|
- $XAUTHORITY:/root/.Xauthority
|
||||||
|
working_dir: /ros2_ws
|
||||||
|
environment:
|
||||||
|
QT_X11_NO_MITSHM: 1
|
||||||
|
DISPLAY: $DISPLAY
|
||||||
|
gpu:
|
||||||
|
image: moveit/moveit2:${DOCKER_IMAGE}
|
||||||
|
container_name: moveit2_container
|
||||||
|
privileged: true
|
||||||
|
network_mode: host
|
||||||
|
command: ["bash", "-c", "colcon build --symlink-install && source /ros2_ws/install/setup.bash && exec bash"]
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: 1
|
||||||
|
capabilities: [gpu]
|
||||||
|
volumes:
|
||||||
|
- ./:/ros2_ws
|
||||||
|
- /tmp/.X11-unix:/tmp/.X11-unix
|
||||||
|
- $XAUTHORITY:/root/.Xauthority
|
||||||
|
working_dir: /ros2_ws
|
||||||
|
environment:
|
||||||
|
QT_X11_NO_MITSHM: 1
|
||||||
|
DISPLAY: $DISPLAY
|
||||||
|
NVIDIA_VISIBLE_DEVICES: all
|
||||||
|
NVIDIA_DRIVER_CAPABILITIES: all
|
||||||
16
flake.lock
generated
16
flake.lock
generated
@@ -24,27 +24,27 @@
|
|||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1761810010,
|
"lastModified": 1770108954,
|
||||||
"narHash": "sha256-o0wJKW603SiOO373BTgeZaF6nDxegMA/cRrzSC2Cscg=",
|
"narHash": "sha256-VBj6bd4LPPSfsZJPa/UPPA92dOs6tmQo0XZKqfz/3W4=",
|
||||||
"owner": "lopsided98",
|
"owner": "lopsided98",
|
||||||
"repo": "nix-ros-overlay",
|
"repo": "nix-ros-overlay",
|
||||||
"rev": "e277df39e3bc6b372a5138c0bcf10198857c55ab",
|
"rev": "3d05d46451b376e128a1553e78b8870c75d7753a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "lopsided98",
|
"owner": "lopsided98",
|
||||||
"ref": "master",
|
"ref": "develop",
|
||||||
"repo": "nix-ros-overlay",
|
"repo": "nix-ros-overlay",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1744849697,
|
"lastModified": 1759381078,
|
||||||
"narHash": "sha256-S9hqvanPSeRu6R4cw0OhvH1rJ+4/s9xIban9C4ocM/0=",
|
"narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=",
|
||||||
"owner": "lopsided98",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6318f538166fef9f5118d8d78b9b43a04bb049e4",
|
"rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
10
flake.nix
10
flake.nix
@@ -2,7 +2,7 @@
|
|||||||
description = "Development environment for ASTRA Anchor";
|
description = "Development environment for ASTRA Anchor";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nix-ros-overlay.url = "github:lopsided98/nix-ros-overlay/master";
|
nix-ros-overlay.url = "github:lopsided98/nix-ros-overlay/develop";
|
||||||
nixpkgs.follows = "nix-ros-overlay/nixpkgs"; # IMPORTANT!!!
|
nixpkgs.follows = "nix-ros-overlay/nixpkgs"; # IMPORTANT!!!
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
name = "ASTRA Anchor";
|
name = "ASTRA Anchor";
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
colcon
|
colcon
|
||||||
(python312.withPackages (
|
(python313.withPackages (
|
||||||
p: with p; [
|
p: with p; [
|
||||||
pyserial
|
pyserial
|
||||||
pygame
|
pygame
|
||||||
@@ -56,10 +56,12 @@
|
|||||||
control-msgs
|
control-msgs
|
||||||
control-toolbox
|
control-toolbox
|
||||||
moveit-core
|
moveit-core
|
||||||
|
moveit-planners
|
||||||
moveit-common
|
moveit-common
|
||||||
moveit-msgs
|
moveit-msgs
|
||||||
moveit-ros-planning
|
moveit-ros-planning
|
||||||
moveit-ros-planning-interface
|
moveit-ros-planning-interface
|
||||||
|
moveit-ros-visualization
|
||||||
moveit-configs-utils
|
moveit-configs-utils
|
||||||
moveit-ros-move-group
|
moveit-ros-move-group
|
||||||
moveit-servo
|
moveit-servo
|
||||||
@@ -68,9 +70,9 @@
|
|||||||
pilz-industrial-motion-planner
|
pilz-industrial-motion-planner
|
||||||
pick-ik
|
pick-ik
|
||||||
ompl
|
ompl
|
||||||
chomp-motion-planner
|
|
||||||
joy
|
joy
|
||||||
# ros2-controllers nixpkg does not build :(
|
ros2-controllers
|
||||||
|
chomp-motion-planner
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class SerialRelay(Node):
|
|||||||
|
|
||||||
# Create subscribers
|
# Create subscribers
|
||||||
self.man_sub = self.create_subscription(
|
self.man_sub = self.create_subscription(
|
||||||
ArmManual, "/arm/control/manual", self.send_manual, 10
|
ArmManual, "/arm/control/manual", self.send_manual, 2
|
||||||
)
|
)
|
||||||
|
|
||||||
# New messages
|
# New messages
|
||||||
@@ -190,7 +190,7 @@ class SerialRelay(Node):
|
|||||||
|
|
||||||
command += f"can_relay_tovic,digit,39,{msg.effector_yaw},{msg.effector_roll}\n"
|
command += f"can_relay_tovic,digit,39,{msg.effector_yaw},{msg.effector_roll}\n"
|
||||||
|
|
||||||
# command += f"can_relay_tovic,digit,26,{msg.gripper}\n" # no hardware rn
|
command += f"can_relay_tovic,digit,26,{msg.gripper}\n" # no hardware rn
|
||||||
|
|
||||||
command += f"can_relay_tovic,digit,28,{msg.laser}\n"
|
command += f"can_relay_tovic,digit,28,{msg.laser}\n"
|
||||||
|
|
||||||
|
|||||||
Submodule src/astra_msgs updated: 6a57072723...2840bfef34
@@ -31,14 +31,14 @@ CORE_WHEEL_RADIUS = 0.171 # meters
|
|||||||
CORE_GEAR_RATIO = 100.0 # Clucky: 100:1, Testbed: 64:1
|
CORE_GEAR_RATIO = 100.0 # Clucky: 100:1, Testbed: 64:1
|
||||||
|
|
||||||
control_qos = qos.QoSProfile(
|
control_qos = qos.QoSProfile(
|
||||||
history=qos.QoSHistoryPolicy.KEEP_LAST,
|
# history=qos.QoSHistoryPolicy.KEEP_LAST,
|
||||||
depth=2,
|
depth=2,
|
||||||
reliability=qos.QoSReliabilityPolicy.BEST_EFFORT,
|
# reliability=qos.QoSReliabilityPolicy.BEST_EFFORT,
|
||||||
durability=qos.QoSDurabilityPolicy.VOLATILE,
|
# durability=qos.QoSDurabilityPolicy.VOLATILE,
|
||||||
deadline=Duration(seconds=1),
|
# deadline=Duration(seconds=1),
|
||||||
lifespan=Duration(nanoseconds=500_000_000), # 500ms
|
# lifespan=Duration(nanoseconds=500_000_000), # 500ms
|
||||||
liveliness=qos.QoSLivelinessPolicy.SYSTEM_DEFAULT,
|
# liveliness=qos.QoSLivelinessPolicy.SYSTEM_DEFAULT,
|
||||||
liveliness_lease_duration=Duration(seconds=5),
|
# liveliness_lease_duration=Duration(seconds=5),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Used to verify the length of an incoming VicCAN feedback message
|
# Used to verify the length of an incoming VicCAN feedback message
|
||||||
|
|||||||
@@ -35,14 +35,14 @@ ARM_STOP_MSG = ArmManual() # "
|
|||||||
BIO_STOP_MSG = BioControl() # "
|
BIO_STOP_MSG = BioControl() # "
|
||||||
|
|
||||||
control_qos = qos.QoSProfile(
|
control_qos = qos.QoSProfile(
|
||||||
history=qos.QoSHistoryPolicy.KEEP_LAST,
|
# history=qos.QoSHistoryPolicy.KEEP_LAST,
|
||||||
depth=2,
|
depth=2,
|
||||||
reliability=qos.QoSReliabilityPolicy.BEST_EFFORT,
|
# reliability=qos.QoSReliabilityPolicy.BEST_EFFORT,
|
||||||
durability=qos.QoSDurabilityPolicy.VOLATILE,
|
# durability=qos.QoSDurabilityPolicy.VOLATILE,
|
||||||
deadline=Duration(seconds=1),
|
# deadline=Duration(seconds=1),
|
||||||
lifespan=Duration(nanoseconds=500_000_000), # 500ms
|
# lifespan=Duration(nanoseconds=500_000_000), # 500ms
|
||||||
liveliness=qos.QoSLivelinessPolicy.SYSTEM_DEFAULT,
|
# liveliness=qos.QoSLivelinessPolicy.SYSTEM_DEFAULT,
|
||||||
liveliness_lease_duration=Duration(seconds=5),
|
# liveliness_lease_duration=Duration(seconds=5),
|
||||||
)
|
)
|
||||||
|
|
||||||
CORE_MODE = "twist" # "twist" or "duty"
|
CORE_MODE = "twist" # "twist" or "duty"
|
||||||
|
|||||||
@@ -43,16 +43,12 @@
|
|||||||
#include <control_msgs/msg/joint_jog.hpp>
|
#include <control_msgs/msg/joint_jog.hpp>
|
||||||
#include <std_srvs/srv/trigger.hpp>
|
#include <std_srvs/srv/trigger.hpp>
|
||||||
#include <moveit_msgs/msg/planning_scene.hpp>
|
#include <moveit_msgs/msg/planning_scene.hpp>
|
||||||
#include <rclcpp/client.hpp>
|
|
||||||
#include <rclcpp/experimental/buffers/intra_process_buffer.hpp>
|
|
||||||
#include <rclcpp/node.hpp>
|
#include <rclcpp/node.hpp>
|
||||||
#include <rclcpp/publisher.hpp>
|
#include <rclcpp/publisher.hpp>
|
||||||
#include <rclcpp/qos.hpp>
|
|
||||||
#include <rclcpp/qos_event.hpp>
|
|
||||||
#include <rclcpp/subscription.hpp>
|
#include <rclcpp/subscription.hpp>
|
||||||
|
#include <rclcpp/qos.hpp>
|
||||||
#include <rclcpp/time.hpp>
|
#include <rclcpp/time.hpp>
|
||||||
#include <rclcpp/utilities.hpp>
|
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
// We'll just set up parameters here
|
// We'll just set up parameters here
|
||||||
const std::string JOY_TOPIC = "/joy";
|
const std::string JOY_TOPIC = "/joy";
|
||||||
@@ -104,8 +100,9 @@ std::map<Button, double> BUTTON_DEFAULTS;
|
|||||||
* @return return true if you want to publish a Twist, false if you want to publish a JointJog
|
* @return return true if you want to publish a Twist, false if you want to publish a JointJog
|
||||||
*/
|
*/
|
||||||
bool convertJoyToCmd(const std::vector<float>& axes, const std::vector<int>& buttons,
|
bool convertJoyToCmd(const std::vector<float>& axes, const std::vector<int>& buttons,
|
||||||
std::unique_ptr<geometry_msgs::msg::TwistStamped>& twist,
|
std::unique_ptr<geometry_msgs::msg::TwistStamped>& twist
|
||||||
std::unique_ptr<control_msgs::msg::JointJog>& joint)
|
// std::unique_ptr<control_msgs::msg::JointJog>& joint
|
||||||
|
)
|
||||||
{
|
{
|
||||||
// // Give joint jogging priority because it is only buttons
|
// // Give joint jogging priority because it is only buttons
|
||||||
// // If any joint jog command is requested, we are only publishing joint commands
|
// // If any joint jog command is requested, we are only publishing joint commands
|
||||||
@@ -236,7 +233,7 @@ public:
|
|||||||
updateCmdFrame(frame_to_publish_, msg->buttons);
|
updateCmdFrame(frame_to_publish_, msg->buttons);
|
||||||
|
|
||||||
// Convert the joystick message to Twist or JointJog and publish
|
// Convert the joystick message to Twist or JointJog and publish
|
||||||
if (convertJoyToCmd(msg->axes, msg->buttons, twist_msg, joint_msg))
|
if (convertJoyToCmd(msg->axes, msg->buttons, twist_msg))
|
||||||
{
|
{
|
||||||
// publish the TwistStamped
|
// publish the TwistStamped
|
||||||
twist_msg->header.frame_id = frame_to_publish_;
|
twist_msg->header.frame_id = frame_to_publish_;
|
||||||
|
|||||||
Reference in New Issue
Block a user