Skip to content

Commit 0bb0cd5

Browse files
committed
update CI, cmakelists, package.xml, nodelets.xml, readme
1 parent 4911bc0 commit 0bb0cd5

File tree

5 files changed

+36
-145
lines changed

5 files changed

+36
-145
lines changed

.circleci/config.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ commands:
1010
git submodule sync --recursive && git submodule update --recursive --init
1111
apt-get update -qq
1212
source /opt/ros/*/setup.bash
13-
mkdir pacmod3 && mv `find -maxdepth 1 -not -name . -not -name pacmod3` pacmod3/
13+
mkdir pacmod4 && mv `find -maxdepth 1 -not -name . -not -name pacmod4` pacmod4/
1414
rosdep update && rosdep install --from-paths . --ignore-src -y
1515
cd ..
1616
catkin init
@@ -26,13 +26,13 @@ commands:
2626
# name: Lint
2727
# command: |
2828
# cd ..
29-
# catkin build pacmod3 --no-deps --make-args roslint
29+
# catkin build pacmod4 --no-deps --make-args roslint
3030
- run:
3131
name: Run Tests
3232
command: |
3333
source /opt/ros/*/setup.bash
3434
cd ..
35-
catkin run_tests --no-deps pacmod3
35+
catkin run_tests --no-deps pacmod4
3636
catkin_test_results
3737
3838
jobs:

CMakeLists.txt

+16-34
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 2.8.3)
2-
project(pacmod3)
2+
project(pacmod4)
33

44
add_definitions(-std=c++14)
55

@@ -10,7 +10,7 @@ set(catkin_deps
1010
nodelet
1111
roscpp
1212
std_msgs
13-
pacmod3_msgs
13+
pacmod4_msgs
1414
can_msgs
1515
)
1616

@@ -28,50 +28,32 @@ catkin_package(
2828

2929
include_directories(
3030
include
31-
pacmod3_common/include
31+
pacmod4_common/include
3232
${catkin_INCLUDE_DIRS}
3333
)
3434

3535
# Common Library
3636
add_compile_definitions(ROS_VERSION=$ENV{ROS_VERSION})
37-
add_library(pacmod3_common STATIC
38-
pacmod3_common/src/pacmod3_dbc_ros_api.cpp
39-
pacmod3_common/src/pacmod3_dbc3_ros_api.cpp
40-
pacmod3_common/src/pacmod3_dbc4_ros_api.cpp
41-
pacmod3_common/src/pacmod3_dbc5_ros_api.cpp
42-
pacmod3_common/src/pacmod3_dbc6_ros_api.cpp
43-
pacmod3_common/src/pacmod3_dbc7_ros_api.cpp
44-
pacmod3_common/src/pacmod3_dbc8_ros_api.cpp
45-
pacmod3_common/src/pacmod3_dbc9_ros_api.cpp
46-
pacmod3_common/src/pacmod3_dbc10_ros_api.cpp
47-
pacmod3_common/src/pacmod3_dbc11_ros_api.cpp
48-
pacmod3_common/src/pacmod3_dbc12_ros_api.cpp
49-
pacmod3_common/src/autogen/pacmod3.c
50-
pacmod3_common/src/autogen/pacmod4.c
51-
pacmod3_common/src/autogen/pacmod5.c
52-
pacmod3_common/src/autogen/pacmod6.c
53-
pacmod3_common/src/autogen/pacmod7.c
54-
pacmod3_common/src/autogen/pacmod8.c
55-
pacmod3_common/src/autogen/pacmod9.c
56-
pacmod3_common/src/autogen/pacmod10.c
57-
pacmod3_common/src/autogen/pacmod11.c
58-
pacmod3_common/src/autogen/pacmod12.c
37+
add_library(pacmod4_common STATIC
38+
pacmod4_common/src/pacmod4_dbc_ros_api.cpp
39+
pacmod4_common/src/pacmod4_dbc13_ros_api.cpp
40+
pacmod4_common/src/autogen/pacmod13.c
5941
)
6042

6143
# nodelets
6244
add_library(${PROJECT_NAME}_nodelet
63-
src/pacmod3_nodelet.cpp
64-
src/pacmod3_ros_msg_handler.cpp
45+
src/pacmod4_nodelet.cpp
46+
src/pacmod4_ros_msg_handler.cpp
6547
)
6648

6749
target_link_libraries(${PROJECT_NAME}_nodelet
68-
pacmod3_common
50+
pacmod4_common
6951
${catkin_LIBRARIES}
7052
)
7153

7254
# nodes
7355
add_executable(${PROJECT_NAME}_node
74-
src/pacmod3_node.cpp
56+
src/pacmod4_node.cpp
7557
)
7658

7759
target_link_libraries(${PROJECT_NAME}_node
@@ -81,11 +63,11 @@ target_link_libraries(${PROJECT_NAME}_node
8163
# TODO: Re-enable after auto-formatting
8264
# set(ROSLINT_CPP_OPTS "--filter=-build/include_subdir")
8365
# roslint_cpp(
84-
# src/pacmod3_node.cpp
85-
# src/pacmod3_nodelet.cpp
86-
# src/pacmod3_ros_msg_handler.cpp
87-
# include/pacmod3/pacmod3_nodelet.h
88-
# include/pacmod3/pacmod3_ros_msg_handler.h
66+
# src/pacmod4_node.cpp
67+
# src/pacmod4_nodelet.cpp
68+
# src/pacmod4_ros_msg_handler.cpp
69+
# include/pacmod4/pacmod3_nodelet.h
70+
# include/pacmod4/pacmod3_ros_msg_handler.h
8971
# )
9072

9173
install(TARGETS

README.md

+6-95
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
1-
# PACMod3 (Platform Actuation and Control MODule) ROS Driver #
1+
# PACMod4 (Platform Actuation and Control MODule) ROS Driver #
22

3-
[![CircleCI](https://circleci.com/gh/astuff/pacmod3/tree/ros1_master.svg?style=svg)](https://circleci.com/gh/astuff/pacmod3/tree/ros1_master)
3+
[![CircleCI](https://circleci.com/gh/astuff/pacmod4/tree/ros1_master.svg?style=svg)](https://circleci.com/gh/astuff/pacmod3/tree/ros1_master)
44

5-
This ROS node is designed to allow the user to control a vehicle (see SUPPORTED VEHICLES below) with the PACMod drive-by-wire system, board revision 3.
5+
This ROS node is designed to allow the user to control a vehicle with the PACMod drive-by-wire system.
66
The main purpose of the driver is to provide a common ROS API to PACMod devices regardless of vehicle type or specific PACMod version in use.
77

88
For access to the DBC file which defines the CAN interface for the PACMod, see the [pacmod_dbc](https://github.com/astuff/pacmod_dbc) repo.
99

1010
## Installation
1111

12-
Install pacmod3 using our debian repository:
12+
Install pacmod4 using our debian repository:
1313

1414
```sh
1515
sudo apt install apt-transport-https
1616
sudo sh -c 'echo "deb [trusted=yes] https://s3.amazonaws.com/autonomoustuff-repo/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/autonomoustuff-public.list'
1717
sudo apt update
18-
sudo apt install ros-$ROS_DISTRO-pacmod3
18+
sudo apt install ros-$ROS_DISTRO-pacmod4
1919
```
2020

21-
Note: Previously the pacmod3 driver was released via the ROS buildfarm.
22-
This has changed as of Ubuntu 20.04 (ROS2 Foxy and ROS1 Noetic) to keep old package versions available for download, which gives users greater control over their installed software and also allows downgrades if an upgrade breaks software dependencies.
23-
2421
## ROS API
2522

2623
The driver will automatically adapt the ROS API (published and subscribed topics) according to what data the PACMod system supports.
@@ -34,90 +31,4 @@ Please consult the PACMod user manual you received with your vehicle in order to
3431
- **kvaser_circuit_id**: The circuit/channel id that the PACMod is plugged into on the kvaser device, only applies if `use_kvaser` is true.
3532
- **use_socketcan**: Set this to true if Linux SocketCAN drivers are being used to connect to the PACMod. Defaults to `false`.
3633
- **socketcan_device**: The device id of the SocketCAN channel the PACMod is plugged into, only applies if `use_socketcan` is true.
37-
- **namespace**: The namespace of the PACMod driver, topics will be namespaced accordingly. Defaults to `pacmod`.
38-
39-
### Published Topics
40-
41-
Topics published on all platforms:
42-
43-
- `accel_rpt` ([pacmod3_msgs/SystemRptFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptFloat.msg))
44-
- `accel_aux_rpt` ([pacmod3_msgs/AccelAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/AccelAuxRpt.msg))
45-
- `brake_rpt` ([pacmod3_msgs/SystemRptFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptFloat.msg))
46-
- `brake_aux_rpt` ([pacmod3_msgs/BrakeAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/BrakeAuxRpt.msg))
47-
- `steering_rpt` ([pacmod3_msgs/SystemRptFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptFloat.msg))
48-
- `steering_aux_rpt` ([pacmod3_msgs/SteeringAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SteeringAuxRpt.msg))
49-
- `shift_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
50-
- `shift_aux_rpt` ([pacmod3_msgs/ShiftAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/ShiftAuxRpt.msg))
51-
- `turn_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
52-
- `turn_aux_rpt` ([pacmod3_msgs/TurnAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/TurnAuxRpt.msg))
53-
- `vehicle_speed_rpt` ([pacmod3_msgs/VehicleSpeedRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/VehicleSpeedRpt.msg))
54-
- `vin_rpt` ([pacmod3_msgs/VinRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/VinRpt.msg))
55-
- `global_rpt` ([pacmod3_msgs/GlobalRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/GlobalRpt.msg))
56-
- `component_rpt_00` ([pacmod3_msgs/ComponentRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/ComponentRpt.msg))
57-
- `component_rpt_01` ([pacmod3_msgs/ComponentRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/ComponentRpt.msg))
58-
- `component_rpt_02` ([pacmod3_msgs/ComponentRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/ComponentRpt.msg))
59-
- `all_system_statuses` ([pacmod3_msgs/AllSystemStatuses](https://github.com/astuff/pacmod3_msgs/blob/master/msg/AllSystemStatuses.msg))
60-
- `can_rx` ([can_msgs/Frame](http://docs.ros.org/en/noetic/api/can_msgs/html/msg/Frame.html))
61-
62-
Topics published on supported platforms only:
63-
64-
- `brake_motor_rpt_1` ([pacmod3_msgs/MotorRpt1](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt1.msg))
65-
- `brake_motor_rpt_2` ([pacmod3_msgs/MotorRpt2](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt2.msg))
66-
- `brake_motor_rpt_3` ([pacmod3_msgs/MotorRpt3](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt3.msg))
67-
- `cruise_control_buttons_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
68-
- `date_time_rpt` ([pacmod3_msgs/DateTimeRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/DateTimeRpt.msg))
69-
- `detected_object_rpt` ([pacmod3_msgs/DetectedObjectRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/DetectedObjectRpt.msg))
70-
- `door_rpt` ([pacmod3_msgs/DoorRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/DoorRpt.msg))
71-
- `estop_rpt` ([pacmod3_msgs/EStopRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/EStopRpt.msg))
72-
- `global_rpt_2` ([pacmod3_msgs/GlobalRpt2](https://github.com/astuff/pacmod3_msgs/blob/master/msg/GlobalRpt2.msg))
73-
- `engine_brake_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
74-
- `hazard_lights_rpt` ([pacmod3_msgs/SystemRptBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptBool.msg))
75-
- `headlight_aux_rpt` ([pacmod3_msgs/HeadlightAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/HeadlightAuxRpt.msg))
76-
- `headlight_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
77-
- `horn_rpt` ([pacmod3_msgs/SystemRptBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptBool.msg))
78-
- `interior_lights_rpt` ([pacmod3_msgs/InteriorLightsRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/InteriorLightsRpt.msg))
79-
- `lat_lon_heading_rpt` ([pacmod3_msgs/LatLonHeadingRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/LatLonHeadingRpt.msg))
80-
- `marker_lamp_rpt` ([pacmod3_msgs/SystemRptBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptBool.msg))
81-
- `occupancy_rpt` ([pacmod3_msgs/OccupancyRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/OccupancyRpt.msg))
82-
- `parking_brake_rpt` ([pacmod3_msgs/SystemRptBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptBool.msg))
83-
- `rear_lights_rpt` ([pacmod3_msgs/RearLightsRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/RearLightsRpt.msg))
84-
- `sprayer_rpt` ([pacmod3_msgs/SystemRptBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptBool.msg))
85-
- `steering_motor_rpt_1` ([pacmod3_msgs/MotorRpt1](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt1.msg))
86-
- `steering_motor_rpt_2` ([pacmod3_msgs/MotorRpt2](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt2.msg))
87-
- `steering_motor_rpt_3` ([pacmod3_msgs/MotorRpt3](https://github.com/astuff/pacmod3_msgs/blob/master/msg/MotorRpt3.msg))
88-
- `vehicle_dynamics_rpt` ([pacmod3_msgs/VehicleDynamicsRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/VehicleDynamicsRpt.msg))
89-
- `wheel_speed_rpt` ([pacmod3_msgs/WheelSpeedRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/WheelSpeedRpt.msg))
90-
- `wiper_aux_rpt` ([pacmod3_msgs/WiperAuxRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/WiperAuxRpt.msg))
91-
- `wiper_rpt` ([pacmod3_msgs/SystemRptInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemRptInt.msg))
92-
- `yaw_rate_rpt` ([pacmod3_msgs/YawRateRpt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/YawRateRpt.msg))
93-
94-
### Subscribed Topics
95-
96-
Topics subscribed on all platforms:
97-
98-
- `accel_cmd` ([pacmod3_msgs/SystemCmdFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdFloat.msg))
99-
- `brake_cmd` ([pacmod3_msgs/SystemCmdFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdFloat.msg))
100-
- `steering_cmd` ([pacmod3_msgs/SystemCmdFloat](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdFloat.msg))
101-
- `shift_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
102-
- `turn_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
103-
- `can_tx` ([can_msgs/Frame](http://docs.ros.org/en/noetic/api/can_msgs/html/msg/Frame.html))
104-
105-
Topics subscribed on supported platforms only:
106-
107-
- `cruise_control_buttons_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
108-
- `engine_brake_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
109-
- `hazard_lights_cmd` ([pacmod3_msgs/SystemCmdBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdBool.msg))
110-
- `headlight_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
111-
- `horn_cmd` ([pacmod3_msgs/SystemCmdBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdBool.msg))
112-
- `marker_lamp_cmd` ([pacmod3_msgs/SystemCmdBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdBool.msg))
113-
- `rear_pass_door_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
114-
- `sprayer_cmd` ([pacmod3_msgs/SystemCmdBool](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdBool.msg))
115-
- `wiper_cmd` ([pacmod3_msgs/SystemCmdInt](https://github.com/astuff/pacmod3_msgs/blob/master/msg/SystemCmdInt.msg))
116-
117-
## Supported Vehicles ##
118-
119-
At the moment, this pacmod3 driver supports DBC versions 3 through 12 for a core set of common messages.
120-
This means not all vehicle-specific CAN messages are currently supported.
121-
If you need a specific CAN message to be supported please open an issue [here](https://github.com/astuff/pacmod3/issues).
122-
123-
If you are unsure about which DBC version your existing PACMod supports, please reach out to our support team: https://autonomoustuff.com/support
34+
- **namespace**: The namespace of the PACMod driver, topics will be namespaced accordingly. Defaults to `pacmod`.

nodelets.xml

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<library path="lib/libpacmod3_nodelet">
2-
<class name="pacmod3/pacmod3_nodelet"
3-
type="pacmod3::Pacmod3Nl"
1+
<library path="lib/libpacmod4_nodelet">
2+
<class name="pacmod4/pacmod4_nodelet"
3+
type="pacmod4::Pacmod4Nl"
44
base_class_type="nodelet::Nodelet">
55
<description>
6-
Pacmod3 ROS Driver
6+
Pacmod4 ROS Driver
77
</description>
88
</class>
99
</library>

package.xml

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
<?xml version="1.0"?>
22
<package format="2">
3-
<name>pacmod3</name>
4-
<version>2.2.2</version>
5-
<description>AutonomouStuff PACMod v3 Driver Package</description>
3+
<name>pacmod4</name>
4+
<version>1.0.0</version>
5+
<description>AutonomouStuff PACMod v4 Driver Package</description>
66
<license>MIT</license>
77

8-
<url type="website">http://wiki.ros.org/pacmod3</url>
9-
<url type="repository">https://github.com/astuff/pacmod3</url>
10-
<url type="bugtracker">https://github.com/astuff/pacmod3/issues</url>
8+
<url type="website">http://wiki.ros.org/pacmod4</url>
9+
<url type="repository">https://github.com/astuff/pacmod4</url>
10+
<url type="bugtracker">https://github.com/astuff/pacmod4/issues</url>
1111

1212
<maintainer email="[email protected]">AutonomouStuff Software Team</maintainer>
13-
<author email="[email protected]">Joe Driscoll</author>
14-
<author email="[email protected]">Josh Whitley</author>
1513

1614
<buildtool_depend>catkin</buildtool_depend>
1715

@@ -20,7 +18,7 @@
2018
<depend>nodelet</depend>
2119
<depend>roscpp</depend>
2220
<depend>std_msgs</depend>
23-
<depend version_gte="1.0.0" version_lt="1.1.0">pacmod3_msgs</depend>
21+
<depend version_eq="1.0.0">pacmod4_msgs</depend>
2422
<depend>can_msgs</depend>
2523

2624
<export>

0 commit comments

Comments
 (0)